Makefile忽略先决条件的先决条件

时间:2017-11-10 07:32:47

标签: python makefile continuous-integration

我有一个非常具体的问题。我正在尝试分发一个python包(egg)并让开发人员的生活更轻松我已经开发了Makefile

我的发行版包含代码(Python源文件)和一些构建Dokumentation(HTML,PDF,...)。

因此,我在Makefile

中有这些目标
doc/admin/html: doc/admin/src/*
    echo "Build the HTML doc..."

doc/admin/pdf: doc/admin/src/*
    echo "Build the PDF doc..."

doc: doc/admin/html doc/admin/pdf

$(PACKAGE).egg: doc/admin/html doc/admin/pdf src/*
    echo "Build the egg..."

egg: $(PACKAGE).egg

到目前为止效果很好。一旦开发人员更改了源文件或文档,他/她就可以使用doc目标和/或egg目标的整个分发来重建文档。

现在我的问题:我有另一个目标test_egg来测试分发。 目前我的目标定义如下:

test_egg: $(PACKAGE).egg
    echo "Test the egg..."

此目标应由开发人员和CI执行。 问题是:在CI期间,$(PACKAGE).egg文件将由另一个作业构建,然后传输到测试环境(我正在使用gitlab-ci)。因此,在此测试环境中,$(PACKAGE).egg存在,但文档的doc/admin/htmldoc/admin/pdf文件夹不存在。他们不需要这个目标,因为它们只是鸡蛋的中间文件。

我现在的问题是:如何定义test_egg目标以使其执行 在$(PACKAGE).egg存在时,不试图重建文档?

我知道,我可以将doc/admin/*文件夹定义为INTERMEDIATE,但这会阻止开发人员使用doc目标构建文档。

感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

最好是避免将org.apache.spark.sql.catalyst.parser.ParseException: Operation not allowed: STORED BY(line 1, pos 42) 声明为$(PACKAGE).egg的先决条件。有几种方法可以做到这一点。

  1. 您可以使用make conditionals为test_egg实例化不同的食谱:

    test_egg
  2. 您可以在配方中使用make test_egg: ifeq ($(wildcard $(PACKAGE).egg),) $(error Ooops!) else echo "Test the egg..." endif 功能:

    if
  3. 您可以使用shell的条件:

    test_egg:
        $(if $(wildcard $(PACKAGE).egg),,$(error Ooops!))
        echo "Test the egg..."
    
  4. 在所有情况下,如果test_egg: [ -e $(PACKAGE).egg ] || { echo "Ooops!" && exit -1; } echo "Test the egg..." 不存在,则$(PACKAGE).egg目标将失败并显示错误消息。如果test_egg存在,$(PACKAGE).egg目标将会运行,但test_egg将不会更新,即使它已过时。

    使用示例:

    $(PACKAGE).egg