2013-05-23 3 views
13

У меня есть GNU Makefile (версия 3.81), которая выглядит следующим образом:Проверяется переменные определены в Makefile

.PHONY: SPOneDot 

SPOneDot: 
    ifndef X 
    X=0.05 
    $$(info X undefined, changed to $X) 
    endif 
    ifndef Y 
    Y=0.05 
    $$(info Y undefined, changed to $Y) 
    endif 
    python ./Submit3DSP.py -f OneDot.qdt -x $(X) -y $(Y) 

исполняю с помощью следующей командной строки: make X=0.1 Y=0.1 SPOneDot, но я получаю следующий результат:

ifndef X 
make: ifndef: Command not found 
make: *** [SPOneDot] Error 127 

Я смотрел в makefile documentation и видел others use it. Любая помощь приветствуется, это, вероятно, что-то глупое.

+0

Что это за конструкция? GNU сделать? BSD? POSIX? – Jens

+0

GNU Make версия 3.81 используется здесь. –

ответ

18

Скорее всего, ваши директивы make не должны иметь вкладку с отступом, но начать с первой колонки. Я также подозреваю, что вы хотите .if(...) или аналогичные, а не просто ifdef. Трудно сказать, не зная, какую реализацию вы используете make.

В GNU make, условные детали используются, например. например

ifeq ($(CC),gcc) 
     $(CC) -o foo $(objects) $(libs_for_gcc) 
else 
     $(CC) -o foo $(objects) $(normal_libs) 
endif 

GNU make manual содержит все данные.

Если вы действительно имели в виду, чтобы протестировать окружающую среду переменную (в отличие от сделать переменную), а затем просто сделать это в командах:

SPOneDot: 
    if test -z "$$X"; then X=0.05; echo "X undefined, changed to $$X"; fi; \ 
    if test -z "$$Y"; then Y=0.05; echo "Y undefined, changed to $$Y"; fi; \ 
    python ./Submit3DSP.py -f OneDot.qdt -x $$X -y $$Y 

Обратите внимание, что $$ передается оболочке, как один $, и все должно быть единственной командой для оболочки, следовательно, точки с запятой и обратная косая черта/новые строки.

+0

Меня интересуют только эти переменные, если я делаю эту конкретную цель, мне все еще нужно, чтобы они были незатронуты? –

+1

Спасибо, я узнал, что вы не можете устанавливать условные обозначения внутри цели. Есть разумные способы обойти это, но я буду использовать исправление переменной окружения. BTW, вы должны иметь «после эха в обеих строках, чтобы сделать эту работу». –

+0

Хорошая фиксация. – Jens

4

Если строка начинается с закладки, она будет считаться частью рецепта правила. Дополнительные пробелы разрешены и игнорируются в начале строки условной директивы, но вкладка не допускается.

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