2010-10-30 13 views
38

Mi piacerebbe avere lo stesso Makefile per creare su Linux e su Windows. Io uso il valore predefinito GNU make su Linux e il mingw32-make (anche GNU make) su Windows.Makefile che distingue tra sistemi Windows e Unix

Desidero che il Makefile rilevi se funziona su Windows o Linux.


Per esempio make clean comando su Windows appare come:

clean: 
    del $(DESTDIR_TARGET) 

Ma su Linux:

clean: 
    rm $(DESTDIR_TARGET) 

Inoltre vorrei usare separatore di directory diversa su Windows (\) e Linux (/).


E 'possibile rilevare il sistema operativo Windows in Makefile?

PS: Non voglio emulare Linux su Windows (cygwin ecc)

C'è domanda simile: OS detecting makefile, ma non ho trovato la risposta qui.

+4

Windows è in grado di gestire sia slash "/" e "\" sono equivalenti. – Ency

+0

Se questo è per un progetto sostanziale, mi chiedo se valga la pena di lasciare che gli autotools gestiscano alcune cose della portabilità? – Cascabel

+0

@Jefromi: autotools assume un set di strumenti UNIX di base (sh, m4, sed, rm, ...). @tomp: potrebbe anche installarli su Windows (da MSYS o GnuWin) e spendere i tuoi sforzi sui problemi di portabilità più impegnativi. – ephemient

risposta

38

Ho risolto questo con la ricerca di una variabile env che verrà impostato solo su Windows.

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/*) 

Perché% SystemRoot% è il percorso per le finestre di directory è deve essere impostato su tutti i computer Windows ma non su Linux.

I blocchi quindi configurano le variabili per i diversi programmi e una funzione per convertire le barre in barre inverse.

È necessario utilizzare $ (chiamare FixPath, percorso) quando si chiama un comando esterno (i comandi interni funzionano correttamente). Si potrebbe anche usare qualcosa come:

/ :=/

e poi

objs$(/)* 

se vi piace questo formato migliore.

+2

Grazie per questo. Passaggio tra MinGW su Windows e GCC su Linux, funziona alla grande. – Imbue

+1

In mingw dovrebbe essere 'SYSTEMROOT' in maiuscolo – SystemParadox

+1

È anche possibile controllare ComSpec, che è definito solo su Windows – kebs

7

Probabilmente dovresti usare la variabile $ (RM) per rimuovere alcuni file.

3

Mi piacerebbe avere lo stesso Makefile per creare su Linux e su Windows.

Forse gradirete CMake

36

Lo SystemRoot trucco non ha funzionato per me su Windows XP, ma questo ha fatto:

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