Search code examples
linuxwindowsmakefileos-detection

Makefile that distinguishes between Windows and Unix-like systems


I would like to have the same Makefile for building on Linux and on Windows. I use the default GNU make on Linux and the mingw32-make (also GNU make) on Windows.

I want the Makefile to detect whether it operates on Windows or Linux.


For example make clean command on Windows looks like:

clean:
    del $(DESTDIR_TARGET)

But on Linux:

clean:
    rm $(DESTDIR_TARGET)

Also I would like to use different directory separator on Windows (\) and Linux (/).


It is possible to detect Windows operating system in Makefile?

PS: I do not want to emulate Linux on Windows (cygwin etc.)

There is similiar question: OS detecting makefile, but I didn't find the answer here.


Solution

  • I solved this by looking for an env variable that will only be set on 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/*)
    

    Because %OS% is the type of windows, it should be set on all Windows computers but not on Linux.

    The blocks then setups up variables for the different programs as well as a function for converting the forward slashes into backslashes.

    You to have to use $(call FixPath,path) when you call an outside command (internal commands work fine). You could also use something like:

    / := /
    

    and then

    objs$(/)*
    

    if you like that format better.