Makefile,用于区分Windows和类Unix系统

时间:2010-10-30 13:13:16

标签: linux windows makefile os-detection

我想在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等)

有类似的问题:OS detecting makefile,但我在这里找不到答案。

5 个答案:

答案 0 :(得分:43)

我通过寻找一个只能在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$(/)*

如果您更喜欢这种格式。

答案 1 :(得分:38)

SystemRoot技巧在Windows XP上对我没有用,但确实如此:

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

答案 2 :(得分:8)

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

答案 3 :(得分:3)

  

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

也许你会喜欢CMake

答案 4 :(得分:1)

检查WINDIR或COMSPEC是区分大小写的。相反,我来了 通过以下解决方案,希望有一天能对某人有所帮助:

# 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