[构建规则记录在Xcode Build System Guide中
它们非常适合将一个输入文件转换为固定数量(通常一个)的输出文件的常见情况。
必须在构建规则定义的“输出文件”区域中描述输出文件;每个输出文件一行。通常,输出文件与输入文件具有相同的名称,但具有不同的扩展名。
在我的情况下,一个输入文件被转换为数量不等的具有相同扩展名的文件。输出文件的编号和名称取决于输入文件的内容,并且事先未知。
稍后将不得不进一步处理输出文件(在这种情况下,将编译C文件)。
如何为这种情况设置构建规则?
欢迎提出任何建议。
((我在Apple开发人员论坛上问了同样的问题,但我想在这里问也是一个好主意)。
我通过处理而不是生成多个C文件,而是将它们全部串联到一个文件(例如“ AUTOGENERATED.c”)中,并将其指定为输出文件来解决。
只要您的输出文件中不包含任何会发生冲突的内容(具有相同名称的静态函数,冲突的#define等),此方法就很好用。
请参阅有关可可豆与爱情的文章:http://cocoawithlove.com/2010/02/custom-build-rules-generated-tables-and.html
这有一个生成自定义C代码并将其用作正常构建过程的输入的示例。他在输出中使用$ {}变量语法
我发现向我的xcode项目添加任意数量的文件(并进行一些处理)的最佳方法是编写一个小的php脚本。该脚本可以简单地将文件复制到捆绑软件中。棘手的部分是与xcode的集成。我花了一些时间找到一种干净的方法。 (您可以在此方法中使用所需的脚本语言)。
首先,使用“添加运行脚本”而不是“添加复制文件”
Shell参数:
/bin/sh
命令参数:
${SRCROOT}/your_script.php -s ${SRCROOT} -o ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}
exit $?
$ {SRCROOT}是您的项目目录。
$ {CONFIGURATION(...)是分发包目录。正是您需要的东西:)
这样,您的脚本返回代码可以停止xcode构建(成功使用die(0),失败则使用die(1)),脚本的输出将在xcode的构建日志中可见。
您的脚本将如下所示:(不要忘记chmod + x)
#!/usr/bin/php
<?php
error_reporting(E_ALL);
$options = getopt("s:o:");
$src_dir = $options["s"]."/";
$output_dir = $options["o"]."/";
// process_files (...)
die(0);
?>
BONUS:这是我的“ add_file”功能。
l
define("COPY_PNG", "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/copypng -compress");
function add_file_to_bundle($output_dir, $filepath) {
// split path
$path_info = pathinfo($filepath);
$output_filepath = $output_dir.$path_info['basename'];
// get file's dates of input and output
$input_date = filemtime($filepath);
$output_date = @filemtime($output_filepath);
if ($input_date === FALSE) { echo "can't get input file's modification date"; die(1); }
// skip unchanged files
if ($output_date === $input_date) {
//message("skip ".$path_info['basename']);
return 0;
}
// special copy for png with apple's png compression tool
if (strcasecmp($path_info['extension'], "png") == 0) {
//message($path_info['basename']." is a png");
passthru(COPY_PNG." ".escapeshellarg($filepath)." ".escapeshellarg($output_filepath), $return_var);
if ($return_var != 0) die($return_var);
}
// classic copy
else {
//message("copy ".$path_info['basename']);
passthru("cp ".escapeshellarg($filepath)." ".escapeshellarg($output_filepath), $return_var);
if ($return_var != 0) die($return_var);
}
// important: set output file date with input file date
touch($output_filepath, $input_date, $input_date);
return 1;
}