2010-10-30 10 views
38

Me gustaría tener el mismo Makefile para construir en Linux y en Windows. Utilizo el predeterminado GNU make en Linux y el mingw32-make (también GNU make) en Windows.Makefile que se distingue entre Windows y sistemas tipo Unix

Quiero que el Makefile detecte si funciona en Windows o Linux.


Por ejemplo make clean de comandos en Windows parece:

clean: 
    del $(DESTDIR_TARGET) 

Pero en Linux:

clean: 
    rm $(DESTDIR_TARGET) 

También me gustaría utilizar diferentes separador de directorio en Windows (\) y Linux (/).


Es posible detectar el sistema operativo Windows en el Makefile?

PS: no quiero emular Linux en Windows (cygwin etc.)

No es cuestión similar: OS detecting makefile, pero que no encontrar la respuesta aquí.

+4

Windows es capaz de manejar tanto las barras "/" y "\" son equivalentes. – Ency

+0

Si esto es para un proyecto sustancial, me pregunto si valdría la pena dejar que autotools maneje algunas de las cosas de la portabilidad. – Cascabel

+0

@Jefromi: autotools asume un conjunto de herramientas básico de UNIX (sh, m4, sed, rm, ...). @tomp: también podría instalarlos en Windows (desde MSYS o GnuWin) y gastar sus esfuerzos en los problemas de portabilidad más desafiantes. – ephemient

Respuesta

38

He resuelto esto buscando una variable de entorno que sólo se fija en las ventanas.

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

Porque% SystemRoot% es la ruta hacia las ventanas del directorio se debe configurarse en todos los ordenadores Windows, pero no en Linux.

A continuación, los bloques configuran variables para los diferentes programas, así como una función para convertir las barras diagonales en barras diagonales inversas.

Debes usar $ (llamar a FixPath, ruta) cuando llamas a un comando externo (los comandos internos funcionan bien). También es posible usar algo como:

/ :=/

y luego

objs$(/)* 

si te gusta ese formato mejor.

+2

Gracias por esto. Cambio entre MinGW en Windows y GCC en Linux, esto funciona muy bien. – Imbue

+1

En mingw debe ser 'SYSTEMROOT' en mayúscula – SystemParadox

+1

También puede buscar ComSpec, que solo está definido en Windows – kebs

7

Probablemente deberías usar la variable $ (RM) para eliminar algunos archivos.

3

Me gustaría tener el mismo Makefile para construir en Linux y en Windows.

Tal vez te guste CMake

36

El SystemRoot truco no funcionó para mí en Windows XP, pero esto no hizo:

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