2017-10-17 44 views
0

J'écris la partie installation d'un Makefile et j'aimerais vérifier si le projet a été construit, et sinon l'installation devrait échouer. Pour ce faire, je voudrais vérifier si certains répertoires existent et sinon - échouer avec une erreur appropriée (quelque chose comme "s'il vous plaît exécuter tout d'abord").Makefile - échoue si le répertoire n'existe pas - cross plate-forme

Je veux aussi que ce Makefile fonctionne sous Linux, Windows (mingw) et MacOS.

Quelqu'un peut-il m'aider avec ceci?

Répondre

3

Si vous utilisez GNU make ou une version de faire cela prend en charge order-only prerequisites, il existe une solution naturelle. Déclarez ces répertoires en tant que pré-requis de votre cible d'installation:

install: | $(DIRS) 
    <install recipe> 

$(DIRS): 
    @echo "please run make all first" && exit 1 
1

Si vous utilisez la marque de MinGW, alors la réponse sholud être la même pour toutes les plateformes:

dirs-exist: 
     test -d dir1 || echo Run make install first && exit 2 
     test -d dir2 

Dans Pour le premier répertoire que nous utilisons le ou opérateur d'imprimer un message si le test échoue. Cependant, même si nous avons réussi à imprimer le message, nous voulons que la ligne entière échoue, nous sortons avec un code d'erreur de 2. La logique ci-dessus pourrait être appliquée à chaque répertoire si vous voulez avoir le message dans tous les cas. Si vous avez beaucoup de répertoires, une boucle comme suit pourrait fonctionner

test_dirs: 
    for d in dir1 dir2; do if test \! -d $$d; then echo run make install first; exit 2; fi 

La seule complexité serait si vous avez besoin que cela fonctionne avec nmake et cmd sur les fenêtres; On dirait que ce n'est pas un problème ici.

+0

Merci! Comment puis-je afficher un message d'erreur si l'un de ces répertoires n'existe pas? – fx23

+0

Je pense que vous avez besoin d'accolades autour de l'écho et de la sortie (en raison de la précaution de l'opérateur) ... – HardcoreHenry

1

@ La réponse de SamHarman est correcte (et il a posté plus tôt), donc vous devriez accepter sa réponse dès qu'il fixe son premier exemple. Dans tous les cas, je pensais que je poste ceci aussi bien, qui est une version légèrement plus courte et un peu plus confus de la même chose ... :-)

DIRS=dir1 dir2 dir3 

checkdirs: 
     [[ 1 ${DIRS:%= && -d %} ]] || (echo "uh oh..." && false); 

.PHONY: checkdirs