- build/
- Build GNUMake:如何构建一个32位和64位的公共库?
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调试)
...
恩迪夫