我希望在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(/)上使用不同的目录分隔符.


It is possible to detect Windows operating system in Makefile?

PS:I do not want to emulate Linux on Windows (cygwin etc.)

还有一个类似的问题:OS detecting makefile,但我在这里没有找到答案.

推荐答案

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

如果你更喜欢这种格式.

Linux相关问答推荐

通过ssh传输参数时避免字符串拆分

Bash:将多行转换为单行的命令

在 bash 中使用 tee 时如何返回错误代码

为什么当凭证助手设置为存储 SSH 远程存储库时 git pull 不使用 .git-credentials

从 bash shell 等效项在fish shell 上设置 $ANDROID_SDK_ROOT

nohup 是否可以跨管道工作?

Stripping linux 共享库

如何在python中检索进程开始时间(或正常运行时间)

使用 AWS cli 从 AWS 机密管理器解析机密

如何更改某些文件模式/扩展名的权限?

如何优雅地退出 X11 事件循环?

为什么这个命令会杀死我的 shell?

如何获取WiFi网络接口的MAC地址?

如何在 Linux 中查找所有以 .rb 结尾的文件?

如何从 Linux 中的用户空间访问物理地址?

用于 ssh 的类似 teamviewer 的工具?

C++:使用 longjmp 和 setjmp 安全吗?

当将信号量减为零的进程崩溃时,如何恢复信号量?

Python日志(log)记录 - 判断日志(log)文件的位置?

当我已经 ssh 进入远程机器时,如何 scp 回到本地?