makefile模块独立编译的支持方法是什么

121次阅读
没有评论

共计 3568 个字符,预计需要花费 9 分钟才能阅读完成。

本篇内容介绍了“makefile 模块独立编译的支持方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让丸趣 TV 小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

  解决方案便是:1、将模块名(module)作为目标名(伪目标)建立规则;2、目标(module)对应的依赖为 build build/module;3、规则中的命令进入对应的模块文件夹进行编译;4、编译结果存放于 build 文件夹下。其关键技术点是如何获取 make 命令行中指定编译的模块名,通过预定义变量:$(MAKECMDGOALS),命令行中指定的目标名(make 的命令行参数)。如下

  下来我们来看看具体的 makefile 是怎样写的,将上节博客中的 pro-rule.mk 改成下面这样

.PHONY : all compile link clean rebuild $(MODULES)
DIR_PROJECT := $(realpath .)
DIR_BUILD_SUB := $(addprefix $(DIR_BUILD)/, $(MODULES))
MODULE_LIB := $(addsuffix .a, $(MODULES))
MODULE_LIB := $(addprefix $(DIR_BUILD)/, $(MODULE_LIB))
APP := $(addprefix $(DIR_BUILD)/, $(APP))
all : compile $(APP)
 @echo  Success! Target ==  $(APP) 
compile : $(DIR_BUILD) $(DIR_BUILD_SUB)
 @echo  Begin to compile ... 
 @set -e; \
 for dir in $(MODULES); \
 do \
 cd $$dir   \
 $(MAKE) all \
 DEBUG:=$(DEBUG) \
 DIR_BUILD:=$(addprefix $(DIR_PROJECT)/, $(DIR_BUILD)) \
 DIR_COMMON_INC:=$(addprefix $(DIR_PROJECT)/, $(DIR_COMMON_INC)) \
 CMD_CFG:=$(addprefix $(DIR_PROJECT)/, $(CMD_CFG)) \
 MOD_CFG:=$(addprefix $(DIR_PROJECT)/, $(MOD_CFG)) \
 MOD_RULE:=$(addprefix $(DIR_PROJECT)/, $(MOD_RULE))   \
 cd .. ; \
 done
 @echo  Compile Success! 
 
link $(APP) : $(MODULE_LIB)
 @echo  Begin to link ... 
 $(CC) -o $(APP) -Xlinker  -( $^ -Xlinker  -)  $(LFLAGS)
 @echo  Link Success! 
 
$(DIR_BUILD) $(DIR_BUILD_SUB) : 
 $(MKDIR) $@
 
clean : 
 @echo  Begin to clean ... 
 $(RM) $(DIR_BUILD)
 @echo  Clean Success! 
 
rebuild : clean all
$(MODULES) : $(DIR_BUILD) $(DIR_BUILD)/$(MAKECMDGOALS)
 @echo  Begin to compile $@ 
 @set -e; \
 for dir in $(MODULES); \
 do \
 cd $@   \
 $(MAKE) all \
 DEBUG:=$(DEBUG) \
 DIR_BUILD:=$(addprefix $(DIR_PROJECT)/, $(DIR_BUILD)) \
 DIR_COMMON_INC:=$(addprefix $(DIR_PROJECT)/, $(DIR_COMMON_INC)) \
 CMD_CFG:=$(addprefix $(DIR_PROJECT)/, $(CMD_CFG)) \
 MOD_CFG:=$(addprefix $(DIR_PROJECT)/, $(MOD_CFG)) \
 MOD_RULE:=$(addprefix $(DIR_PROJECT)/, $(MOD_RULE))   \
 cd .. ; \
 done
 @echo  Compile Success!

  我们来看看编译结果

  我们看到 common 模块已经正确编译了,而且生成相应的 common.a 文件了。我们再继续编译别的两个模块,再通过链接的命令看看可执行程序 app.out 是否可以生成

  我们看到可执行程序 app.out 已经正确生成了。那么我们看到刚才的模块编写是直接复制之前的代码,凡是涉及到复制粘贴的代码,我们得看看是否可以封装成类似于函数的形式。在 makefile 中的代码复用规则是这样的,当不同规则中的命令大量重复时,可考虑自定义函数,makefile 中的自定义函数是代码复用的一种方式。如下

  具体思路就是:1、将编译模块的命令作为自定义函数的具体实现;2、函数参数为模块名,函数调用后编译参数指定的模块;3、在不同的规则中调用该函数。如下

  下面我们看看改变后的 makefile 是怎样的,将前面的 pro-rule.mk 改成下面这样

.PHONY : all compile link clean rebuild $(MODULES)
DIR_PROJECT := $(realpath .)
DIR_BUILD_SUB := $(addprefix $(DIR_BUILD)/, $(MODULES))
MODULE_LIB := $(addsuffix .a, $(MODULES))
MODULE_LIB := $(addprefix $(DIR_BUILD)/, $(MODULE_LIB))
APP := $(addprefix $(DIR_BUILD)/, $(APP))
define makemodule
 cd ${1}   \
 $(MAKE) all \
 DEBUG:=$(DEBUG) \
 DIR_BUILD:=$(addprefix $(DIR_PROJECT)/, $(DIR_BUILD)) \
 DIR_COMMON_INC:=$(addprefix $(DIR_PROJECT)/, $(DIR_COMMON_INC)) \
 CMD_CFG:=$(addprefix $(DIR_PROJECT)/, $(CMD_CFG)) \
 MOD_CFG:=$(addprefix $(DIR_PROJECT)/, $(MOD_CFG)) \
 MOD_RULE:=$(addprefix $(DIR_PROJECT)/, $(MOD_RULE))   \
 cd .. ;
endef
all : compile $(APP)
 @echo  Success! Target ==  $(APP) 
compile : $(DIR_BUILD) $(DIR_BUILD_SUB)
 @echo  Begin to compile ... 
 @set -e; \
 for dir in $(MODULES); \
 do \
 $(call makemodule, $$dir) \
 done
 @echo  Compile Success! 
 
link $(APP) : $(MODULE_LIB)
 @echo  Begin to link ... 
 $(CC) -o $(APP) -Xlinker  -( $^ -Xlinker  -)  $(LFLAGS)
 @echo  Link Success! 
 
$(DIR_BUILD) $(DIR_BUILD_SUB) : 
 $(MKDIR) $@
 
clean : 
 @echo  Begin to clean ... 
 $(RM) $(DIR_BUILD)
 @echo  Clean Success! 
 
rebuild : clean all
$(MODULES) : $(DIR_BUILD) $(DIR_BUILD)/$(MAKECMDGOALS)
 @echo  Begin to compile $@ 
 @set -e; \
 $(call makemodule, $@)

  编译的结果是

“makefile 模块独立编译的支持方法是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注丸趣 TV 网站,丸趣 TV 小编将为大家输出更多高质量的实用文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-04发表,共计3568字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)