【问题标题】:How to modfiy environment variable in GNU makefile如何在 GNU makefile 中修改环境变量
【发布时间】:2018-12-13 05:13:57
【问题描述】:

文件名:“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"

在我编译我的项目之前,我使用了源开发,所以 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]# 

经过几次尝试,我得到了这个。在makefile中我回显了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

【问题讨论】:

  • 第一个导出命令在一个 shell 中运行,第二个在另一个 shell 中运行,echo 命令在另外两个 shell 中运行。您在第一个 shell 中所做的操作不会影响任何其他 shell。您可以尝试弄乱.ONESHELL: 以使测试“工作”。但是,这不是您问题的解决方案。您可以在makefile 中设置 CFLAGS 等。您可以使用make -e 更改makefile 中环境和设置的优先级。

标签: linux shell makefile


【解决方案1】:

首先,正如@JonathanLeffler 所提到的,配方的每一行都在其自己的外壳中运行。每次 shell 退出时,它都会忘记它的所有变量(这样做有一些很好的安全原因)。因此,在配方的一行中设置的变量不能在下一行访问。解决这个问题的一种更常见的方法是只在你的食谱中使用一行。我应该指出,您还使用 $(CFLAGS) 来尝试引用 bash 变量。在将 $(CFLAGS) 传递给 bash 之前,Make 会将其扩展为其内部变量,因此在您的示例中,您甚至没有使用 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 配方第一行末尾的“\”。 \ 将两个 recpies 行连接成一个,; 告诉 bash 作为两个单独的命令运行。还要注意第二行缺少@ 符号,因为bash 不理解@。最后,注意foobar配方中,make变量前面只有一个$,这意味着它被makefile扩展,但foobar前面有两个$$变体(在传递给 bash 之前扩展为单个 $)。

【讨论】:

    猜你喜欢
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    • 2017-03-17
    • 2016-06-25
    • 2015-05-07
    相关资源
    最近更新 更多