Xcode中的Target
Xcode中的Target,主要包含下面几点知识:
Target依赖
Build Phase
Build Rule
Target依赖
Target的依赖关系表示一个Target要构建成功,必先依赖于其他Target的构建成功。
一个Target可以依赖同一个工程里面的另一个Target,也可以依赖不同工程里面的Target。依赖不同工程里面的Target,叫做跨工程依赖(cross-project dependency)。
想要实现跨工程依赖,最简单的方法是先将被依赖的工程文件(.xcodeproj文件)拖到当前工程中,然后配置被依赖的Target。
Build Phase
Build Phase定义了一个Target需要构建成功,需要经历的步骤。
一个Target构建的时候,从上到下执行Build Phase。因此Build Phase的顺序时很重要的,比如,你不能没有编译就链接。但是,Xcode也允许我们改变Build Phase的顺序,只要将你想调整的Build Phase拖到想要的位置即可。
对于Build Phase,着重介绍一下Run Script。在Run Script中,Input Files并不是传递给脚本的参数,Output Files也不是告诉Xcode在哪里产生输出文件,Input Files和Output Files的作用,仅仅是告诉Xcode,当Input Files修改日期比Output Files新时,就需要运行脚本。如果Input Files和Output Files有一个不指定,那么脚本每次都会执行。因此,指定输入文件和输出文件,Xcode并不会自动读入文件,并输出文件到指定位置,这些都需要你在脚本里面完成。同时,在脚本里面,可以访问build settings当中的变量。
Build Rule
Build Rule定义了对于某一个类型的文件,需要进行的特殊处理。比如,你可能需要对于.c文件用自己定义个编译器编译,那么,就可以通过Build Rule来达到;如果一中文件类型需要转换成另一种文件类型,也可以使用Build Rule。
Build Rule分位系统定义的Build Rule和自定义的Build Rule,自定义的Build Rule优先级总是大于系统定义的Build Rule。Xcode在匹配Build Rule时,总是根据Build Rule定义的顺序,匹配第一个符合定义的Build Rule,这就是说,如果有两个完全相同的Build Rule,那么在前的Build Rule将被匹配。
一个Build Rule被同一个Target的所有Build Phase所共享,无法为同一个Target的不同Build Pahse定义不同的Build Rule。
在执行Build Rule的脚本的时候:
1 当前目录被设置为project folder(即包含工程文件.xcodeproj的文件夹)
2 许多与输入文件和输出文件有关的环境变量被设置,可以再脚本中使用,相关环境变量(只是一部分)如下表:
对于Build Rule中的输出文件,如果你的目的是将输出文件写到Target的build产物中,那么输出文件应该指定为TARGET_BUILD_DIR,如果你的输出文件只是作为中间文件,那么输出文件应该指定为 DERIVED_FILES_DIR。指定输出文件的目的,是为了告诉Xcode到哪里寻找这些输出文件,以便后续利用。举个例子,如果一个Build Rule将XML编译成LEX文件,而后续的Build Rule会降LEX文件编译成.c文件,那么,Xcode就会根据第一个Build Rule指定的LEX输出文件位置,作为第二个Build Rule的输入。