У меня есть файл 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, похоже, продолжает работать.
Это можно сделать, используя переменную 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)
Проблема в том, что это:
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. Вы можете автоматически генерировать включенные файлы. Вы можете определить некоторые переменные, а затем использовать вторичное расширение. Существует много способов сделать это.
Вы просто не можете сделать это с целевыми переменными в списке предварительных условий.
Отбросьте :
из строки CONFIG_FILES := …
. Это заставляет make
оценивать CONFIG_FILES
в этой точке файла makefile и не имеет контекста цели (all
или debug
), чтобы он мог предоставить значение для $(CONFIG)
, поэтому он не обеспечивает один, что приводит к ошибке, которую вы видите.
Использование:
CONFIG_FILES = $(shell python parse_config.py -i $(CONFIG))
make all SHELL+=-x
.
Вы не можете использовать целевые переменные и простое присваивание вместе. Вы говорите make, чтобы запустить команду оболочки во время выполнения синтаксического разбора, но также сообщать ей, чтобы установить содержимое переменной $(CONFIG)
во время определенных целевых контекстов.
Вы можете либо использовать рекурсивную переменную (и запускать команду оболочки один раз для каждого использования переменной), либо вставлять CONFIG_FILES
назначения в каждый целевой контекст вместе с CONFIG
.
recursive variable
?
=
присваивание - это recursively expanded variable
в терминах make по сравнению с simply expanded variable
, которой присваивается :=
.
parse_config.py
предоставляет список файлов. Как я могу использовать этот список в качестве предварительного условия тогда? любая идея?recursive make invocation
который решает это?