Build GNUMake:如何构建一个32位和64位的公共库?

Build GNUMake:如何构建一个32位和64位的公共库?,build,build-automation,static-libraries,gnu-make,Build,Build Automation,Static Libraries,Gnu Make,我有一个文件夹布局如下的项目: /project_root /common-code-sources /common1 /common2 /... /prog-A-sources /prog-B-sources /prog-C-sources 需要为程序A、B和C生成三个可执行文件。每个可执行文件都有少量唯一的源代码,但大多希望静态链接来自各种libCommonCodeN.A文件的功能 但是,我需要用一组特定的编译标志来构建程序C及其所需的所有公共代码库

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

/project_root
  /common-code-sources
    /common1
    /common2
    /...
  /prog-A-sources
  /prog-B-sources
  /prog-C-sources
需要为程序A、B和C生成三个可执行文件。每个可执行文件都有少量唯一的源代码,但大多希望静态链接来自各种
libCommonCodeN.A
文件的功能

但是,我需要用一组特定的编译标志来构建程序C及其所需的所有公共代码库。(在本例中,为32位,禁用了一些优化。)

这意味着程序C所需的
common_sources
下的特定代码必须再次符合正确的标志

我正在寻找如何最好地创建一个基于Makefile的构建系统来覆盖这种情况的想法

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

问题:当一个
通用代码
源发生变化时,如何确保在项目的根目录下运行
make
是正确的


也就是说:我如何才能重建所讨论的特定
.a
的两种风格,并重新链接3个可执行文件?

以下是两种方法:

  • 维护单个Makefile(始终可以按include指令分割Makefile)
  • 为每个子项目(方法)维护自己的makefile
在第一种情况下,您可以完全控制依赖项。。。要进行自定义生成,请使用:

$ cat Makefile ... ifeq '$(DEBUG)' 'yes' BUILD_DIR = debug CFLAGS += $(CFLAGS_DEBUG) else BUILD_DIR = release CFLAGS += $(CFLAGS_OPTIM) endif ... $ make DEBUG=yes $cat生成文件 ... ifeq'$(调试)'是' BUILD\u DIR=debug CFLAGS+=$(CFLAGS\u调试) 其他的 BUILD\u DIR=发布 CFLAGS+=$(CFLAGS_OPTIM) 恩迪夫 ... $make DEBUG=yes 在第二种情况下,将第一个提示与以下内容混合使用:

$ cat Makefile ... ifeq '$(DEBUG)' 'yes' BUILD_DIR = debug MODULE_A_BUILD_DIR = ../module-A/_debug_build CFLAGS += $(CFLAGS_DEBUG) else BUILD_DIR = release MODULE_A_BUILD_DIR = ../module-A/_release_build CFLAGS += $(CFLAGS_OPTIM) endif build: $(MODULE_A_BUILD_DIR)/libmodulea.a make -C $(MODULE_A_BUILD_DIR)/.. DEBUG=$(DEBUG) ... $cat生成文件 ... ifeq'$(调试)'是' BUILD\u DIR=debug MODULE_A_BUILD_DIR=../MODULE-A/_debug_BUILD CFLAGS+=$(CFLAGS\u调试) 其他的 BUILD\u DIR=发布 模块\u A\u构建\u目录=../MODULE-A/\u发布\u构建 CFLAGS+=$(CFLAGS_OPTIM) 恩迪夫 构建:$(模块A构建目录)/libmodulea.A make-C$(模块构建目录)/。。调试=$(调试) ... 你的问题说得对。只要在逻辑上保持一致,不要害怕

因此,根据make标志或目标模式生成build/dist路径:

ifneq '$(filter %-debug,$(MAKECMDGOALS))' '' BUILD_DIR = debug MODULE_A_BUILD_DIR = ../module-A/_debug_build CFLAGS += $(CFLAGS_DEBUG) ... endif ifneq'$(过滤器%-调试,$(MAKECMDGOALS))'' BUILD\u DIR=debug MODULE_A_BUILD_DIR=../MODULE-A/_debug_BUILD CFLAGS+=$(CFLAGS\u调试) ... 恩迪夫
以下是两种方法:

  • 维护单个Makefile(始终可以按include指令分割Makefile)
  • 为每个子项目(方法)维护自己的makefile
在第一种情况下,您可以完全控制依赖项。。。要进行自定义生成,请使用:

$ cat Makefile ... ifeq '$(DEBUG)' 'yes' BUILD_DIR = debug CFLAGS += $(CFLAGS_DEBUG) else BUILD_DIR = release CFLAGS += $(CFLAGS_OPTIM) endif ... $ make DEBUG=yes $cat生成文件 ... ifeq'$(调试)'是' BUILD\u DIR=debug CFLAGS+=$(CFLAGS\u调试) 其他的 BUILD\u DIR=发布 CFLAGS+=$(CFLAGS_OPTIM) 恩迪夫 ... $make DEBUG=yes 在第二种情况下,将第一个提示与以下内容混合使用:

$ cat Makefile ... ifeq '$(DEBUG)' 'yes' BUILD_DIR = debug MODULE_A_BUILD_DIR = ../module-A/_debug_build CFLAGS += $(CFLAGS_DEBUG) else BUILD_DIR = release MODULE_A_BUILD_DIR = ../module-A/_release_build CFLAGS += $(CFLAGS_OPTIM) endif build: $(MODULE_A_BUILD_DIR)/libmodulea.a make -C $(MODULE_A_BUILD_DIR)/.. DEBUG=$(DEBUG) ... $cat生成文件 ... ifeq'$(调试)'是' BUILD\u DIR=debug MODULE_A_BUILD_DIR=../MODULE-A/_debug_BUILD CFLAGS+=$(CFLAGS\u调试) 其他的 BUILD\u DIR=发布 模块\u A\u构建\u目录=../MODULE-A/\u发布\u构建 CFLAGS+=$(CFLAGS_OPTIM) 恩迪夫 构建:$(模块A构建目录)/libmodulea.A make-C$(模块构建目录)/。。调试=$(调试) ... 你的问题说得对。只要在逻辑上保持一致,不要害怕

因此,根据make标志或目标模式生成build/dist路径:

ifneq '$(filter %-debug,$(MAKECMDGOALS))' '' BUILD_DIR = debug MODULE_A_BUILD_DIR = ../module-A/_debug_build CFLAGS += $(CFLAGS_DEBUG) ... endif ifneq'$(过滤器%-调试,$(MAKECMDGOALS))'' BUILD\u DIR=debug MODULE_A_BUILD_DIR=../MODULE-A/_debug_BUILD CFLAGS+=$(CFLAGS\u调试) ... 恩迪夫