Question

J'ai un projet que je travaille à libérer qui contient en fait 3 sous-projets, qui doivent tous être compilés en une seule fois. Mon makefile ressemble à peu près comme ceci:

all: a b c

a:
    @cd a && make

b:
    @cd b && make

c:
    @cd c && make

Les projets A et B à la fois compilent bien, mais pour le 3ème projet, il me dit qu'il n'y a rien à faire, bien que le passage à la marque de répertoire C et le fonctionnement du code ne compile en fait.

Pour être un peu plus précis: Projet C dans l'exemple ci-dessus est en fait SpiderMonkey de Mozilla. Alors que A et B sont le code / makefiles que je vous ai écrit, C est juste une copie brute de SpiderMonkey du site Mozilla. La compilation en fait la commande car il est:

make JS_DIST=/usr JS_THREADSAFE=1 JS_HAS_FILE_OBJECT=1

Dans mon Makefile maître, je:

spidermonkey:
    @cd spidermonkey/src && $(MAKE) JS_DIST=/usr JS_THREADSAFE=1 JS_HAS_FILE_OBJECT=1

Lancer "make SpiderMonkey" sorties "Marque: Rien à faire pour` spidermonkey »." Comment puis-je faire pour exécuter la commande?

EDIT: Je l'ai essayé d'ajouter les lignes suivantes à mon makefile:

.PHONY: spidermonkey

En plus de renommer la règle de SpiderMonkey à sm, mais toujours pas de changement.

EDIT: Ma faute! J'avais des espaces quand j'aurais eu un onglet. doh!

Était-ce utile?

La solution

Vous avez probablement un fichier ou un répertoire au premier niveau appelé « SpiderMonkey ». Faire pense que c'est ce que son supposé créer, et comme il est déjà là, faire des arrêts.

L'une des plus importantes règles à suivre lors de l'écriture makefile est chaque cible doit créer un fichier avec le même nom que la cible . En d'autres termes, si vous avez

 a:
       <some command>

Cette commande devrait produire un seul fichier appelé "a".

Les règles qui ne produisent pas les fichiers, mais ne sont là que des espaces réservés sont appelés des cibles factices , et ils doivent être déclarés comme ceci:

 .PHONY: a

Assurez-vous ensuite toujours supposer que doit être refaits.

En outre, en règle générale ne pas utiliser "make" pour invoquer la commande make récursive, utilisez $ (MAKE) à la place .

EDIT: changé "pseudo" à "faux"

Autres conseils

Faire seulement vérifie l'existence d'un fichier (ou le répertoire) portant le même nom que la cible de la règle, et s'il y a (et il est plus récent que les dépendances), puis du point de vue de faire il n'y a plus rien à faire.

Donc, votre problème est que vous avez une règle de SpiderMonkey (sans dépendances) ainsi qu'un répertoire nommé SpiderMonkey, puis faites PENSE « la cible est déjà fait, rien à faire pour moi ». Pour vous faire faire ce que vous voulez, renommer la règle de SpiderMonkey (ou le répertoire).

En parlant de faire récursive par la manière, ce n'est pas neccessarily une bonne idée, voir récursive Faire Considered Harmful .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top