8
votes

Comment puis-je configurer une règle de construction Xcode avec une liste de fichiers de sortie variable?

Les règles de construction sont documentées dans Guide système de construction Xcode

Ils sont bien adaptés au cas commun où un fichier d'entrée est transformé en nombre fixe (généralement) de fichiers de sortie.

Les fichiers de sortie doivent être décrits dans la zone "Fichiers de sortie" de la définition de la règle de construction; une ligne par fichier de sortie. Typiquement, les fichiers de sortie ont le même nom que le fichier d'entrée mais ont des extensions différentes.

Dans mon cas, un seul fichier d'entrée est transformé en un nombre variable de fichiers avec les mêmes extensions. Le nombre et les noms des fichiers de sortie dépendent du contenu du fichier d'entrée et ne sont pas connus à l'avance.

Les fichiers de sortie devront être traités plus tard (ils sont dans ce cas, les fichiers C à compiler).

Comment puis-je configurer une règle de construction pour un tel cas?

Toutes les suggestions bienvenues.

(J'ai posé la même question sur le forum des développeurs Apple, mais je pensais que ce serait une bonne idée de demander ici aussi).


0 commentaires

3 Réponses :


-1
votes

Voir cet article sur le cacao avec amour:
http://cocoawithlove.com/2010/02/custom -Build-Rules-Généré-Tables-and.html

Ceci a un exemple de génération de code C personnalisé et d'utiliser cela comme entrée dans le processus de construction normal. Il utilise $ {} syntaxe variable dans la sortie


1 commentaires

Jean-Denis demande comment avoir un nombre variable de fichiers de sortie. La façon dont vous suggérez, le nombre de fichiers de sortie (et les noms d'eux aussi, dans une certaine mesure) doit être corrigé, de sorte que cela ne répond pas à la question.



2
votes

J'ai traité cela par, au lieu de générer plusieurs fichiers C, il suffit de les concaténer tous ensemble dans un seul fichier (par exemple "Autogenerated.c"), et spécifiant que comme fichier de sortie.

Tant que vos fichiers de sortie ne contiennent rien qui aura un conflit (fonctions statiques avec le même nom, conflictuel #defines, etc.) Cela fonctionne bien.


0 commentaires

-1
votes

La meilleure façon d'ajouter n'importe quel nombre de fichiers à mon projet Xcode (et à faire du traitement) est d'écrire un petit script PHP. Le script peut simplement copier des fichiers dans le paquet. La partie délicate est l'intégration avec Xcode. Il m'a fallu un peu de temps pour trouver une manière propre. (Vous pouvez utiliser la langue de script que vous aimez avec cette méthode).

Premièrement, utilisez "Ajouter un script d'exécution" au lieu de "Ajouter un fichier de copie" p>

Paramètre shell: p>

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


1 commentaires

Cette réponse ne répond pas vraiment à la question (qui concerne les règles de construction).