覆盖 makefile 中的“CC”和“CXX”变量

2024-03-28

我有一个主 makefile,其中包含通用设置,以及一个子 makefile,其中包含项目特定设置。

从我的另一个问题来看覆盖 makefile 中的变量 https://stackoverflow.com/q/18869628/24949,我了解到我可以在我的主 makefile 中使用以下代码:

CC ?= avr-gcc
CXX ?= avr-g++

在子 makefile 中,我使用colorgcc https://github.com/colorgcc/colorgcc并覆盖这些变量:

CC ?= color-avr-gcc
CXX ?= color-avr-g++

一切正常。

但是,如果我从子 makefile 中删除上述行,make 就会开始使用gcc and g++代替avr-gcc and avr-g++.

我想两者都有CC and CXX受到不同的对待,并且 make 为它们提供了默认值,我无法使用以下语句为它们分配默认值:

CC ?= avr-gcc
CXX ?= avr-g++

我的问题:

  • 我的假设正确吗?
  • 如果是,是否有其他方法可以提供默认值CC and CXX在主 makefile 中并让 make 使用它,如果我不在子 makefile 中覆盖它们?

Edit:

As per 时空狐 https://stackoverflow.com/users/539810/chrono-kitsune的建议我做了以下

主生成文件

CC = avr-gcc
CXX = avr-g++
# Add other master macros here.
# Add other master targets here.

子生成文件

CC ?= color-avr-gcc
CXX ?= color-avr-g++
# There are no child macros or targets

include master.mk

不幸的是,即使这样也不起作用。当我跑步时make child.mk它正在拾取CC and CXX在 master 中定义。

PS:顺便说一句,我的主 makefile 是 Arduino 的 makefile,完整的源代码可在github https://github.com/sudar/Arduino-Makefile/blob/master/arduino-mk/Arduino.mk.


将主 makefile 拆分为两个文件:master.macros 和 master.targets。 .macros 文件将包含任何宏,例如 CC 和 CXX,.targets 文件将包含要创建的实际目标。

子生成文件:

CC ?= color-avr-gcc
CXX ?= color-avr-g++
# Add other child macros here.

include master.macros

# Add child targets here.

include master.targets

master.宏:

CC = avr-gcc
CXX = avr-g++
# Add other master macros here.

master.targets:

# Add master targets here.

如果您在命令行上设置 CC,则整个项目将使用它。否则,如果在子 makefile 中设置了 CC,则整个项目将使用该 CC。如果两者都不使用,则整个项目将使用master.macros中的CC宏。

如果您需要更复杂的东西,例如仅在构建主目标时使用不同的 CC,您将需要使用不同的 CC 变量,例如默认为 $(CC) 的 MASTER_CC,尽管您可以根据需要使用命令行就像make MASTER_CC=avr-gcc如果您不想使用子 makefile 中的任何 CC。您将使用 ?= 赋值,并且所有规则都需要明确,并且您当然可以将规则中的任何 $(CC) 替换为 $(MASTER_CC):

master.宏:

MASTER_CC ?= $(CC)
MASTER_CXX ?= $(CXX)

例如,如果这是 CC 的值,它将使用 color-avr-gcc。否则,你需要使用make MASTER_CC=avr-gcc使用 avr-gcc 代替。我还没有测试最后一点,这意味着可能存在错误,但我想第一个解决方案就是您所需要的:将主 makefile 分成两个文件,然后使用CC ?= ...在仅包含主宏和子 makefile 的部分中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

