我想在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,但我在这里找不到答案。
答案 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