2014-01-09 1 views
1

У меня есть этот грим файлИспользование сделать переменное в встроено функции оболочки в Makefile

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 он показывает некоторые ошибки питона говоря -i вариант паров отсутствуют. Так кажется $(CONFIG) не проходит shell функция.

Как можно использовать make all invoke python parse_config.py -i 'config.ini'?

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

Update:

После запуска 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 

И сделать, кажется, продолжает работать.

ответ

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) 
0

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

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

+0

любой пример о 'рекурсивной переменной'? –

+0

Нормальное '=' назначение - это 'рекурсивно расширенная переменная' в терминах make по сравнению с' просто расширенной переменной', которая присваивается ': ='. –

+0

Ну, использование '=' только не меняет поведения. –

0

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

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

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

Это не работает. Тем не менее, я получаю ту же ошибку. –

+0

Это должно работать (и это то, что я говорил в своем ответе). Добавьте отредактированный файл makefile к вопросу, пожалуйста, и дайте нам точный вывод. Также вывод из 'make all SHELL + = - x'. –

+0

Я обновил свой вопрос. –

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', который решает это? –

Смежные вопросы