如何使用可变输出文件列表设置Xcode构建规则?

时间:2011-02-23 23:31:31

标签: xcode build-process

构建规则记录在Xcode Build System Guide

它们非常适合于将一个输入文件转换为固定数量(通常是一个)输出文件的常见情况。

必须在规则定义的“输出文件”区域中描述输出文件,每个输出文件一行。通常,输出文件与输入文件具有相同的名称,但具有不同的扩展名。

在我的例子中,一个输入文件被转换为具有相同扩展名的可变数量的文件。输出文件的数量和名称取决于输入文件的内容,并且事先不知道。

以后必须进一步处理输出文件(在这种情况下,它们是要编译的C文件)。

如何为这种情况设置构建规则?

欢迎任何建议。

(我在Apple开发者论坛上问了同样的问题,但我觉得在这里提问也是个好主意。)

3 个答案:

答案 0 :(得分:2)

我处理了这个问题,而不是生成多个C文件,只是将它们连接成一个文件(例如“AUTOGENERATED.c”),并将其指定为输出文件。

只要您的输出文件不包含任何会发生冲突的内容(具有相同名称的静态函数,冲突的#defines等),这就行得很好。

答案 1 :(得分:-1)

请参阅这篇关于Cocoa With Love的文章:
http://cocoawithlove.com/2010/02/custom-build-rules-generated-tables-and.html

这是一个生成自定义C代码并将其用作正常构建过程的输入的示例。他在输出中使用$ {}变量语法

答案 2 :(得分:-1)

我发现向我的xcode项目添加任意数量的文件(并进行一些处理)的最好方法是编写一个小的PHP脚本。该脚本可以简单地将文件复制到捆绑包中。棘手的部分是与xcode的集成。我花了一些时间才找到一个干净的方式。 (您可以使用此方法使用您喜欢的脚本语言。)

首先,使用“添加运行脚本”而不是“添加复制文件”

Shell参数:

/bin/sh

命令参数:

${SRCROOT}/your_script.php -s ${SRCROOT} -o ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}
exit $?

(screenshot in xcode)

$ {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'功能。

  • 请注意PNG的特殊处理(使用苹果的png压缩)
  • 请注意filemtime / touch用法,以防止每次都复制文件。

1

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;
}