2017-09-07 1 views
1

J'ai un grand projet sur lequel je travaille, dans lequel je veux effectuer include à un fichier .mak, mais seulement après avoir apporté des modifications à ce fichier contenu via une commande dans le makefile d'origine. Comme c'est un grand projet, il sera difficile d'écrire du code, donc je vais donner cet exemple ridicule à la place:makefile: effectuer une inclusion dans un fichier .mak après une certaine action

J'ai un petit projet C que tout son C et les fichiers d'en-tête sont dans le même répertoire, et j'ai besoin d'écrire un fichier makefile. Je ne suis pas autorisé à utiliser la règle clean dans le makefile que j'écris, mais j'ai un fichier nommé file.mak que je peux inclure dans mon makefile. Contenu de file.mak:

.PHONY: clean 

cleam: 
    $(RM) $(objs) test 

Le problème ici est que la règle est cleam et non clean. Je ne suis pas autorisé à changer manuellement file.mak, mais je suis autorisé à le faire avec une commande dans le makefile original. Cela peut se faire facilement par:

sed -i 's/cleam/clean/g' file.mak 

Je pensais d'écrire le makefile comme ceci:

CC = gcc 
srcs = $(wildcard ./*.c) 
objs = $(srcs:.c=.o) 


test: $(objs) change_file include_file 
    $(CC) $^ -o [email protected] 

%.o: %.c 
    $(CC) -c $< -o [email protected] 

change_file: 
    $(shell sed -i 's/cleam/clean/g' file.mak) 

include_file: change_file 
    include file.mak 

Mais je reçois l'erreur suivante:

include: Command not found     

Je comprends qu'il y est un problème d'utilisation d'inclure dans une règle, est-il donc un moyen d'atteindre ce que je veux?

Répondre

1

(GNU) make a une caractéristique Remaking Makefiles qui peut être utilisée pour des scénarios comme celui-ci, mais votre approche est erronée. include est une directive et ne peut pas être utilisé dans une recette.

Au lieu de cela, lorsque vous include un fichier, make vérifie d'abord pour la création de règles ce fichier exact et les exécute. Comme dans votre cas, le fichier que vous voulez inclure existe déjà, vous devez faire cette règle .PHONY pour forcer son exécution. Il ressemblerait à ceci:

.PHONY: file.mak 

file.mak: 
    sed -i 's/cleam/clean/g' file.mak 

include file.mak 

Comme une alternative plus robuste (sans la nécessité d'une règle phony ), envisager la création d'une version fixe (copie) et comprennent ceci:

file_fixed.mak: file.mak 
    sed -e 's/cleam/clean/g' <file.mak >file_fixed.mak 

include file_fixed.mak 
+0

Puis-je ajouter aussi bien et bien documenté que make est, finalement, c'est un outil de niveau trop bas, et je suggèrerais la génération de makefiles par des outils comme CMake. Ils ont été utilisés assez longtemps pour être fiables et prévisibles. A MON HUMBLE AVIS. –

+0

En utilisant mon propre système de construction ** seulement ** sur GNU make, je ne suis pas d'accord avec ça :) Mais je dois admettre que la quantité d'apprentissage est importante pour utiliser GNU correctement et de manière flexible et beaucoup pourraient le trouver plus facile à utiliser des outils supplémentaires ... juste à mon humble avis à partir de GNU autotools, ou vous pourriez perdre vos cheveux :) –

+0

Le problème avec Autotools est une fois que vous allez Autotools dur, il mange beaucoup de votre temps, vous devez absolument justifier en utilisant des autotools de tout. Pour moi, c'est simple: combien de lignes de code dois-je maintenir? "mon propre système de construction" va exactement à l'encontre de cette approche. si vous le faites, et vous avez convaincu votre client/employeur de vous laisser le faire .... bon pour vous. Soyons clairs: ce n'est pas dans leur meilleur intérêt. (sauf si vous êtes l'auteur de projets ouverts comme scons, cmake, ou tous ces nouveaux trucs dont je ne me souviens plus des noms) –