代码之家  ›  专栏  ›  技术社区  ›  Vlastimil Burián

如何有条件地为makefile(bsd+gnu)中的变量赋值?

  •  1
  • Vlastimil Burián  · 技术社区  · 6 年前

    我有一个(从我看来)相当复杂的makefile。

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

    不管怎样,我可以直接问一下我的问题吗:

    除了Linux之外,我新支持*bsd,因此我需要检查在几个地方使用的平台。在makefile中是否可以进行条件变量赋值?类似:


    platform := [ $$(uname) = Linux ] && echo Linux || echo BSD or other
    

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


    我需要一个解决方案,这两种方案都适用于BSD make 和GNU 制作 .

    2 回复  |  直到 6 年前
        1
  •  3
  •   Renaud Pacalet    6 年前

    编辑问题的新版本(“ 与BSD品牌和GNU品牌同时使用 “”:

    这个 != 显然,BSD和GNU Make都支持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制造的解决方案。它在BSD上与GNU Make一起工作,但不与BSD Make一起工作。

    一种可能是使用 if GNU make function :

    platform := $(if $(patsubst Linux,,$(shell uname -s)),BSD or other,Linux)
    

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

    platform := $(shell [ $$(uname) = Linux ] && echo Linux || echo BSD or other)
    

    这个 GNU make conditionals 也可用于:

    ifeq ($(shell uname -s),Linux)
    platform := Linux
    else
    platform := BSD or other
    endif
    
        2
  •  0
  •   Vlastimil Burián    6 年前

    使用此解决方案前请小心

    恭维 Renaud Pacalet :您分配给make变量的是shell命令,而不是shell执行这些命令的结果。它将严重限制你可以使用它们(基本上是食谱)。您将无法将它们用作目标、先决条件、其他变量定义、生成条件的条件。

    扩展在 MadScientist 评论

    我引述:

    注释 != 在4.0版中添加到GNU Make。它在旧版本中不起作用。

    同时也简化了一些不必要的 if S,我们可以得到一个工作版本 可能所有 GNU和BSD的版本 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中工作,所以我还不能确认这一点。


    需要对这些系统的旧版本进行进一步的测试,因此如果您有一个非常旧的系统,请进行测试,谢谢。

    推荐文章