2016-07-19 4 views
1

У меня есть простой Makefile, чтобы помочь мне собрать несколько примеров:Сделать простой Makefile общий

ex104: ex104.cpp 
     $(CPP) ex104.cpp $(INCS) $(LINKFLAGS) $(COMPILEFLAGS) -o ex104 

    clean: 
     rm -f *.o $(EXECUTABLE) 

Теперь, это работает отлично. Проблема в том, я должен был бы явно написать правило для каждого из примеров, таким образом, копируя следующую строку много, много раз:

ex104: ex104.cpp 
     $(CPP) ex104.cpp $(INCS) $(LINKFLAGS) $(COMPILEFLAGS) -o ex104 

Есть ли способ родовым-Изе это немного? Так что я бы в конечном итоге с помощью командной строки, как показано ниже, что будет строить ex252 из ex252.cpp построен автоматически:

make ex252 

К счастью, это шаблон только библиотека, поэтому я всегда строить с помощью только одного CPP файла, и Мне не нужно отслеживать объектные файлы.

+0

Возможный дубликат [Передача дополнительных переменных из командной строки для создания] (http://stackoverflow.com/questions/2826029/passing-additional-variables-from-command-line-to-make) – taskinoor

+2

Вы пробовали ' сделать ex252'? Нет, нет, я могу сказать ... ;-) Прочитайте [неявные правила] (https://www.gnu.org/software/make/manual/html_node/Catalogue-of-Rules.html#Catalogue -of-правил). – DevSolar

+0

Это интересно. У меня не было представления, что эта функция существует. Поэтому я бы просто дал стандартные имена переменным для компилятора и флагов, и make сделал бы для меня все остальное? – Michael

ответ

2

Если я правильно понимаю ваш вопрос, вы ищете что-то вроде pattern rules. Если это верно, то это Makefile должен составлять каждый файл CPP в каталоге (взятый из here):

%.o : %.cpp 
     $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o [email protected] 
+0

Возможно, вам нужны CXXFLAGS, а также CPPFLAGS, так как вы не только вызываете препроцессор. –

3

Может быть что-то вроде:

%: %.cpp 
    $(CXX) $< $(INCS) $(LINKFLAGS) $(COMPILEFLAGS) -o [email protected] 

Для получения более подробной информации о $< и [email protected] взглянуть на automatic variables.

+0

Зачем создавать свои собственные имена переменных вместо обычных, таких как 'CPPFLAGS'? –

+0

@JonathanWakely было повторное использование исходных имен переменных, что позволило упростить визуальное «сопоставление шаблонов» (и прямой путь обновления от старого Makefile). Действительно, вы правы, обычные имена должны быть предпочтительными. – manlio

+0

О да, я этого не заметил, извините :) –

5

У Make есть куча правил по умолчанию, и то, что вы хотите, должно работать, если вместо ваших переменных вы используете значение по умолчанию для флагов.

Если ваша версия марки не имеет такой дефолт, это должно добавить один (он соответствует GNU сделать правило по умолчанию с некоторыми посредническими переменными встраиваемыми и устаревшие один удалены):

.cpp: 
    $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o [email protected] 

CXX является компилятор C++

CXXFLAGS это флаги для C++ компилятор

CPPFLAGS является флаги препроцессора (они являются общими между C и C++ в GNU Make)

LDFLAGS являются флагами для связывания

TARGET_ARCH позволяет указать целевую архитектуру

LDLIBS является библиотека связать

1

Как @AProgrammer сказал, использовать встроенные правила. Я просто хочу расширить это.

Вы можете найти встроенные правила и флаги, используя рекурсивно grepping make database database. make -pq | grep %:, чтобы получить список правил, которые могут создать исполняемый файл, и make -pq | grep '%: %.cpp' -A5, чтобы увидеть фактическую команду, которую он выполняет.

В вашем случае, буквально весь Makefile может выглядеть следующим образом:

all: ex104 

Пока ex104 требуется цель по умолчанию и ex104.cpp существует, %: %.cpp встроенное правило будет выбран. Вы можете основываться на этом. Добавьте дополнительные зависимости и флаги.

CXXFLAGS += -Wall -Wextra -Wpedantic -std=c++14 
all: ex104 
ex104: common_utils.cpp 

PS: В случае, когда CPP ссылается на предварительный процессор C, а не на C++.

Смежные вопросы