一尘不染

在Windows和类Unix系统之间有区别的Makefile

linux

我想要在Linux和Windows上构建的相同Makefile。我在Linux上使用默认的 GNU make, 在Windows上使用
mingw32-make (也为 GNU make )。

我希望Makefile能够检测它是否在Windows或Linux上运行。


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

clean:
    del $(DESTDIR_TARGET)

但是在Linux上:

clean:
    rm $(DESTDIR_TARGET)

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


是否可以在Makefile中检测Windows操作系统?

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


阅读 396

收藏
2020-06-03

共1个答案

一尘不染

我通过寻找仅在Windows上设置的env变量来解决此问题。

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

因为%OS%是Windows的类型,所以应该在所有Windows计算机上设置它,但不能在Linux上设置它。

然后,这些块为不同的程序设置变量,并为将正斜杠转换为反斜杠的函数设置变量。

调用外部命令时必须使用$(调用FixPath,path)(内部命令可以正常使用)。您还可以使用类似:

/ := /

然后

objs$(/)*

如果您更喜欢这种格式。

2020-06-03