【发布时间】:2018-10-25 07:17:59
【问题描述】:
所以我有一个 makefile1 调用另一个 makefile2 来编译项目。我在项目中的一个 .c 文件中设置了一些 C 定义,它们通过 GLOBAL_DEFINES make 变量(在 makefile2 中)传递,在调用编译器时扩展为“-D ...”。我将值传递给那些 C 定义作为 makefile1 的参数(make param1=XX param2=YY),虽然这很好用但是当我不提供这个参数并且只运行 make 时,编译未能抱怨 param1= 和 param2= 未定义。知道如何优雅地处理这个问题。
这是我的实际有效命令
使 FW_VERSION_MAJOR=33 FW_VERSION_MINOR=4
我想在这里实现的是:我应该能够成功运行 make、make param1=XX 和 make param2=YY。一种方法是将这些 #defines 写入测试文件,这样当我在没有参数的情况下运行 make 时它从文件中获取 param1 和 param2 的值,如果我应用这些参数,它会在文件中覆盖它们。这是处理这个问题的最好方法吗?如果是的话,有人可以指导我吗 方向。
make --version
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built for x86_64-pc-linux-gnu
【问题讨论】:
-
请提供您当前使用的 make 调用的实际示例。不可能你正在运行
make -param1 -param2并且完全可以工作。 Make 不允许您创建自己的命令行选项(前面是-)。如果其中任何一个不是有效的 make 命令选项,它将始终解析所有选项并抛出错误。 -
@MadScientist 我已经用我的实际命令编辑了这篇文章。很抱歉造成混乱。
-
@MadScientist 另外,
GLOBAL_DEFINES += FW_VERSION_MAJOR=$(FW_VERSION_MAJOR) GLOBAL_DEFINES += FW_VERSION_MINOR=$(FW_VERSION_MINOR)这就是我为赋值所做的工作。目的是将 FW_VERSION_MAJOR 和 FW_VERSION_MINOR make 环境变量(我应该能够在命令行上将其传递给 make)的值作为预处理器 (#define) 定义传递给编译器。 -
首先你必须决定一件基本的事情:你想如何将宏值传递给编译器?您有两个选择:您可以在编译器命令行中使用
-D指定它们,或者您可以将#define语句写入头文件。前者在make中更容易实现。后者,一旦你设置并工作,可能会更健壮(也就是说,当值发生变化时,make 将能够重建所有需要重建的文件)。后者还需要更改您的源代码,为新文件添加#include行。 -
@MadScientist 感谢您的帮助。我终于用后一种方法让它工作了。
标签: file makefile version-control gnu-make