构建规则“输出文件”中的表达式?

时间:2014-07-21 14:45:01

标签: xcode build-rules j2objc

您可以在Xcode的构建规则的“输出文件”部分中包含表达式吗?例如:

$(DERIVED_FILE_DIR)$(echo "/dynamic/dir")/$(INPUT_FILE_BASE).m

具体来说,在使用j2objc翻译Java文件时,生成的文件将保存在子文件夹中,基于java包(例如$(DERIVED_FILE_DIR)/com/google/Class.[hm])。这不使用--no-package-directories,由于不同包中的文件名重复,我无法使用{。}。

问题出在输出文件中,因为Xcode不知道如何在正确的位置搜索输出文件。默认位置是$(DERIVED_FILE_DIR)/$(INPUT_FILE_BASE).m,但我需要执行字符串替换以插入正确的路径。但是,添加为$(expression)的任何表达式都会被忽略,因为它从未出现过。

enter image description here

我还尝试从自定义脚本中导出变量并在输出文件中使用它,但这不起作用,因为在运行自定义脚本之前将输出文件转换为SCRIPT_OUTPUT_FILE_X

enter image description here

2 个答案:

答案 0 :(得分:1)

不幸的是,Xcode的构建支持是非常原始的(相比之下,make,这是三十多岁:-)。尝试的一个选项是拆分Java源代码,以便具有相同名称的两个类位于不同的子项目中。如果您随后为每个子项目使用不同的前缀,则名称将被消除歧义。

更脆弱但更简单的方法是为两个类中的一个定义单独的规则,以便它可以分配唯一的前缀。然后添加一个早期构建阶段,以便在任何其他Java类之前进行翻译,因此规则不会重叠。

答案 1 :(得分:0)

对我来说,第二种选择确实有效(Xcode 7.3.x) - 至关重要。 我的规则不是针对Java,而是针对Google Protobuf,我尝试在生成的代码中维护与源.proto文件中相同的层次结构(如Java包层次结构)。事实上,文件(.pb.cc和.pb.h)是按照预期创建的,它们的层次结构位于Build / Intermediates / myProject.build / Debug / DerivedSources目录中。

然而,Xcode通常知道继续并将生成的输出编译到当前目标中 - 但是它会中断,因为它只查找实际$ {DERIVED_FILE}中的文件 - 而不是在下面的子目录中。

请您解释一下“输出文件是否已转换为SCRIPT_OUTPUT_FILE_X”?我不明白。