Makefile区分Windows和类Unix系统

我想在Linux和Windows上有相同的Makefile。 我使用Linux上的默认GNU make和Windows上的mingw32-make (也是GNU make )。

我想让Makefile检测它是在Windows还是Linux上运行。


例如,在Windows上make clean命令如下所示:

 clean: del $(DESTDIR_TARGET) 

但在Linux上:

 clean: rm $(DESTDIR_TARGET) 

另外我想在Windows( \ )和Linux( / )上使用不同的目录分隔符。


在Makefile中检测Windows操作系统是可能的?

PS: 我不想在Windows上模拟Linux(cygwin等)

有一个类似的问题: 操作系统检测到makefile ,但我没有在这里find答案。

我通过寻找一个只能在windows上设置的envvariables来解决这个问题。

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

因为%SystemRoot%是Windows目录的path,应该在所有Windows计算机上设置,而不是在Linux上。

块然后为不同的程序设置variables,以及将正斜杠转换成反斜杠的function。

你必须使用$(调用FixPath,path)当你调用一个外部命令(内部命令工作正常)。 你也可以使用像这样的东西:

 / := / 

接着

 objs$(/)* 

如果你喜欢这种格式更好。

SystemRoot技巧在Windows XP上不适用于我,但是这样做:

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

您应该使用$(RM)variables来删除一些文件。

我想在Linux和Windows上有相同的Makefile。

也许你会喜欢CMake