4

Dans mon projet, un certain nombre de chemins vers divers répertoires, fichiers et autres composants du système sont stockés sous la forme #define dans un filenames.h, un fichier inclus par tous ceux qui en ont besoin. Cela fonctionne bien pour tous les binaires différents générés par la compilation, mais le projet inclut également quelques scripts shell qui utilisent les mêmes chemins. Actuellement, cela signifie que comme un chemin change, tout ce que j'ai à faire est d'éditer filenames.h et recompiler pour obtenir l'ensemble des exécutables pour comprendre le nouveau chemin, mais je dois éditer chaque script de shell à la main. Donc, la question est, comment faire le #defines en variables shell, par exemple en générant un script filenames.sh qui serait appelé à partir d'autres scripts pour les initialiser. Ainsi, par exemple:Exporter C#defines en tant que variables shell

#define TMP_PATH  "/ait/tmp/" 
#define SYNCTMZFILE TMP_PATH "sync_tmz" 

créerait

TMP_PATH="/ait/tmp/" 
SYNCTMZFILE="/ait/tmp/sync_tmz" 

Bien sûr, il serait possible d'écrire un C programme qui crée (même l'imprime sur la sortie standard, puis de l'exécuter en contre-apostrophes dans la coquille) mais je préférerais une méthode plus simple et plus robuste, par exemple, écrire une demi-coquille en demi-C comme chose qui traverserait cpp créerait la bonne sortie, ou quelque chose de semblable.

Répondre

1

Mettre dans votre Makefile:

filenames.sh: filenames.h 
     awk '/^#define/{print;printf "_%s=%s\n",$2,$2}' $< \ 
     | cpp -P \ 
     | sed 's/^_//;s/" "//;' > [email protected] 
+0

Malheureusement, il ne fait pas un très bon travail d'instructions composées comme dans le second #define. –

+0

Ma réponse éditée devrait fonctionner mieux. – mouviciel

1

L'inverse - conserver le maître en tant que script shell et en générer un en-tête - serait plus facile. Si votre en-tête est très stylisé, vous pouvez écrire un script shell (ou utiliser awk/sed/perl/...) pour l'analyser et générer le fragment de shell.

0

Si vous construisez votre programme en utilisant make et les scripts shell sont exécutés par make dans le cadre de votre processus de construction, vous pouvez tourner autour de:

  • Source unique les variables dans votre Makefile.
  • Exportez-les dans l'environnement pour les scripts shell.
  • Transmettez-les au compilateur C en tant qu'options de ligne de commande. (Cela suppose que votre compilateur prend en charge le -D parameter ou quelque chose de similaire.)

Exemple (non testé):

export TMP_PATH := /ait/tmp/ 
export SYNCTMZFILE := $(TMP_PATH)sync_tmz 
CFLAGS += -DTMP_PATH="$(TMP_PATH)" -DSYNCTMZFILE="$(SYNCTMZFILE)" 

Si vous n'utilisez pas make, l'option -D peut encore être utile pour vous: vous Il est possible que les variables soient stockées dans un script shell plutôt que dans un fichier d'en-tête.

+0

CFLAGS comme cela ne peut pas reconstruire des objets pour la compilation incrémentielle lorsque les chemins changent. Cela dépend du makefile. Peut-être préférable de générer un en-tête C à partir de Make ou d'un script qu'il appelle. – blueshift

Questions connexes