【问题标题】:read/write file via makefile通过 makefile 读/写文件
【发布时间】:2018-10-25 07:17:59
【问题描述】:

所以我有一个 ma​​kefile1 调用另一个 ma​​kefile2 来编译项目。我在项目中的一个 .c 文件中设置了一些 C 定义,它们通过 GLOBAL_DEFINES make 变量(在 makefile2 中)传递,在调用编译器时扩展为“-D ...”。我将值传递给那些 C 定义作为 makefile1 的参数(make param1=XX param2=YY),虽然这很好用但是当我不提供这个参数并且只运行 ma​​ke 时,编译未能抱怨 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


【解决方案1】:

你可以在你的第一个 Makefile 中使用条件变量赋值运算符(它在 gnu make doc 中有点隐藏):

FW_VERSION_MAJOR ?= x.x.x

这样,如果FW_VERSION_MAJOR 未定义(通过您的命令行分配),它将获得一个默认值并且您的编译将继续。

这样做的好处是不需要更改或添加您的源代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 2012-07-06
    • 2012-08-14
    相关资源
    最近更新 更多