Как справиться с настройкой окружения в makefile? - PullRequest
8 голосов
/ 10 октября 2009

Итак, чтобы скомпилировать мой исполняемый файл, мне нужно правильно настроить расположение библиотек. Проблема в том, что установка происходит из набора сценариев, которые выполняют экспорт переменных env, и то, что нужно настроить, может измениться (вне моего контроля), поэтому мне нужно использовать эти сценарии вместо того, чтобы копировать их функциональность. Для компиляции в обычной командной строке мне нужно сделать что-то вроде:

setup library1
setup library2
source some_other_setup_script.bash
g++ blah.c
# setup is a executable on my system that run some scripts

Как бы я написал make-файл, который выполняет это? Насколько я пытался, экспорт переменных env не переносится (то есть "export VAR = запомнить; echo $ VAR" не будет работать)

Ответы [ 6 ]

11 голосов
/ 16 февраля 2011

Вы также можете правильно добавить переменные окружения с помощью механизма GNU make, например:

export TEST:="Something Good!"
test:
    echo $$TEST

Эта (я думаю) семантика отличается от:

TEST2:="Something not quite so useful?"
test2:
    echo ${TEST2}

Что (опять же, я думаю) выполняет подстановку внутри, прежде чем перейти к оболочке. Обратите внимание, что команда экспорта не работает в целевом блоке, она просто отменяется как немедленно выполняемая команда.

6 голосов
/ 10 октября 2009

Если экспорт переменных работает не так, как в командной строке, это говорит о том, что Make выбирает оболочку, отличную от той, которую вы используете, с другим синтаксисом для обработки переменных (export VAR=remember; echo $VAR отлично работает для меня) , Make использует /bin/sh по умолчанию, но вы можете переопределить это с помощью переменной SHELL, которая Make не импортирует из среды. Я предлагаю установить SHELL (в Makefile) на то, что вы используете в своей среде, и снова попробовать эксперимент export VAR=remember.

3 голосов
/ 10 октября 2009

В конечном итоге вам нужно определить переменную и выполнить компилятор в списке оболочки или даже в скрипте, а не в отдельных make командах. Однако есть несколько уточнений, которые вы можете добавить. Вы можете рассказать make о скрипте:

maintarget: script.sh blah.c
    source script.sh; g++ blah.c

script.sh:
    setup include script here

Другое дело, просто выполнить все эти вещи в одной оболочке

maintarget: blah.c
    run this; run that; run the other thing; g++ blah.c 

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

Не забудьте, что соответствующие цели зависят от ваших сценариев. Кстати, некоторые make версии (pmake aka bsd make) могут выполнять команду при определении переменной make, и все версии make затем экспортируют их. Но я не думаю, что gmake может это сделать.

1 голос
/ 13 октября 2009

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

Makefile:

all:
    echo $(FOO)

test.mk: test.sh
    ./$< > $@

include test.mk

test.sh

echo "FOO=1"

Запуск «make» в каталоге, содержащем этот Makefile, выдает:

make: Entering directory `/home/luser/build/mktest'
Makefile:7: test.mk: No such file or directory
./test.sh > test.mk
make: Leaving directory `/home/luser/build/mktest'
make: Entering directory `/home/luser/build/mktest'
echo 1
1
make: Leaving directory `/home/luser/build/mktest'

make создает test.mk, запустив скрипт оболочки, а затем включив его. test.mk содержит выходные данные test.sh и анализируется как Makefile. См. http://www.gnu.org/software/make/manual/make.html#Include для более подробной информации.
Мы используем вариант этого в файле client.mk в Mozilla, чтобы вы могли определить параметры в файле "mozconfig": http://mxr.mozilla.org/mozilla-central/source/client.mk#138

0 голосов
/ 09 января 2014

Может быть интересно, что для переопределения опции, уже определенной в make-файле, make поддерживает (я имею в виду GNU Make 3.82, но, возможно, и другую версию) опцию -e. Пример:

Makefile:

CC=gcc
...

Выполнить make:

CC=gcc-4.7
make -e

будет использовать gcc-4.7 вместо gcc.

0 голосов
/ 11 февраля 2013

Повторение: как мне получить переменную оболочки в файле make?

Что-то вроде:

MYVAR := $(shell echo $(MYVAR)) <any_makefile_additions_here> 

Итак, это определяет MYVAR внутри MAKEFILE, когда также установлена ​​переменная окружения с именем MYVAR.

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