Makefile определить переменную, используя if - PullRequest
0 голосов
/ 22 марта 2012

Я пытаюсь сделать что-то подобное

@if[[ 1==1 ]] then;\
   COMPILER_CMD = -fPic;\
fi;

Но если я вызову в следующей строке переменную, она не будет работать.Если я определю это за пределами, если он работает идеально.Кто-нибудь может мне помочь?

Ответы [ 3 ]

2 голосов
/ 22 марта 2012

Как говорят все , вы не дали нам достаточно информации. Но я сделаю предположение. Вы хотите установить эту переменную условно, а затем использовать ее где-нибудь в make-файле и в других make-файлах, которые include это.

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

Попробуйте это в make-файле, вне какого-либо правила (то есть, не в рецепте какой-либо конкретной цели):

ifeq (1,1)
COMPILER_CMD = -fPic
endif

$(info $(COMPILER_CMD))

Если это сработает, тогда вы можете попытаться адаптировать его к тому, что вы на самом деле пытаетесь сделать.

1 голос
/ 22 марта 2012

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

Вы можете объединить обе строки в одну длинную для достижениято, что ты хочешь.Возможно, у вас есть что-то вроде этого в вашем Makefile:

@if[[ 1==1 ]] then;\
   COMPILER_CMD = -fPic;\
fi;
echo $COMPILER_CMD

Вы хотите добавить обратную косую черту продолжения строки к строке перед echo:

@if[[ 1==1 ]] then;\
   COMPILER_CMD = -fPic;\
fi; \
echo $COMPILER_CMD
0 голосов
/ 22 марта 2012

Я предполагаю, что приведенный вами пример - это рецепт какого-то правила. По синтаксису здесь похоже, что вы пытаетесь установить переменную make COMPILER_CMD из рецепта на основе значения некоторого логического теста оболочки, что, конечно, невозможно. Вы должны четко понимать, как работает make: make никоим образом не интерпретирует написанные вами рецепты. Make просто передает эти рецепты другой программе (оболочке), а другая программа интерпретирует эти команды. Таким образом, вы не можете изменить поведение make, включая установку переменных make, из рецепта: этот рецепт запускается в совершенно другой программе.

Как уже говорили другие, вы не предоставляете достаточно информации о том, что ДЕЙСТВИТЕЛЬНО хотите сделать на более высоком уровне, чтобы мы могли дать полное решение. Наличие логического значения типа 1==1 не дает никаких намеков на то, почему вы это делаете. Кроме того, синтаксис вашей оболочки содержит синтаксические ошибки, поэтому мы можем сказать, что вы на самом деле не вырезали и не вставляли это из реального рабочего примера.

Вы можете, как предполагает piokuc, использовать переменную оболочки COMPILER_CMD (вы должны удалить пробел вокруг =, чтобы сделать ее назначением переменной оболочки), но это значение вступает в силу только во время работы одной строки рецепта. Для следующей строки рецепта запускается новая оболочка, и все значения, установленные в предыдущей оболочке, теряются:

all:
        @ if [[ 1 == 1 ]]; then COMPILER_CMD=-fpic; fi; \
          echo COMPILER_CMD=$$COMPILER_CMD
        @ echo COMPILER_CMD=$$COMPILER_CMD

даст:

COMPILER_CMD=-fpic
COMPILER_CMD=
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...