Я использую GNU make для компиляции своего кода C ++, и я хотел бы понять, как сделать мои компиляции настраиваемыми.
Я читал в разных местах, что CFLAGS
, CCFLAGS
и CXXFLAGS
используются для этой цели.Так как я должен их использовать?Если у меня есть дополнительные аргументы командной строки для компилятора, я должен добавить их к CFLAGS
или добавить их?Существует ли распространенная практика?
Почему три разные переменные?Я полагаю, что компилятор C должен получить CFLAGS
и CCFLAGS
, а компилятор C ++ должен получить CFLAGS
и CXXFLAGS
- правильно ли я понял?
Должен ли пользователь-человек устанавливать эти переменныесовсем?Устанавливают ли их автоматические инструменты (automake
, autoconf
и т. Д.)?Система Linux, которую я должен использовать, не определяет ни одну из этих переменных - это типично?
В настоящее время мой Makefile выглядит следующим образом, и я чувствую, что он немного грязный:
ifdef code_coverage
GCOV_FLAG := -fprofile-arcs -ftest-coverage
else
GCOV_FLAG :=
endif
WFLAGS := -Wall
INC_FLAGS := -Istuff -Imore_stuff -Ietc
CCFLAGSINT := -O3 $(WFLAGS) $(INC_FLAGS) $(CCFLAGS)
... (somewhere in the makefile, the command-line for compilation looks like this)
$(CC) $(CCFLAGSINT) -c $< -o $@
... (somewhere in the makefile, the command-line for linking looks like this)
$(CC) $(GCOV_FLAG) $(CCFLAGSINT) $(OBJLIST) $(LDFLAGS) -o $@
Я почти уверен, что здесь нет ошибок;Makefile работает очень хорошо.Но есть ли что-то, что противоречит соглашениям (например, CCFLAGSINT
- нужно ли просто перезаписать CCFLAGS
вместо этого? Или CXXFLAGS
? FUD!)
Извините за столько вопросов;Вы, очевидно, не будете отвечать на них все, но я надеюсь, что ответы помогут мне понять общую идею этих настроек.