2014-02-01 3 views
2

Внутри моей env.sh:Передать переменную оболочки bash в Makefile?

export BIN="/home/user/stuff" 

Внутри моей Makefile:

бла-бла

TARGET = filetobeinstalled 

бла-бла

install: 
     cp $(TARGET) $(BIN) 

Перед запуском make install, я определяю свои env vars внутри моей оболочки bash следующим образом: source /home/user/env.sh. Я дважды проверяю, что эти env vars работают, набрав в оболочке echo $BIN, что я запускаю Makefile, что дает мне соответствующий ответ (/home/user/stuff).

Итак, я пытаюсь передать $BIN переменную, определенную в командной строке с source, чтобы внутри моего Makefile, который ссылается $BIN, но не определяет его. К сожалению, когда я бегу make install, он не подхватывает $BIN, как вы можете видеть на выходе

$ source /home/user/env.sh 
$ echo $BIN 
$ /home/user/stuff 
$ make install 

make[1]: Entering directory `/home/user/stufftoinstall' 
cp filetobeinstalled 
cp: missing destination file operand after `filetobeinstalled' 
Try `cp --help' for more information. 
make[1]: *** [install] Error 1 

На линии, которая имеет cp filetobeinstalled, я ожидал бы, чтобы забрать мой окр VARS устанавливается с помощью source перед запуском make install, так что строка должна читать cp filetobeinstalled /home/user/stuff, но это не так.

Я нашел похожие posts и кусочки, разбросанные по межотражателям, но ничего окончательного для вышеупомянутой проблемы и/или ничего, что сработало до сих пор. Надеюсь, это не слишком очевидно, но мне все равно, как я определенно, Makefile-nubile.

Приветствия

+0

Обычно 'make' интерпретирует переменные среды как значения по умолчанию для переменных' make' с тем же именем. Существует опция «-e» для изменения приоритета переменных среды. Проверьте, что вы получаете при вводе 'env | grep '^ BIN =' '. Если это ничего не показывает, вот почему 'make' жалуется. Если он показывает правильное значение для переменной среды 'BIN', я не уверен, что происходит. Возможно, нам нужно будет увидеть специальные правила в верхней части 'makefile'. –

+0

Как 'env.sh' получить исходный код в вашей оболочке?Это не стандартный файл конфигурации, а Make использует 'sh', а не' bash', по умолчанию, так что возможно, что 'env.sh' не используется вашим Makefile. – chepner

+0

@JonathanLeffler - yep, он выплевывает 'BIN =/home/user/stuff'. Какие части Makefile помогут? – Prophet60091

ответ

1

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

export BINDIR=/bin/path ;# will do 
BINDIR=/bin/path; export BINDIR ;# will do as well 
BINDIR=/bin/path make install ;# even this willd 
make BINDIR=/bin/path install ;# and this, though using a different mechanism 

Дополнение:

Если вы добавите ниже цели, то вы можете запустить make var=whatever printvar, и он будет выводить значение переменной whatever. Это может помочь отладить его.

.PHONY: printvar 
printvar: 
    @echo "[$(var)]=[$($(var))]" 

Кроме того, если вы запустите make с -np он будет работать в режиме сухого хода и печать всех определенных переменных, так что вы можете сделать make -np install | fgrep -w BIN и посмотреть, что у вас есть.

+0

Мне нужно немного больше распаковки/уточнения. Является ли указанное выше определение в моем файле env.sh? Указанный экспорт var определенно находится в моем файле env.sh, и перед запуском 'make install', запуск' echo $ BIN' в оболочке возвращает мне правильный путь. – Prophet60091

+0

Я обновил ответ с предложением по отладке проблемы. – bobah

+0

Я нашел 'make -np install' проницательным, поэтому для этого было бы неплохо. Он показывает 'BIN =/home/user/stuff', но, очевидно, это не работает. Интересно, что это показывает, что моя оболочка makefile установлена ​​в 'SHELL = bin/sh', хотя я установил ее в SHELL = bin/bash' в Makefile согласно предложению @ chepner. – Prophet60091

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