gpt4 book ai didi

variables - 如何更改Makefile中CC等变量的默认值

转载 作者:行者123 更新时间:2023-12-02 19:11:06 32 4
gpt4 key购买 nike

(GNU) make 使用几个 variables例如:

  • CC -- C 编译器,默认 cc
  • CFLAGS -- C 编译器的标志,默认为空

我想在我的 Makefile 中指定其中一些的默认值。在下面的示例中,我使用条件赋值运算符 ?= 以便能够在运行 make 时覆盖默认值:

CFLAGS ?= CFLAGS_my_default
CC ?= CC_my_default

print:
echo CC=$(CC) CFLAGS=$(CFLAGS)

不幸的是,这不会改变 CC 变量的值,因为原始默认值仍保留在那里。 CFLAGS 由我的赋值设置,因为变量最初为空:

$ make print
echo CC=cc CFLAGS=CFLAGS_my_default
CC=cc CFLAGS=CFLAGS_my_default

从环境变量覆盖按预期工作:

$ CC=CC_from_env CFLAGS=CFLAGS_from_env make print
echo CC=CC_from_env CFLAGS=CFLAGS_from_env
CC=CC_from_env CFLAGS=CFLAGS_from_env

如何更改变量的默认值,并且在调用 make 时仍然能够覆盖它们?

最佳答案

我已经使用此 Makefile 使用 GNU Make 运行一些测试并检查 origin以及一些变量的默认值:

define whatisit
$(info $(1) origin is ($(origin $(1))) and value is ($($(1))))
endef

$(call whatisit,CC)
$(call whatisit,CFLAGS)

结果如下:

$ make
CC origin is (default) and value is (cc)
CFLAGS origin is (undefined) and value is ()
$ # Environment
$ CC=clang CFLAGS=-Wall make
CC origin is (environment) and value is (clang)
CFLAGS origin is (environment) and value is (-Wall)
$ # Command line
$ make CC=clang CFLAGS=-Wall
CC origin is (command line) and value is (clang)
CFLAGS origin is (command line) and value is (-Wall)

正如您所看到的,有两种类型的变量。这些类型定义为 in the manual .

第一组变量(ARASCC...)具有默认值。第二组变量(ARFLAGSASFLAGSCFLAGS、...)默认为空字符串(即 undefined)。

默认情况下,它们可以被环境或命令行覆盖。

<小时/>

未定义变量设置默认值

对于未定义变量(以及其他用户变量),您只需使用?=运算符来设置可以由环境或命令覆盖的默认值线。

CFLAGS ?= -Wall -Wextra -Werror
<小时/>

default变量设置默认值

更改 default 变量的默认值的最佳方法是检查其来源并仅在需要时更改该值。

ifeq ($(origin CC),default)
CC = gcc
endif
<小时/>

结论

Makefile:

ifeq ($(origin CC),default)
CC = gcc
endif
CFLAGS ?= -Wall -Wextra -Werror

define whatisit
$(info $(1) origin is ($(origin $(1))) and value is ($($(1))))
endef

$(call whatisit,CC)
$(call whatisit,CFLAGS)

最终结果:

$ make
CC origin is (file) and value is (gcc)
CFLAGS origin is (file) and value is (-Wall -Wextra -Werror)
$ # Environment
$ CC=clang CFLAGS=-Wall make
CC origin is (environment) and value is (clang)
CFLAGS origin is (environment) and value is (-Wall)
$ # Command line
$ make CC=clang CFLAGS=-Wall
CC origin is (command line) and value is (clang)
CFLAGS origin is (command line) and value is (-Wall)
<小时/>

可选

您可以使用MAKEFLAGS变量来禁用内置隐式规则和内置变量设置。这样:

MAKEFLAGS += -rR

这将清除许多默认设置(您可以使用make -p进行检查)。但default 变量(例如CC)仍将具有默认值。

关于variables - 如何更改Makefile中CC等变量的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18007326/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com