Как установить несколько переменных в целевой make-файл

0

У меня есть одна проблема. Я не могу установить несколько переменных в зависимости от цели. Мне нужно установить две переменные, например, если makefile был запущен с опцией cpp (target), должны быть установлены две переменные, но я получаю только одну переменную (CC). Но другой остается по умолчанию.

cpp:EXTENSION=cpp
cpp:CC=g++
cpp:COMPILE

Пожалуйста, помогите с этой проблемой.

  • 1
    Я не могу воспроизвести вашу ошибку. Какую версию Make вы используете? (Если вы не уверены, попробуйте make -v .) И минимальный полный make-файл может сэкономить нам некоторое время.
  • 0
    Этот cpp: COMPILE - это не определение переменной, а определение цели в моем GNU make и make с жалобами на отсутствие целевого COMPILE. Если я оставлю это, все работает как положено
Показать ещё 1 комментарий
Теги:
makefile

1 ответ

1
Лучший ответ

Я не могу установить несколько переменных в зависимости от цели.

В 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

Использование целевых конкретных включает в себя также является популярным вариантом.

  • 0
    Thx, работает как шарм, не могли бы вы объяснить эту строку $ (filter cpp, $ (MAKECMDGOALS)), cpp)
  • 0
    Обновленный ответ с объяснением.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню