如何有条件地为Makefile(BSD + GNU)中的变量赋值?

Lin*_*eak 3 conditional makefile gnu-make bsdmake

从我的角度来看,我有一个相当复杂的Makefile。

这主要是因为我想在那里添加颜色和其他不必要的东西。

无论如何,我可以跳进我的问题:

除了Linux,我最近还支持* BSD,因此我需要检查在多个地方使用的平台。Makefile中可以进行条件变量赋值吗?就像是:


platform := [ $$(uname) = Linux ] && echo Linux || echo BSD or other
Run Code Online (Sandbox Code Playgroud)

当然这是行不通的,但是希望您能理解我的意思。


我需要一个可以与BSD make和GNU 一起使用的解决方案make

Ren*_*let 6

编辑新版本的问题(“ 对于BSD make和GNU make都适用 ”):

!=外壳赋值运算符显然都支持BSD和GNU make:

platform_id != uname -s

platform != if [ $(platform_id) = Linux ] || \
    [ $(platform_id) = FreeBSD ] || \
    [ $(platform_id) = OpenBSD ] || \
    [ $(platform_id) = NetBSD ]; then \
        echo $(platform_id); \
    else \
        echo Unrecognized; \
    fi
Run Code Online (Sandbox Code Playgroud)

请注意,赋值实际上是由Shell评估的:赋值给make变量而不是Shell命令的是评估的结果。

这是需要GNU make的解决方案。它可以在BSD上与GNU make一起使用,但不能与BSD make一起使用。

一种可能性是使用ifGNU make函数

platform := $(if $(patsubst Linux,,$(shell uname -s)),BSD or other,Linux)
Run Code Online (Sandbox Code Playgroud)

另一个是仅依赖于shell条件:

platform := $(shell [ $$(uname) = Linux ] && echo Linux || echo BSD or other)
Run Code Online (Sandbox Code Playgroud)

GNU化妆条件句也可用于:

ifeq ($(shell uname -s),Linux)
platform := Linux
else
platform := BSD or other
endif
Run Code Online (Sandbox Code Playgroud)

  • 注意 `!=` 是在 4.0 版本中添加到 GNU make 中的。它在旧版本中不起作用。 (3认同)