【问题标题】:Wrap a scons build process in a Makefile将 scons 构建过程包装在 Makefile 中
【发布时间】:2015-02-21 12:09:09
【问题描述】:

我写了一个 scons 构建链形式的一个小 C 项目,但恐怕用户不喜欢被告知“你应该先安装 SCons。此外,它真的很酷!” (尤其是我的教授,因为他有点像老派)。

有没有一种方法可以设置一个包装 scons 的 Makefile,而不需要将它安装在目标系统上?

【问题讨论】:

    标签: makefile scons


    【解决方案1】:

    在前段时间寻找这样的解决方案后,我最终为此编写了一个 Makefile。

    因为 SCons 还作为一个插入式用户空间包 scons-local(请参阅 download page)提供,因此可以获取并运行它。这是我的 Makefile 的剖析和注释版本,我还以gist 的形式上传。

    all: get_scons
           @$(SCONS_EXE)
    

    ↑ 默认操作取决于scons 是否可用,并且只需运行 scons 命令(在脚本后面设置)(@ 符号阻止 make 打印命令)

    SCONS_VERSION=2.3.4
    
    scons-local-%.tar.gz:
        curl -L http://sourceforge.net/projects/scons/files/scons-local/$(SCONS_VERSION)/scons-local-$(SCONS_VERSION).tar.gz > scons-local-$(SCONS_VERSION).tar.gz
        touch scons-local-$(SCONS_VERSION).tar.gz
    
    scons-local: scons-local-$(SCONS_VERSION).tar.gz
        mkdir -p scons-local
        tar xzf scons-local-$(SCONS_VERSION).tar.gz --directory scons-local
        touch scons-local
    

    ↑ 设置获取tarball的规则并解压到scons-local目录

    NATIVE_SCONS=$(strip $(shell which scons 2>/dev/null))
    
    ifeq ($(NATIVE_SCONS),)
    SCONS_EXE=python2 ./scons-local/scons.py
    get_scons: scons-local
        @echo "Couldn't find an installation of SCons, using a local copy"
    else
    SCONS_EXE=$(NATIVE_SCONS)
    get_scons:
        @echo "Found SCons installation at $(SCONS_EXE)"
    endif
    

    ↑ 在搜索路径中查找scons 可执行文件(使用which 命令):如果可用,则设置get-scons 目标以简单地打印它可用。相反,如果它不可用,则创建 get-scons 目标,指示它依赖于之前定义的 scons-local 目标。

    clean:
        $(SCONS_EXE) -c
        rm -rf scons-local
        rm -f scons-local-*.tar.gz
    
    .PHONY: all clean get_scons
    

    ↑ 最后,设置委托给 scons 的 clean 目标,然后删除本地安装。 .PHONY 规则告诉make 以下规则与正在创建的文件不对应。

    此时,可以添加更多此类代理规则:

    mytarget: get_scons
        @$(SCONS_EXE) mytarget
    

    这将调用具有相应目标的 scons。

    希望这很有用,如果有问题,请随时纠正我(我实际上不是 Makefile 专家,我试图通过使用 SCons 来避免成为专家:P)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-26
      • 2021-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多