首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >区分Windows和类Unix系统的Makefile

区分Windows和类Unix系统的Makefile
EN

Stack Overflow用户
提问于 2010-10-30 13:13:15
回答 5查看 45K关注 0票数 55

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

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

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

代码语言:javascript
复制
clean:
    del $(DESTDIR_TARGET)

但是在Linux上:

代码语言:javascript
复制
clean:
    rm $(DESTDIR_TARGET)

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

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

PS:我不想模仿Windows上的Linux (cygwin等)

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-12-22 16:15:35

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

代码语言:javascript
复制
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)。您还可以使用以下内容:

代码语言:javascript
复制
/ := /

然后

代码语言:javascript
复制
objs$(/)*

如果你更喜欢那种格式的话。

票数 55
EN

Stack Overflow用户

发布于 2011-06-16 12:19:51

Windows上的SystemRoot技巧并不适用于我,但这确实适用于我:

代码语言:javascript
复制
ifeq ($(OS),Windows_NT)
    #Windows stuff
    ...
else
    #Linux stuff
    ....
endif
票数 46
EN

Stack Overflow用户

发布于 2010-10-30 13:23:34

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

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4058840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档