Pregunta

Me gustaría tener el mismo Makefile para la construcción en Linux y en Windows. Yo uso el valor por defecto GNU make en Linux y el mingw32-make (también GNU make ) en Windows.

Quiero que el Makefile para detectar si funciona en Windows o Linux.


Por ejemplo para el comando make clean en la apariencia de Windows como:

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: (. Cygwin etc) no quiero emular Linux en Windows

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

¿Fue útil?

Solución

I resolvió este problema en busca de una variable de entorno que sólo se encuentra en las ventanas.

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

Debido% OS% es el tipo de ventanas, se debe establecer en todos los ordenadores de Windows, pero no en Linux.

Los bloques continuación configuraciones hasta las variables de los diferentes programas, así como una función para convertir las barras diagonales en las barras invertidas.

a tiene que utilizar $ (FixPath llamada, ruta) cuando se llama a un comando externo (comandos internos de trabajo fino). También es posible usar algo como:

/ := /

y

objs$(/)*

si te gusta ese formato mejor.

Otros consejos

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

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

Probablemente debería utilizar el $ (RM) variable para eliminar algunos archivos.

  

Me gustaría tener el mismo Makefile para la construcción en Linux y en Windows.

Tal vez te guste CMake

Comprobación WINDIR o COMSPEC entre mayúsculas y minúsculas. En su lugar, se me ocurrió con la siguiente solución, la esperanza de que ayude a alguien algún día:

# 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top