1

我有一个文件夹布局的项目,例如:

/project_root
  /common-code-sources
    /common1
    /common2
    /...
  /prog-A-sources
  /prog-B-sources
  /prog-C-sources

需要为程序 A、B 和 C 生成三个可执行文件。每个可执行文件都有少量独特的源代码,但大多数都希望静态链接来自各种libCommonCodeN.a文件的功能。

但是,我需要构建 Program C 和所有它需要的具有一组特定编译标志的通用代码库。(在这种情况下,32 位并且禁用了一些优化。)

这意味着common_sources必须使用正确的标志再次编译程序 C 所需的特定代码。

我正在寻找有关如何最好地创建基于 Makefile 的构建系统来涵盖这种情况的想法。

我认为该解决方案将涉及 lib 文件的并行输出文件夹和所谓的“特定于目标”的make变量来指导该过程,但我不确定如何将它们组合在一起。

问题:当其中一个源发生更改 时,我如何确保make在项目的根目录下运行是正确的?common-code

那就是:我怎样才能重建有.a问题的两种风格并重新链接3个可执行文件?

4

1 回答 1

1

这里有两种方法:

  • 维护单个Makefile (您始终可以通过include指令拆分 Makefile )。
  • 为每个子项目维护自己的 Makefile(递归 make 考虑有害的方法)。

在第一种情况下,您可以完全控制依赖项...要进行自定义构建,请使用:

  $ 猫 Makefile
...
ifeq '$(DEBUG)' '是'
  BUILD_DIR = 调试
  CFLAGS += $(CFLAGS_DEBUG)
别的
  BUILD_DIR = 释放
  CFLAGS += $(CFLAGS_OPTIM)
万一
...
  $ 使调试=是

在第二种情况下,将第一个提示与:

  $ 猫 Makefile
...
ifeq '$(DEBUG)' '是'
  BUILD_DIR = 调试
  MODULE_A_BUILD_DIR = ../module-A/_debug_build
  CFLAGS += $(CFLAGS_DEBUG)
别的
  BUILD_DIR = 释放
  MODULE_A_BUILD_DIR = ../module-A/_release_build
  CFLAGS += $(CFLAGS_OPTIM)
万一

构建:$(MODULE_A_BUILD_DIR)/libmodulea.a
    制作 -C $(MODULE_A_BUILD_DIR)/.. DEBUG=$(DEBUG)
...

你在你的问题中说的都是正确的。只要做到逻辑一致,不要害怕))

因此,使build / dist路径依赖于 make 标志或目标模式:

ifneq '$(filter %-debug,$(MAKECMDGOALS))' ''
  BUILD_DIR = 调试
  MODULE_A_BUILD_DIR = ../module-A/_debug_build
  CFLAGS += $(CFLAGS_DEBUG)
  ...
万一
于 2012-06-24T19:25:14.333 回答