2010-10-30 8 views
38

Je voudrais avoir le même Makefile pour construire sur Linux et Windows. J'utilise la valeur par défaut GNU make sur Linux et le mingw32-make (aussi GNU make) sur Windows.Makefile distinct entre Windows et les systèmes Unix

Je veux que le Makefile détecte s'il fonctionne sous Windows ou Linux.


Par exemple make clean commande sous Windows ressemble:

clean: 
    del $(DESTDIR_TARGET) 

Mais sous Linux:

clean: 
    rm $(DESTDIR_TARGET) 

Aussi je voudrais utiliser différents séparateurs de répertoires sous Windows (\) et Linux (/).


Il est possible de détecter le système d'exploitation Windows dans Makefile?

PS: Je ne veux pas imiter Linux sur Windows (cygwin etc.)

Il est similaire question: OS detecting makefile, mais je ne trouve pas la réponse ici.

+4

Windows est capable de gérer les deux barres obliques «/» et « \ » sont équivalents. – Ency

+0

Si c'est pour un projet important, je me demande s'il serait utile de laisser les autotools gérer certains aspects de la portabilité? – Cascabel

+0

@Jefromi: autotools suppose un jeu d'outils de base UNIX (sh, m4, sed, rm, ...). @tomp: Pourrait aussi bien les installer sur Windows (à partir de MSYS ou GnuWin) et passer vos efforts sur les problèmes de portabilité plus difficiles. – ephemient

Répondre

38

Je résolu ce problème en recherchant une variable d'env qui ne sera mis sur les fenêtres.

ifdef SYSTEMROOT 
    RM = del /Q 
    FixPath = $(subst /,\,$1) 
else 
    ifeq ($(shell uname), Linux) 
     RM = rm -f 
     FixPath = $1 
    endif 
endif 

clean: 
    $(RM) $(call FixPath,objs/*) 

Parce que% SystemRoot% est le chemin vers le répertoire Windows est doit être réglé sur tous les ordinateurs Windows mais pas sous Linux. Les blocs établissent ensuite des variables pour les différents programmes ainsi qu'une fonction pour convertir les barres obliques en barres obliques inverses.

Vous devez utiliser $ (appel FixPath, chemin) lorsque vous appelez une commande externe (les commandes internes fonctionnent correctement). Vous pouvez également utiliser quelque chose comme:

/ :=/

puis

objs$(/)* 

si vous aimez ce format mieux.

+2

Merci pour votre aide. Je passe de MinGW sous Windows à GCC sous Linux, cela fonctionne très bien. – Imbue

+1

Dans mingw, il devrait être 'SYSTEMROOT' en majuscule – SystemParadox

+1

Vous pouvez également vérifier ComSpec, qui est seulement défini sur Windows – kebs

7

Vous devez probablement utiliser la variable $ (RM) pour supprimer certains fichiers.

3

Je voudrais avoir le même Makefile pour construire sur Linux et Windows.

Peut-être que vous aimerez CMake

36

L'astuce SystemRoot n'a pas fonctionné pour moi sur Windows XP, mais cela fait:

ifeq ($(OS),Windows_NT) 
    #Windows stuff 
    ... 
else 
    #Linux stuff 
    .... 
endif