如何在make构建流程中打包包含预编译二进制文件
Make构建流程纳入bin目录预编译二进制的配置方案
要把存放在bin目录的预编译二进制纳入make打包流程,核心是把这些文件补进构建依赖链、加对应拷贝/安装规则、避开默认的源码编译隐式规则,不同构建体系的配置方式如下:
原生手写Makefile配置
先定义路径变量,把预编译二进制挂到主构建目标的依赖上,再加专属的拷贝规则,不要让make尝试把这些文件当源码重新编译:
# 预编译二进制源目录、构建输出目录,根据你的项目实际路径修改 PRECOMPILE_BIN_PATH := bin OUTPUT_BIN_PATH := $(BUILD_ROOT)/bin # 扫描所有需要打包的预编译文件,生成输出路径映射 PRECOMPILE_BINS := $(wildcard $(PRECOMPILE_BIN_PATH)/*) OUTPUT_BINS := $(patsubst $(PRECOMPILE_BIN_PATH)/%,$(OUTPUT_BIN_PATH)/%,$(PRECOMPILE_BINS)) # 把输出二进制列表加到主构建目标的依赖里,比如原来的all目标是all: $(TARGET),改成下面的写法 all: $(TARGET) $(OUTPUT_BINS) # 预编译二进制专属拷贝规则 $(OUTPUT_BIN_PATH)/%: $(PRECOMPILE_BIN_PATH)/% @mkdir -p $(dir $@) @cp -p $< $@ @chmod 0755 $@ # 给二进制加可执行权限,不需要可以删掉
注意:不要把bin目录加到make的隐式规则搜索路径里,否则make会尝试把这些预编译文件当C/Go等源码做编译,直接报规则不匹配的错误。如果项目里有全局的通配排除规则,记得给bin目录下的文件加白名单。
Autotools(automake/autoconf)项目配置
这类项目不要直接修改生成的Makefile,改根目录的Makefile.am即可:
- 要让
make dist打源码包的时候带上bin目录的文件,加一行配置:
EXTRA_DIST += bin/*
- 要在
make install的时候把预编译二进制装到系统bin路径,加安装规则:
precompiled_bins = bin/tool1 bin/tool2 # 替换成你实际要安装的二进制文件名 dist_bin_SCRIPTS = $(precompiled_bins)
如果预编译二进制是架构相关的,不要直接随源码包分发,建议在configure阶段加架构检测逻辑,匹配对应架构的二进制文件再执行拷贝,避免跨架构安装失败。
CMake生成Makefile场景配置
在项目的CMakeLists.txt里加对应规则即可:
# 安装阶段把bin目录下的文件拷到安装路径的bin目录,自动加可执行权限 install(DIRECTORY bin/ DESTINATION ${CMAKE_INSTALL_BINDIR} FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE PATTERN "*.md" PATTERN ".gitignore" EXCLUDE) # 排除bin目录下不需要打包的杂项文件 # 如果需要构建完成就直接把二进制拷到构建输出目录,加构建后钩子 add_custom_command(TARGET 你的主构建目标名 POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/bin $<TARGET_FILE_DIR:你的主构建目标名>/bin)
常见问题排查
- 配置完还是没打包:先检查Makefile里有没有全局的文件排除规则,比如很多项目会默认过滤非源码后缀的文件,找到对应规则给bin目录的二进制加例外即可。
- 打rpm/deb等系统包的时候漏文件:除了make规则,还要在包配置文件(.spec、DEBIAN目录下的配置)里把二进制的安装路径加进包文件列表。
- 跨架构编译打包错文件:可以在拷贝规则里加架构校验,避免把x86的二进制拷到arm产物里:
$(OUTPUT_BIN_PATH)/%: $(PRECOMPILE_BIN_PATH)/% @mkdir -p $(dir $@) @if [ "$$(file $< | grep -c $(TARGET_ARCH))" -eq 0 ]; then \ echo "架构校验失败:$< 不是$(TARGET_ARCH)架构的二进制"; \ exit 1; \ fi @cp -p $< $@ @chmod 0755 $@
内容的提问来源于stack exchange,提问作者sunknudsen
相关产品推荐
相关产品推荐

