Как настроить правило сборки XCode со списком выходных файлов переменных? - PullRequest
7 голосов
/ 24 февраля 2011

Правила сборки описаны в Xcode Build System Guide

Они хорошо адаптированы к общему случаю, когда один входной файл преобразуется в фиксированное число (обычно один) выходных файлов..

Выходные файлы должны быть описаны в области «Выходные файлы» определения правила, по одной строке на выходной файл.Обычно выходные файлы имеют то же имя, что и входной файл, но имеют разные расширения.

В моем случае один входной файл преобразуется в переменное число файлов с одинаковыми расширениями.Количество и имена выходных файлов зависят от содержимого входного файла и не известны заранее.

Выходные файлы должны быть дополнительно обработаны позже (в данном случае это C-файлы длябыть скомпилированным).

Как настроить правило сборки для такого случая?

Любое предложение приветствуется.

(Я задавал тот же вопрос на форуме разработчиков Apple, но я подумал, что было бы неплохо спросить и здесь).

Ответы [ 3 ]

2 голосов
/ 24 августа 2011

Я имел дело с этим, вместо того, чтобы генерировать несколько файлов C, просто объединяя их все вместе в один файл (например, «AUTOGENERATED.c»), и указав его в качестве выходного файла.

Пока ваши выходные файлы не содержат ничего, что может конфликтовать (статические функции с одинаковыми именами, конфликтующие #defines и т. Д.), Это работает хорошо.

0 голосов
/ 20 марта 2013

Лучший способ добавить любое количество файлов в мой проект xcode (и выполнить некоторую обработку) - написать небольшой скрипт php. Сценарий может просто скопировать файлы в пакет. Сложная часть - интеграция с xcode. Мне потребовалось некоторое время, чтобы найти чистый путь. (С помощью этого метода вы можете использовать язык сценариев, который вам нравится).

Сначала используйте «Add Run Script» вместо «Add Copy File»

Параметр оболочки:

/bin/sh

Параметр команды:

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

(скриншот в 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);
?>

БОНУС : здесь моя функция 'add_file'.

  • Обратите внимание на специальную обработку PNG (используйте сжатие png от Apple)
  • Обратите внимание на использование filemtime / touch для предотвращения копирования файлов каждый раз.
* +1034 * л
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;
}
0 голосов
/ 25 марта 2011

См. Эту статью о Какао с любовью:
http://cocoawithlove.com/2010/02/custom-build-rules-generated-tables-and.html

Здесь приведен пример генерации пользовательского кода C и его использования в качестве входных данных для обычного процесса сборки.Он использует переменный синтаксис $ {} в выводе

...