У меня есть одна проблема. Я не могу установить несколько переменных в зависимости от цели. Мне нужно установить две переменные, например, если makefile был запущен с опцией cpp (target), должны быть установлены две переменные, но я получаю только одну переменную (CC). Но другой остается по умолчанию.
cpp:EXTENSION=cpp
cpp:CC=g++
cpp:COMPILE
Пожалуйста, помогите с этой проблемой.
Я не могу установить несколько переменных в зависимости от цели.
В GNU Make это обычно достигается путем анализа содержимого переменной $(MAKECMDGOALS)
а затем установки переменных в зависимости от заданных целей.
Например, Makefile:
ifeq ($(filter cpp,$(MAKECMDGOALS)),cpp)
MSG=make cpp was called!
endif
ifeq ($(filter notcpp,$(MAKECMDGOALS)),notcpp)
MSG=make notcpp was called!
endif
all:
@echo possible targets: cpp, notcpp; false
notcpp cpp:
@echo $(MSG)
Запуск make cpp
будет печатать, make cpp was called!
,
Запуск make notcpp
напечатал бы make notcpp was called!
,
(Объяснение функции ifeq ($(filter cpp,$(MAKECMDGOALS)),cpp)
. Функция $(filter)
ищет в списке слово (первый аргумент, cpp
) (второй аргумент, $(MAKECMDGOALS)
). Если он находит это слово, он возвращает его, в противном случае он возвращает пустую строку. Затем ifeq
сравнивает результат функции $(filter)
с искомым словом: если он равен, то блок til endif
анализируется/выполняется., можно написать ifneq ($(filter cpp,$(MAKECMDGOALS)),)
чтобы проверить, что результат $(filter)
не является пустой строкой. Для получения дополнительной информации см. $(filter)
и ifeq
в GNU Сделайте документацию. Кроме того, о синтаксисе общих функций и о том, как вызвать пользовательскую функцию.)
Другая возможность - использование нескольких Make файлов. В основном Makefile, в зависимости от цели, вы передаете элемент управления целевому Makefile, например:
cpp notcpp:
$(MAKE) -f Makefile.$@ all
Использование целевых конкретных включает в себя также является популярным вариантом.
make -v
.) И минимальный полный make-файл может сэкономить нам некоторое время.