覆盖 makefile 中的“CC”和“CXX”变量 的相关文章

  • 这些 g++“多重定义”错误是怎么回事?

    我正处于一个项目的早期阶段 请阅读 昨天刚刚开始 我正在设置我的初始 makefile 这非常简单 以下是该文件的完整内容 all main o resource o g o output exe main o resource o mai
  • 如果单元测试失败则 make 失败

    我有一个用于编译静态库的 makefile 该生成文件具有编译与静态库关联的单元测试套件的规则 编译测试套件后 将调用 python 脚本来运行测试并记录结果 它看起来像这样 unit MAKE C cXbase unit python T
  • 抑制 make clean 中的消息(Makefile 无提示删除)

    我想知道如何避免 Makefile 中出现一些回声 clean rm fr o 该规则将打印 gt make clean rm fr o gt 我怎样才能避免这种情况 首先 实际的命令必须位于下一行 或者至少 GNU Make 是这样 它可
  • 如何生成缺失的 #include 文件的列表

    背景 我正在开发一个大型 C 项目 其中包含多个可执行文件和库输出 以及一组工作 make 文件 即假设您拥有整个代码库 您可以输入 make 它将构建所有库和可执行文件 我的问题是我必须部分编译该项目 并且只需链接已为项目其他部分编译的库
  • 链接到遗留库:-lgfortranbegin from a premade makefile

    我在尝试编译由一些研究人员开发的程序时遇到了一些麻烦 该程序应该以非常精确的方式计算傅立叶变换和其他一些有用的操作科学论文在这里 https www researchgate net profile Gerard Gomez2 public
  • 链接器输入文件未使用的 c++ g++ make 文件

    我无法弄清楚是什么导致了我在制作项目时不断遇到的错误 i686 apple darwin11 llvm g 4 2 lncurses linker input file unused because linking not done 我的
  • echo 命令,然后运行它? (如制作)

    有没有某种方法可以让 bash 进入一种详细模式 这样 当它运行 shell 脚本时 它会在运行之前回显将要运行的命令 也就是说 这样就可以看到运行的命令 以及它们的输出 类似于make 也就是说 如果运行像这样的 shell 脚本 ech
  • GNU Make 获取父目标名称

    在gnu make中 有没有办法获取启动整个链的原始目标并将执行引导到当前配方 PHONY all clean common all common clean common common echo echo MAKECMDGOALS for
  • Android.mk 包含其他项目

    说明 我的问题的目标是了解如何创建一个可以构建和运行的 Android mk makefile 如下所示的项目结构 Library is library on eclipse 数据 项目库 Project Interface 包含 1 个静
  • 如何在make后运行.o文件

    我一直在尝试运行一个 C 程序https github com rinon Simple Homomorphic Encryption https github com rinon Simple Homomorphic Encryption
  • 如何在 GNU Make 的定义中使用 ifeq?

    我正在尝试在 Makefile 中的定义内执行 ifeq 但我似乎遇到了一些错误 并且我想知道是否遗漏了某些内容 我有以下 Makefile info start ifeq X Y info DOES not appear 1 endif
  • 在 Linux 上的 makefile 和 Makefile 之间进行选择

    我想在一个目录中同时使用 Makefile 和 makefile 进行 make 默认情况下 它将执行makefile 我可以选择执行 Makefile 吗 提前致谢 最简单的选择是使用 f make f Makefile From man
  • VIM:有没有一种简单的方法可以从 Vim 管理 Visual Studio 解决方案/makefile 项目? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我尝试使用 Visual Studio 而不是 VIM 插件 但说实话 VS 相对于 VIM 的唯一优势是它能够自动管理我的项目 我知道 VS
  • 在 PATH 中找不到程序“make”

    我在 Eclipse 中遇到 程序 make 未在 PATH 中找到 错误 我检查了路径变量 C cygwin bin JAVA HOME bin ANT HOME bin ANDROID SDK tools ANDROID SDK pla
  • 在 Makefile 的先决条件列表中使用目标的目录路径

    我编写了一个脚本 它接收两个以 cfg 结尾的文件并输出一个以 cmp 结尾的文件 我想将其包含在我的 Makefile 中 因为一些源代码文件依赖于此 cmp 文件 在我的 Makefile 中 我想这样做 cmp cfg dir def
  • makefile 中的 $< 和 $@ 是什么意思?

    I have a csv b csv 在我的docs csv目录中 我需要将每个文件转换为 json 文件 我遵循这个question https stackoverflow com questions 2706064 compile al
  • GNU Make “Abort trap: 6” 在 gcc 调用之后,但是单独执行时调用是有效的

    我正在使用 GNU Make 构建一个很多人都会使用的 C C 项目 makefile 尝试通用 因为该项目中有许多可选文件 每个用户通过 MATLAB 界面选择这些文件 然后通过命令行参数 make target OPTS XYZ 等 将
  • mingw32-make 的目录更改错误

    我正在MinGW32下构建POCO库1 6 0 环境 Windows 7 Ultimate 32位 shell MSYS 执行成功 配置 configure Configured for MinGW config make的内容 POCO
  • 在 macOS 上更新 GNU make

    我从下载了 GNU make 4 2 1here http ftp gnu org gnu make make 4 2 1 tar gz 并按照展开文件夹中的 INSTALL 文件中的说明安装它 现在我跑make v在 shell 中 我仍
  • Makefile 和通配符

    好吧 这是我当前的 makefile 设置 有一些文件名为public01 c public02 c等等 我正在尝试使用以下方法为每个人制作目标文件public o带有通配符的标签 public o public c hashtable h

随机推荐