如何在Makefile运行时动态设置依赖?j2objc编译场景求助
解决Make动态依赖j2objc生成的.m文件问题
以下是适配你需求的Makefile实现,核心解决动态获取j2objc生成的.m文件并作为依赖的问题:
# 替换为你实际要转换的单个Java文件路径 JAVA_SRC := src/org/path/to/packages/YourTarget.java # 最终生成的静态库路径 STATIC_LIB := build/libYourLib.a # 标记文件:记录j2objc转换完成状态,避免重复执行转换 J2OBJC_STAMP := build/.j2objc_done # 默认目标:先执行j2objc转换,再递归调用Make编译打包 all: $(J2OBJC_STAMP) @$(MAKE) build_lib # 编译打包目标,依赖所有.o文件 build_lib: $(STATIC_LIB) # 静态库打包:将所有.o文件打包为静态库 $(STATIC_LIB): $(O_FILES) ar rcs $@ $(O_FILES) # 动态获取build目录下所有.m文件,并生成对应的.o文件路径 M_FILES := $(shell find ./build -name '*.m') O_FILES := $(M_FILES:.m=.o) # 模式规则:将单个.m文件编译为.o文件 %.o: %.m j2objcc -c $< -o $@ # j2objc转换目标:仅当Java源文件更新时重新执行转换 $(J2OBJC_STAMP): $(JAVA_SRC) mkdir -p build # 执行j2objc转换,自动处理依赖,生成的文件存入build目录 j2objc -d build -sourcepath src $(JAVA_SRC) touch $@ # 清理目标:删除build目录所有内容 clean: rm -rf build
关键逻辑说明
- 标记文件控制转换时机:用
$(J2OBJC_STAMP)标记转换完成状态,只有当指定的Java源文件更新时,才会重新执行j2objc转换,避免重复操作。 - 递归Make解决动态依赖:默认目标先完成j2objc转换,再递归调用Make。此时build目录已生成所有.m文件,
find命令能正确获取文件列表,生成对应的.o依赖。 - 模式规则批量编译:通过
%.o: %.m模式规则,自动将每个.m文件编译为同名.o文件,无需逐个写编译命令。 - 静态库打包:最后用
ar rcs命令将所有.o文件打包为静态库,rcs参数分别表示替换旧库内容、创建新库、生成索引。
使用方法
- 将
JAVA_SRC替换为你实际要转换的Java文件路径。 - 将
STATIC_LIB替换为你期望的静态库输出路径。 - 执行
make命令即可完成转换、编译、打包全流程;执行make clean可清理所有生成文件。
内容的提问来源于stack exchange,提问作者Thieri
相关产品推荐
相关产品推荐

