Как изменить переменную окружения в make-файле GNU - PullRequest
0 голосов
/ 12 декабря 2018

имя файла: " dev "

export CFLAGS="-g -O2 -Wall -std=gnu99 -fno-strict-aliasing -D_GNU_SOURCE"
export CXXFLAGS="-g -O2 -Wall -fno-strict-aliasing -D_GNU_SOURCE"

До того, как скомпилировать свой проект, я использовал исходный dev, так что echo $ CFLAGS $ CXXFLAGS будетзначение, которое я ему присваиваю.

Но как мне изменить переменные окружения в Makefile?Я попытался выполнить следующее, но потерпел неудачу.

[root@centos-linux-10 make]# cat Makefile 
all:
    export CFLAGS="-O2 -Wall -std=gnu99 -fno-strict-aliasing -D_GNU_SOURCE"
    export CXXFLAGS="-O2 -Wall -fno-strict-aliasing -D_GNU_SOURCE"

    @echo $(CFLAGS)
    @echo $(CXXFLAGS)

[root@centos-linux-10 make]# make 
export CFLAGS="-O2 -Wall -std=gnu99 -fno-strict-aliasing -D_GNU_SOURCE"
export CXXFLAGS="-O2 -Wall -fno-strict-aliasing -D_GNU_SOURCE"
-g -O2 -Wall -std=gnu99 -fno-strict-aliasing -D_GNU_SOURCE
-g -O2 -Wall -fno-strict-aliasing -D_GNU_SOURCE
[root@centos-linux-10 make]# 

После нескольких попыток я получил это. В make-файле я повторяю CFLAGS и CXXFLAGS , это новое значение после make, почему значение thme вернулось назад???

[root@centos-linux-10 make]# cat Makefile 
export CFLAGS="-O2 -Wall -std=gnu99 -fno-strict-aliasing -D_GNU_SOURCE"
export CXXFLAGS="-O2 -Wall -fno-strict-aliasing -D_GNU_SOURCE"

all:

    @echo $(CFLAGS)
    @echo $(CXXFLAGS)

[root@centos-linux-10 make]# echo $CFLAGS
-g -O2 -Wall -std=gnu99 -fno-strict-aliasing -D_GNU_SOURCE
[root@centos-linux-10 make]# echo $CXXFLAGS
-g -O2 -Wall -fno-strict-aliasing -D_GNU_SOURCE
[root@centos-linux-10 make]# 
[root@centos-linux-10 make]# make
-O2 -Wall -std=gnu99 -fno-strict-aliasing -D_GNU_SOURCE
-O2 -Wall -fno-strict-aliasing -D_GNU_SOURCE
[root@centos-linux-10 make]# 
[root@centos-linux-10 make]# echo $CFLAGS
-g -O2 -Wall -std=gnu99 -fno-strict-aliasing -D_GNU_SOURCE
[root@centos-linux-10 make]# echo $CXXFLAGS
-g -O2 -Wall -fno-strict-aliasing -D_GNU_SOURCE

1 Ответ

0 голосов
/ 13 декабря 2018

Во-первых, каждая строка рецепта запускается в своей собственной оболочке, как упоминал @JonathanLeffler.Каждый раз, когда оболочка закрывается, она забывает обо всех своих переменных (для этого есть несколько веских причин безопасности).Таким образом, переменная, установленная в одной строке рецепта, не может быть доступна на следующей строке.Один из наиболее распространенных способов обойти это - использовать только одну строку для вашего рецепта.Я должен отметить, что вы также используете $(CFLAGS), чтобы попытаться сослаться на переменную bash.Make расширит $(CFLAGS) до внутренней переменной, даже не передав ее в bash, поэтому в вашем примере вы даже не используете переменную bash.

Для иллюстрации:

foo:
    @SOMEVAR=hello; \
     echo $@:$$SOMEVAR

bar:
    @SOMEVAR=hello;
    @echo $@:$$SOMEVAR

MAKEVAR:=goodbye
foobar:
    @echo "$@:$(MAKEVAR)"

Тогда вы получите:

tmp> make foo bar foobar
foo:hello
bar:
foobar:goodbye

обратите внимание на ';'и '\' в конце первой строки рецепта foo.\ объединяет две строки рецепта в одну, а ; указывает bash запускаться как две отдельные команды.Также обратите внимание на отсутствие символа @ во второй строке, так как bash не понимает @.Наконец, обратите внимание, что в рецепте foobar перед переменной make есть только один $, что означает, что он расширяется make-файлом, но два $$ перед foo и barварианты (которые расширяются до одного $ перед передачей в bash).

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