Использовать переменную make во встроенной функции оболочки в Makefile

1

У меня есть файл make

all : CONFIG=config.ini
debug : CONFIG=config-debug.ini

CONFIG_FILES := $(shell python parse_config.py -i $(CONFIG))

all: $(CONFIG) $(CONFIG_FILES)
    echo $(CONFIG) $(CONFIG_FILES)

Когда я запускаю make all, он показывает некоторую ошибку python, говорящую, что параметр -i отсутствует. Таким образом, кажется, что $(CONFIG) не выполняет функцию shell.

Как make all вызывать python parse_config.py -i 'config.ini'?

так же make debug invoke python parse_config.py -i 'config-debug.ini'?

Обновление

После запуска make all SHELL+=-x я получаю следующий вывод.

+ python parse_config.py -p static -i
usage: parse_config.py [-h] -i INPUT_JSB3 [-p PREFIX]
parse_config.py: error: argument -i: expected one argument

Но после этого я получаю

+ python parse_config.py -p static -i static/config.ini

И make, похоже, продолжает работать.

Теги:
makefile
build

4 ответа

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

Это можно сделать, используя переменную MAKECMDGOALS.

ifeq ($(findstring debug,$(MAKECMDGOALS)),debug)
CONFIG=config-debug.ini
else
CONFIG=config.ini
endif

CONFIG_FILES := $(shell python parse_config.py -i $(CONFIG))

all: $(CONFIG) $(CONFIG_FILES)
    echo $(CONFIG) $(CONFIG_FILES)
1

Проблема в том, что это:

all : CONFIG=config.ini

all: $(CONFIG) $(CONFIG_FILES)
        ...

не будет работать. Значение целевых переменных доступно только внутри рецепта. Вы не можете использовать целевые переменные в качестве предварительных условий. Это также почему он не установлен в переменной $(CONFIG_FILES), когда вы используете его в списке предварительных условий.

ETA:

Вы можете сделать что-то вроде этого:

CONFIG_FILES = $1 $(shell python parse_config.py -i $1)

all: $(call CONFIG_FILES,config.ini)
debug: $(call CONFIG_FILES,config-debug.ini)

возможно. Вы можете написать это явно. Вы можете запустить recursive make invocation, переопределяя CONFIG_FILES. Вы можете автоматически генерировать включенные файлы. Вы можете определить некоторые переменные, а затем использовать вторичное расширение. Существует много способов сделать это.

Вы просто не можете сделать это с целевыми переменными в списке предварительных условий.

  • 0
    parse_config.py предоставляет список файлов. Как я могу использовать этот список в качестве предварительного условия тогда? любая идея?
  • 0
    Любой пример recursive make invocation который решает это?
0

Отбросьте : из строки CONFIG_FILES := …. Это заставляет make оценивать CONFIG_FILES в этой точке файла makefile и не имеет контекста цели (all или debug), чтобы он мог предоставить значение для $(CONFIG), поэтому он не обеспечивает один, что приводит к ошибке, которую вы видите.

Использование:

CONFIG_FILES = $(shell python parse_config.py -i $(CONFIG))
  • 0
    Это не работает Тем не менее я получаю ту же ошибку.
  • 0
    Это должно сработать (и это то, что я говорил в своем ответе). Добавьте отредактированный make-файл к вопросу и дайте нам точный вывод make. Также вывод make all SHELL+=-x .
Показать ещё 2 комментария
0

Вы не можете использовать целевые переменные и простое присваивание вместе. Вы говорите make, чтобы запустить команду оболочки во время выполнения синтаксического разбора, но также сообщать ей, чтобы установить содержимое переменной $(CONFIG) во время определенных целевых контекстов.

Вы можете либо использовать рекурсивную переменную (и запускать команду оболочки один раз для каждого использования переменной), либо вставлять CONFIG_FILES назначения в каждый целевой контекст вместе с CONFIG.

  • 0
    Любой пример о recursive variable ?
  • 0
    Нормальное = присваивание - это recursively expanded variable в терминах make по сравнению с simply expanded variable , которой присваивается := .
Показать ещё 1 комментарий

Ещё вопросы

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