代码之家  ›  专栏  ›  技术社区  ›  dave mankoff

子项目的主makefile不会编译子项目

  •  2
  • dave mankoff  · 技术社区  · 15 年前

    我正在发布一个项目,实际上包含3个子项目,所有这些子项目都需要一次编译。我的生成文件大致如下:

    all: a b c
    
    a:
        @cd a && make
    
    b:
        @cd b && make
    
    c:
        @cd c && make
    

    项目A和项目B都编译得很好,但是对于第三个项目,它告诉我尽管切换到C目录并运行make实际上编译代码,但是没有什么可以做的。

    更具体一点:上面例子中的项目C实际上是Mozilla的蜘蛛猴。虽然A和B是我编写的代码/生成文件,但C只是Mozilla网站上蜘蛛猴的原始拷贝。它的实际编译命令是:

    make JS_DIST=/usr JS_THREADSAFE=1 JS_HAS_FILE_OBJECT=1
    

    在我的主制作文件中,我有:

    spidermonkey:
        @cd spidermonkey/src && $(MAKE) JS_DIST=/usr JS_THREADSAFE=1 JS_HAS_FILE_OBJECT=1
    

    运行“make spidermonkey”输出“make:对“spidermonkey”不做任何事情。”“如何让make运行该命令?”

    编辑: 我尝试将以下行添加到我的makefile中:

    .PHONY: spidermonkey
    

    以及将蜘蛛猴规则重命名为SM,但仍然没有改变。

    编辑: 我的错!我有空的时候,我应该有一个标签。呸!

    2 回复  |  直到 15 年前
        1
  •  4
  •   JesperE    15 年前

    您可能在顶层有一个名为“蜘蛛猴”的文件或目录。make认为这就是它应该创造的,因为它已经存在了,所以停止。

    编写makefile时要遵循的最重要的规则之一是 每个目标应该创建一个与目标同名的文件 . 换句话说,如果你有

     a:
           <some command>
    

    该命令应该生成一个名为“a”的文件。

    不生成文件但仅作为占位符存在的规则被调用 伪目标 ,它们应该这样声明:

     .PHONY: a
    

    make将始终假设必须重新生成a。

    此外,一般来说 不要使用“make”递归调用make,而是使用$(make) .

    编辑:将“伪”改为“假”

        2
  •  1
  •   hlovdal    15 年前

    仅检查与规则目标同名的文件(或目录)的存在性,如果存在(并且比依赖项更新),则从Make的角度看,没有其他事情可做。

    所以你的问题是你有一个蜘蛛猴规则(没有依赖性)以及一个名为蜘蛛猴的目录,然后make认为“目标已经制定,我什么都不做”。要让make做你想做的事情,请重命名spidermonkey规则(或目录)。

    说到递归,顺便提一下,这不一定是个好主意, 看见 Recursive Make Considered Harmful .