有两个极端:喜欢在任何事情上都使用 Xcode 的人,以及倾向于避免使用 Xcode 的人,除了只能通过它完成的工作。这是一个不喜欢所有 Xcode 的非 IDE 功能的开发人员的答案:我不知道你的确切问题的答案,我什至不想知道,因为我尽量避免将 Xcode 用于超出它的任何东西默认功能。
就我收到您的问题而言,您有一些 IN 内容,您想对其进行一些处理,以便处理会产生一些 OUT 内容。我们称之为Subproject:包含IN、OUT 和处理的东西:IN -> OUT。并且您希望此处理是增量的:如果已经完成,请不要重复相同的工作,即如果 OUT 存在且 IN 未修改,请不要执行处理 IN -> OUT,因为结果已经存在。
对于这种任务,我使用 Make(任何其他 构建系统 都可以,例如 Ninja),这正是完成这项工作的工具:你描述你需要什么,描述你拥有什么,然后转换过程,它可以工作并为您提供增量处理。
无需在运行脚本阶段修改 Xcode 的构建阶段,您只需输入 cd Subproject; make 并通过编写正确的 Makefile 将与您的 IN -> OUT 处理相关的所有内容委托给 Make。 Xcode 中唯一保留的内容是 Run Script 阶段,该阶段将您的构建规则委托给 Make。
我创建了解决您的问题的示例,并演示了将基于 Make 的子项目集成到 Xcode 项目中:Xcode and Make。
├── README.md
├── Subproject
│ ├── Generated-Code
│ │ ├── file1.out
│ │ ├── file2.out
│ │ └── file3.out
│ ├── Makefile
│ └── Source
│ ├── file1.in
│ ├── file2.in
│ └── file3.in
└── Xcode-and-Make
├── Xcode-and-Make
│ └── main.m
└── Xcode-and-Make.xcodeproj
└── project.pbxproj
自定义的东西被隔离在子项目文件夹中。此文件夹包含在 Xcode 项目中: Generated-Code .out 文件包含在项目的主要目标中,*.in 文件不包含,Makefile 也不包含。
在项目的运行脚本阶段,只有对 Make 的调用:
cd ../Subproject
make
所有Source/*.in -> Generated-Code/*.out 处理都在 Makefile 中完成,其编写如下:
IN_PATH=./Source
IN_FILES=$(wildcard $(IN_PATH)/*.in)
OUT_PATH=./Generated-Code
OUT_FILES := $(patsubst %, $(OUT_PATH)/%, $(notdir $(IN_FILES)))
OUT_FILES := $(patsubst %.in, %.out, $(OUT_FILES))
default: generate
generate: $(OUT_FILES)
clean:
rm -rf $(OUT_PATH)
$(OUT_PATH)/%.out: $(OUT_PATH) $(IN_PATH)/%.in
cp -v $(IN_PATH)/$*.in $(OUT_PATH)/$*.out
$(OUT_PATH):
mkdir -p $(OUT_PATH)
如果您是 Make 新手,所有这些符号一开始可能会令人困惑,但在阅读有关 Make 的教程一天后,您将对 Make 的工作原理有基本的了解。
编写此Makefile 是为了给您提供增量处理:cp 只是一个简单的演示操作,它将*.in 复制到*.out - 在实际应用中它可以是编译器或其他一些工具。
当您在Subproject 文件夹中您第一次看到make 时:
Subproject$ make
mkdir -p ./Generated-Code
cp -v ./Source/file1.in ./Generated-Code/file1.out
./Source/file1.in -> ./Generated-Code/file1.out
cp -v ./Source/file2.in ./Generated-Code/file2.out
./Source/file2.in -> ./Generated-Code/file2.out
cp -v ./Source/file3.in ./Generated-Code/file3.out
./Source/file3.in -> ./Generated-Code/file3.out
但在第二次运行时你会得到:
Subproject$ make
make: Nothing to be done for `default'.
这是因为 Make 很聪明地理解您没有对任何 *.in 文件进行任何修改,因此要使 Make 再次执行其处理,您需要在 *.in 文件中实际执行一些更改,这是正是您最初的问题。
我认为示例项目是最好的展示,所以请随意决定这偏离 Xcode 的默认设置是否会让您感到舒服,如果您有任何其他问题,请随时询问。
免责声明:我已经使用 Make 2 年了(几乎)所有涉及构建 Xcode 无法处理的东西,所以我强烈建议您学习 Make 的基础知识:它可以是构建脚本的非常强大的工具,其中增量处理很高兴拥有。