web-dev-qa-db-fra.com

Makefile qui fait la distinction entre les systèmes Windows et Unix

Je voudrais avoir le même Makefile pour construire sur Linux et sur Windows. J'utilise la valeur par défaut GNU make sous Linux et la mingw32-make (aussi GNU make) sous Windows.

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


Par exemple make clean la commande sous Windows ressemble à:

clean:
    del $(DESTDIR_TARGET)

Mais sous Linux:

clean:
    rm $(DESTDIR_TARGET)

Je voudrais également utiliser un séparateur de répertoires différent sous Windows (\) et Linux (/).


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

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

Il y a une question similaire: OS détectant le makefile , mais je n'ai pas trouvé la réponse ici.

42
Tom Pažourek

J'ai résolu cela en recherchant une variable env qui ne sera définie que sur Windows.

ifdef OS
   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% OS% est le type de fenêtres, il doit être défini sur tous les ordinateurs Windows mais pas sur Linux.

Les blocs configurent ensuite des variables pour les différents programmes ainsi qu'une fonction pour convertir les barres obliques en barres obliques inverses.

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

/ := /

puis

objs$(/)*

si vous préférez ce format.

42
Paul Hutchinson

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

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

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

8
Antoine Pelisse

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

Peut-être que vous aimerez CMake

3
Mads Elvheim

La vérification de WINDIR ou COMSPEC est sensible à la casse. Au lieu de cela, j'ai trouvé la solution suivante, j'espère que cela aidera quelqu'un un jour:

# detect if running under unix by finding 'rm' in $PATH :
ifeq ($(wildcard $(addsuffix /rm,$(subst :, ,$(PATH)))),)
WINMODE=1
else
WINMODE=0
endif

ifeq ($(WINMODE),1)
# native windows setup :
UNLINK = del $(subst /,\,$(1))
CAT = type $(subst /,\,$(1))
else
# cross-compile setup :
UNLINK = $(RM) $(1)
CAT = cat $(1)
endif
1
sezero