В процессе изучения tinyos я обнаружил, что совершенно не разбираюсь в make-файлах.
Есть много необязательных функций времени компиляции, которые можно использовать путем объявления переменных препроцессора.
Чтобы использовать их, вам нужно сделать что-то вроде:
CFLAGS = "-DPACKET_LINK" включает определенную функцию.
и
CFLAGS = "-DPACKET_LINK" "-DLOW_POWER" поддерживает две функции.
Может ли кто-нибудь разрезать мне эти строки и рассказать, что происходит? Не с точки зрения крошечных файлов, а с точки зрения make-файлов!





Где-то в make-файле CFLAG будет использоваться в строке компиляции, например: $(CC) $(CFLAGS) $(C_INCLUDES) $<
и в конечном итоге при исполнении будет переведено на:
gcc -DPACKET_LINK -DLOW_POWER -c filename.c -o filename.o
Это определение будет передано в исходный код, как это было определено в файле заголовка.
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...
Я проверил с документами gcc, и вы правы @Simon. Обновил мой ответ
-D означает как минимум определять (в gcc), что позволяет #define в командной строке, а не где-нибудь в файле. Обычно можно увидеть -DDEBUG или -DNDEBUG, которые соответственно активируют или отключают отладочный код.
Параметр -D устанавливает переменные препроцессора, поэтому в вашем случае будет скомпилирован весь код, который находится в указанных блоках "#ifdef / #endif".
Т.е.
#ifdef PACKET_LINK
/* whatever code here */
#endif
CFLAGS - это переменная, используемая в make-файле, которая будет расширена до своего содержимого при вызове компилятора.
Например.
gcc $(CFLAGS) source.c
Просто для полноты: если вы используете утилиту Microsoft nmake, вы можете не увидеть макрос $ (CFLAGS), используемый в make-файле, потому что nmake имеет некоторые значения по умолчанию для таких вещей, как компиляция файлов C / 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 $<
-DPACKET_LINKэквивалентен#define PACKET_LINK 1. Если вам нужен#define PACKET_LINK, вам следует использовать-DPACKET_LINK=