Сценарий
У меня возникли проблемы с попыткой присвоить значения из команды переменной в make-файле. Использование нотации backtick, кажется, работает нормально, но как только я использую более современную нотацию $(pwd)
, значение переменной ничего не возвращает.
$ cat Makefile
FOO=moo
BAR=$(pwd)
BAZ=`pwd`
all: foo bar baz
foo:
@echo foo:$(FOO)';'
bar:
@echo bar:$(BAR)';'
baz:
@echo baz:$(BAZ)';'
$ make all
foo:moo;
bar:;
baz:/home/mazunki;
Как видите, FOO и BAZ работают как положено , Но не БАР.
Задача
Давайте теперь посмотрим на мою проблему, добавив еще несколько примеров. Я пропускаю эхо, как вы поняли.
$ cat Makefile
SHELL=/bin/env bash
FOO=dog
BAR=$(pwd)
BAZ=`pwd`
QUZ=`$(FOO)`/cat
ZOT=`\`FOO\``/owl
BIM=`$(BAZ)`/rat
BAM=`\`BAZ\``/pig
BUM=`BUM`/fox
all: foo bar baz quz zot bim bam bum
# targets for all the things
$ make
foo:dog;
bar:;
baz:/home/mazunki;
bash: dog: command not found
quz:/cat;
bash: FOO: command not found
zot:/owl;
bim:pwd/rat;
bash: BAZ: command not found
bam:/pig;
bash: BAZ: command not found
bum:/fox;
У меня действительно были надежды на BIM. Но, к сожалению, он только возвращает команду, которую я хотел выполнить вместо. Я попытался добавить еще один слой $()
и / или ``
, но вместо этого получился пустой вывод.
Мой желаемый результат - это то, что я получу, запустив echo -n $(pwd)/rat
в * 1023. *. Ни один из моих проверенных примеров не позволяет мне сделать это. Я хочу иметь возможность сделать это, так как некоторые команды, которые я использую для своих переменных предисловия, основаны на начальных настройках, например:
# User settings
ROOT=`pwd`
SRCPATH=$(ROOT)/src/
OBJPATH=$(ROOT)/objects/
# Scripting
SRCFILES=`find $(SRCPATH) -name '*.ext' -printf '%p '`
OBJFILES=`find $(SRCPATH) -name '*.ext' -printf '$(OBJPATH)/%p ' | sed 's/^$(SRCPATH)/^$(OBJPATH)//g; s/.ext;/.obj;/g; s/;$//g'`
Это может выглядеть как запутанный сценарий, но я ' Я делаю это по двум основным причинам: я хочу, чтобы он был легко настраиваемым, без необходимости редактирования самих команд, а также потому, что я хочу научиться правильно создавать файлы Makefile.