如何设置带有可变输出文件列表的Xcode构建规则?

问题描述 投票:8回答:3

[构建规则记录在Xcode Build System Guide

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

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

在我的情况下,一个输入文件被转换为数量不等的具有相同扩展名的文件。输出文件的编号和名称取决于输入文件的内容,并且事先未知。

稍后将不得不进一步处理输出文件(在这种情况下,将编译C文件)。

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

欢迎提出任何建议。

((我在Apple开发人员论坛上问了同样的问题,但我想在这里问也是一个好主意)。

xcode build-process
3个回答
2
投票

我通过处理而不是生成多个C文件,而是将它们全部串联到一个文件(例如“ AUTOGENERATED.c”)中,并将其指定为输出文件来解决。

只要您的输出文件中不包含任何会发生冲突的内容(具有相同名称的静态函数,冲突的#define等),此方法就很好用。


-1
投票

请参阅有关可可豆与爱情的文章:http://cocoawithlove.com/2010/02/custom-build-rules-generated-tables-and.html

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


-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用法,以防止每次复制文件。

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.