首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何有条件地将值赋给Makefile (BSD + GNU)中的变量?

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

Stack Overflow用户
提问于 2018-10-20 20:21:58
回答 2查看 8.1K关注 0票数 7

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

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

总之,我可以直接回答我的问题吗:

除了Linux之外,我还支持*BSD,因此我需要检查几个地方正在使用的平台。在Makefile中可以进行条件变量赋值吗?类似于:

代码语言:javascript
运行
AI代码解释
复制
platform := [ $$(uname) = Linux ] && echo Linux || echo BSD or other

当然这不管用,但希望你明白我的意思。

我需要一个解决方案,既适用于BSD make**,,也适用于GNU** make**.**。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-20 22:18:27

BSD和GNU显然都支持!= shell赋值操作符:

代码语言:javascript
运行
AI代码解释
复制
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

注意,赋值实际上是由shell计算的:分配给make变量的是此评估的结果,而不是shell命令。

需要GNU make的解决方案。它适用于BSD上的GNU make,但不适用于BSD make。

一种可能是使用GNU制作函数

代码语言:javascript
运行
AI代码解释
复制
platform := $(if $(patsubst Linux,,$(shell uname -s)),BSD or other,Linux)

另一种方法是只依赖shell条件:

代码语言:javascript
运行
AI代码解释
复制
platform := $(shell [ $$(uname) = Linux ] && echo Linux || echo BSD or other)

还可以使用GNU作条件

代码语言:javascript
运行
AI代码解释
复制
ifeq ($(shell uname -s),Linux)
    platform := Linux
else
    platform := BSD or other
endif
票数 12
EN

Stack Overflow用户

发布于 2018-10-23 00:42:23

使用此解决方案前要小心。

勒诺·帕卡莱的一个补充:您要分配给make变量的是shell命令,而不是shell执行它们的结果。这将严重限制你对它们的使用(基本上是食谱)。您将无法将它们用作目标、先决条件、其他变量定义、生成条件条件。

MadScientist评论的扩展

我引述如下:

!=是在4.0版本中添加到GNU中的。它不能在旧的版本中工作。

此外,我们还可以简化一些不必要的if,我们可以像下面的方法一样,在GNU make的所有版本上获得一个工作版本。

另一种通过外壳的方法

代码语言:javascript
运行
AI代码解释
复制
platform_id = $$( uname -s )

platform = $$( \
    case $(platform_id) in \
        ( Linux | FreeBSD | OpenBSD | NetBSD ) echo $(platform_id) ;; \
        ( * ) echo Unrecognized ;; \
    esac )

重要注释:

  • 您需要在这里使用标准的=懒散作业。对于即时赋值操作符:=,它在BSD中不工作。
  • 您需要在( ... )语句中使用case。否则,它将无法在OpenBSD上工作。

在以下方面成功试验:

我仍然在努力使NetBSD 8.0在VirtualBox中工作,所以我还不能证实这一点。

进一步测试这些系统的旧版本是必要的,因此,如果您有其中一个显着的老版本,请做测试,谢谢。

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

https://stackoverflow.com/questions/52912099

复制
相关文章

相似问题

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