覆盖 make 中的构建规则

发布于 2024-08-05 08:13:51 字数 249 浏览 3 评论 0原文

我正在使用 Makefile 来构建嵌入式项目。我从许多以前的开发人员那里继承了该项目,他们还没有充分利用 Make 的潜力,并且我希望能够使用构建命令上的定义在 makefile 中指定项目版本。但是,已经有一个构建所有对象 (.o) 文件的构建规则。有什么方法可以覆盖特定目标文件的构建规则,以便我可以向编译器添加 -D 标志?

我希望能够在 makefile 中指定项目版本的另一个原因是,这样我就可以让它使用构建过程生成的结果文件的名称中的构建版本来生成工件。

I'm using a Makefile to build an embedded project. I've inherited the project from numerous previous developers who haven't been using Make to its full potential, and I'd like to be able to specify the project version in the makefile using defines on the build command. However, there's already a build rule that builds all the object (.o) files. Is there any way to override that build rule for a specific object file so that I can add -D flags to the compiler ?

Another reason I'd like to be able to specify the project version in the makefile is so that I can have it generate artifacts with the build version in the names of the resulting files produced by the build process.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

初见 2024-08-12 08:13:51
  1. 是的,您可以覆盖模式规则(这就是我打赌您的 .o 规则),只需具有特定的规则(并且规则的顺序并不重要):
    <前>%.o:
    做通用事情
    西奥:
    do_specific_things -Dproject_version
  2. 是的,您可以将构建版本放在文件名中。有不止一种方法可以做到这一点——最好的方法可能是将其放在目标名称中:
    %$(B_VERSION).o: %.c
        $(CC) -c -DBUILD_VERSION=$(B_VERSION) - 任意 
    lt; -o $@
    
    
  1. Yes, you can override a pattern rule (which is what I bet your .o rule is), just by having a specific rule (and the order of the rules doesn't matter):
    %.o:
        do_generic_things
    x.o:
        do_specific_things -Dproject_version
    
  2. Yes, you can put a build version in a file name. There's more than one way to do it-- the best is probably to put it in the target name:
    %$(B_VERSION).o: %.c
        $(CC) -c -DBUILD_VERSION=$(B_VERSION) -Whatever 
    lt -o $@
    

如果您使用 GNU make 并且只想更改编译器选项,则可以使用特定于目标的变量,如下所示:

x.o: CFLAGS += -DEXTRA_SYMBOL_FOR_X

这也可以递归工作,即 xo 的特定于目标的值也有效对于 xo 依赖的所有目标,这意味着如果您在 makefile 中构建多个可执行文件,则可以在可执行文件本身上设置特定于目标的变量,该变量将对所有目标文件有效:

foo: CFLAGS += -DEXTRA_SYMBOL_FOR_FOO_APP

If you are using GNU make and you only want to change compiler options, you can use target-specific variables, like so:

x.o: CFLAGS += -DEXTRA_SYMBOL_FOR_X

This also works recursively, i.e. the target-specific value for x.o also is in effect for all targets which x.o depends on, meaning that if you build multiple executables in your makefile, you can set a target-specific variable on the executable itself, which will be in effect for all the object files:

foo: CFLAGS += -DEXTRA_SYMBOL_FOR_FOO_APP
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文