从我的角度来看,我有一个相当复杂的Makefile。
这主要是因为我想要那里的颜色和其他不必要的东西。
总之,我可以直接回答我的问题吗:
除了Linux之外,我还支持*BSD,因此我需要检查几个地方正在使用的平台。在Makefile中可以进行条件变量赋值吗?类似于:
platform := [ $$(uname) = Linux ] && echo Linux || echo BSD or other
当然这不管用,但希望你明白我的意思。
我需要一个解决方案,既适用于BSD make
**,,也适用于GNU** make
**.**。
发布于 2018-10-20 22:18:27
BSD和GNU显然都支持!=
shell赋值操作符:
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制作函数
platform := $(if $(patsubst Linux,,$(shell uname -s)),BSD or other,Linux)
另一种方法是只依赖shell条件:
platform := $(shell [ $$(uname) = Linux ] && echo Linux || echo BSD or other)
还可以使用GNU作条件:
ifeq ($(shell uname -s),Linux)
platform := Linux
else
platform := BSD or other
endif
发布于 2018-10-23 00:42:23
使用此解决方案前要小心。
勒诺·帕卡莱的一个补充:您要分配给make变量的是shell命令,而不是shell执行它们的结果。这将严重限制你对它们的使用(基本上是食谱)。您将无法将它们用作目标、先决条件、其他变量定义、生成条件条件。
对MadScientist评论的扩展
我引述如下:
注
!=
是在4.0版本中添加到GNU中的。它不能在旧的版本中工作。
此外,我们还可以简化一些不必要的if
,我们可以像下面的方法一样,在GNU make
的所有版本上获得一个工作版本。
另一种通过外壳的方法
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中工作,所以我还不能证实这一点。
进一步测试这些系统的旧版本是必要的,因此,如果您有其中一个显着的老版本,请做测试,谢谢。
https://stackoverflow.com/questions/52912099
复制相似问题