3

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

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

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

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

在此处输入图像描述

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

在此处输入图像描述

4

2 回答 2

1

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

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

于 2014-07-21T19:50:05.430 回答
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”?我不明白。

于 2016-10-25T15:05:59.110 回答