Makefiles CFLAGS
В процессе изучения tinyos я обнаружил, что я абсолютно не знаю о make файлах.
Существует много дополнительных возможностей компиляции, которые могут быть использованы путем объявления препроцессорных переменных.
Чтобы использовать их, вы должны делать такие вещи, как:
CFLAGS="-DPACKET_LINK"
это позволяет использовать определенную функцию.
и
CFLAGS="-DPACKET_LINK" "-DLOW_POWER"
позволяет использовать две функции.
Может ли кто-нибудь проанализировать эти строки для меня и рассказать мне, что происходит? Не в терминах tinyos, а в плане make файлов!
Ответы
Ответ 1
CFLAGS - это переменная, которая чаще всего используется для добавления аргументов в компилятор. В этом случае он определяет макросы.
Итак, -DPACKET_LINK
является эквивалентом размещения #define PACKET_LINK 1
в верхней части всех файлов .c и .h в вашем проекте. Скорее всего, у вас есть код внутри вашего проекта, который выглядит, если эти макросы определены и что-то делают в зависимости от этого:
#ifdef PACKET_LINK
// This code will be ignored if PACKET_LINK is not defined
do_packet_link_stuff();
#endif
#ifdef LOW_POWER
// This code will be ignored if LOW_POWER is not defined
handle_powersaving_functions();
#endif
Если вы посмотрите дальше в своем make файле, вы должны увидеть, что $(CFLAGS)
, вероятно, используется как:
$(CC) $(CFLAGS) ...some-more-arguments...
Ответ 2
Где-то в make файле CFLAG будет использоваться в строке компиляции следующим образом:
$(CC) $(CFLAGS) $(C_INCLUDES) $<
и, в конечном итоге, выполнение будет переведено на:
gcc -DPACKET_LINK -DLOW_POWER -c filename.c -o filename.o
Этот параметр будет передан исходному коду, как он был указан в файле заголовка
Ответ 3
Параметр -D задает переменные препроцессора, поэтому в вашем случае будет скомпилирован весь код, который находится в указанных "#ifdef/#endif" блоках.
т.е.
#ifdef PACKET_LINK
/* whatever code here */
#endif
CFLAGS - это переменная, используемая в make файле, которая будет расширена до ее содержимого при вызове компилятора.
например.
gcc $(CFLAGS) source.c
Ответ 4
-D обозначает, по крайней мере, определение (в gcc), которое позволяет #define в командной строке вместо файла где-нибудь. Общим для просмотра было бы -DDEBUG или -DNDEBUG, которые соответственно активируют или отключают отладочный код.
Ответ 5
Просто для полноты в этом - если вы используете утилиту Microsoft nmake, вы, возможно, не увидите макрос $(CFLAGS), используемый в make файле, потому что nmake имеет некоторые значения по умолчанию для таких вещей, как компиляция файлов C/С++. Среди прочего, предварительно определены в nmake (я не уверен, что GNU Make делает что-то подобное), поэтому вы можете не видеть его в рабочем файле make в Windows:
.c.exe:
commands: $(CC) $(CFLAGS) $<
.c.obj:
commands: $(CC) $(CFLAGS) /c $<
.cpp.exe:
commands: $(CXX) $(CXXFLAGS) $<
.cpp.obj:
commands: $(CXX) $(CXXFLAGS) /c $<
Ответ 6
Я обнаружил, что Ask Mr. Make - отличная ссылка на подсказки Makefile.
http://www.cmcrossroads.com/content/category/8/147/268/