Я обычно передаю определения макросов из «make command line» в «makefile», используя параметр: -Dname = value. Определение доступно внутри make-файла.
Я также передаю определения макросов из «makefile» в «исходный код», используя аналогичный параметр компилятора: -Dname = value (поддерживается во многих компиляторах). Это определение доступно в исходном коде.
Что мне сейчас нужно, так это позволить пользователю моего make-файла сразу передавать произвольные макроопределения из "командной строки make.exe" в "исходный код" без необходимости изменять что-либо в make-файле.
поэтому пользователь может ввести: make -f mymakefile.mk -SOMEOPTION var = 5
тогда непосредственно код main.c может увидеть var:
int main()
{
int i = var;
}
Ответы:
Вызовите
make
команду так:И обязательно используйте
$(CFLAGS)
команду компиляции в Makefile. Как упоминалось в @ jørgensen, присвоение переменной послеmake
команды переопределитCFLAGS
значение, уже определенное в Makefile.В качестве альтернативы вы можете установить
-Dvar=42
другую переменную,CFLAGS
а затем повторно использовать эту переменную,CFLAGS
чтобы избежать полного переопределенияCFLAGS
.источник
$(CFLAGS)
должно быть последним, так что любые параметры, указанные пользователем, переопределят все, что Makefile устанавливает внутри. Это означало бы использовать, напримерlocal_CFLAGS = -Wall $(CFLAGS)
. И наоборот, если есть что-то, что вы действительно хотите иметь приоритет, поместите это после$(CFLAGS)
, как в комментарии @MadScientist.CFLAGS="-Dvar1=42 -Dvar2=314"
CPPFLAGS
может быть лучше, чемCFLAGS
илиCXXFLAGS
: stackoverflow.com/a/53527858/2278206Просто используйте для этого конкретную переменную.
источник
Вызов сделать этот путь
потому что вы действительно хотите переопределить CFLAGS вашего Makefile, а не только среду (которая имеет более низкий приоритет по отношению к переменным Makefile).
источник
Из-за низкой репутации я не могу комментировать принятый ответ.
Я хотел бы упомянуть предопределенную переменную
CPPFLAGS
. Это может быть лучше, чемCFLAGS
илиCXXFLAGS
, поскольку оно описано в руководстве GNU Make как:Примеры встроенных неявных правил, использующих
CPPFLAGS
n.o
производится автоматическиn.c
по рецепту формы:$(CC) $(CPPFLAGS) $(CFLAGS) -c
n.o
производится автоматически изn.cc
,n.cpp
илиn.C
по рецепту формы:$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c
Можно использовать команду
make CPPFLAGS=-Dvar=123
для определения желаемого макроса.Больше информации
источник
источник
Найдите файл C и реализацию Makefile ниже, чтобы удовлетворить ваши требования.
foo.c
Makefile
источник