什么命令会使工具显示?

时间:2014-12-17 16:48:28

标签: makefile

以下是我以前的考试题目,我失去了很多分数,我仍然不确定原因。

假设我有一个包含以下文件的目录:

fileB.txt  makefile  scriptC  programA.h  programA.c

makefile ,其内容如下:

fileE.txt: fileD.txt programA
      programA fileD.txt >| fileE.txt
 programA.o: programA.h programA.c
      gcc -c -Wall programA.c
 programA: programA.o
      gcc -o programA programA.o
 fileD.txt: fileB.txt scriptC
      scriptC fileB.txt >| fileD.txt
 CC=gcc
 CFLAGS=-Wall

a)第一次在命令提示符下键入make时,make工具会显示和执行哪些命令?

b)现在让我们说你更新或触摸,fileB.txt,make工具会显示哪些命令?

我无法复制程序自己尝试,因为我实际上并不知道程序在做什么。我可以预测简单的make文件的输出,但我从来没有见过像下面的那个,即使用管道和txt文件。关于这个问题的简单解释将非常有用。

3 个答案:

答案 0 :(得分:1)

fileE.txt: fileD.txt programA
     programA fileD.txt >| fileE.txt
programA.o: programA.h programA.c
     gcc -c -Wall programA.c
programA: programA.o
     gcc -o programA programA.o
fileD.txt: fileB.txt scriptC
     scriptC fileB.txt >| fileD.txt
CC=gcc
CFLAGS=-Wall

让我们试试这个现场/盲人。

  1. 此makefile的default goal/targetfileE.txt,因此make默认会尝试构建
  2. fileE.txt取决于fileD.txtprogramA
  3. make会看到fileD.txt是否存在(它没有)所以它会尝试创建它
  4. fileD.txt取决于fileB.txtscriptC
  5. 两者都已存在,因此make将运行fileD.txt的规则
    • 输出:scriptC fileB.txt >| fileD.txt
  6. 这里scriptC的作用并不重要,因为fileD.txt是由shell重定向创建的
  7. fileD.txt现在是最新的,并转到programA
  8. programA不存在,所以make尝试构建它
  9. programA取决于programA.o哪些不存在,所以make尝试构建它
  10. programA.o取决于programA.hprogramA.c
  11. 这两个都存在,所以make将运行programA.o的规则
    • 输出:gcc -c -Wall programA.c
  12. gcc创建programA.o
  13. programA.o现在是最新的,所以请继续
  14. 现在构建了programA的所有先决条件,因此make会为其运行规则
    • 输出:gcc -o programA programA.o
  15. fileE.txt的所有先决条件现在都是最新的,因此make会为其运行规则
    • 输出:programA fileD.txt >| fileE.txt
  16. make is done
  17. 总结上述步骤的输出:

    scriptC fileB.txt >| fileD.txt
    gcc -c -Wall programA.c
    gcc -o programA programA.o
    programA fileD.txt >| fileE.txt
    

    现在,如果您touch fileB.txt此时再次运行`make make:

    1. 此makefile的default goal/targetfileE.txt,因此make默认会尝试构建
    2. fileE.txt取决于fileD.txtprogramA
    3. 然后
    4. make将查看fileD.txt是否存在(确实存在)并将检查其先决条件
    5. fileB.txtfileD.txt更新,因此make会将fileD.txt标记为需要重建
    6. scriptC早于fileD.txt,但不会改变任何内容
    7. fileD.txt的先决条件现已完成,需要重建fileD.txt
      • 输出:scriptC fileB.txt >| fileD.txt
    8. fileD.txt现在是最新的,所以请继续
    9. programA早于fileE.txt(并且本身是最新的)所以请继续行动
    10. fileE.txt的所有先决条件现在都是最新的,有些已经构建并且现在更新了,因此make将运行规则来构建fileE.txt
      • 输出:programA fileD.txt >| fileE.txt
    11. 总结上述步骤的输出:

      scriptC fileB.txt >| fileD.txt
      programA fileD.txt >| fileE.txt
      

答案 1 :(得分:1)

使用以下推理/规则:

  1. 只需按照目标依赖项
  2. 如果不存在依赖项,则会生成(或者如果没有目标,则会发生错误)
  3. 如果依赖项的时间戳较新,则目标获得(重新)构建。
  4. 执行Makefile中遇到的第一个目标(如果make命令没有给出目标)
  5. 因此假设没有给出目标,则使用规则4并且fileE.txt是“活跃的”#39;目标

    fileE.txt要求fileD.txtprogramA可用(规则1)。两者都不可用,因此需要构建它们(规则2)。

    fileD.txt要求fileB.txtscriptC可用(规则1)。没有定义这些依赖项的目标,因此它们不会重建。并且fileD.txt可以构建(规则2)。

    programA要求programA.o可用(规则1)。提供了一个目标,因此可以构建programA.o(规则2)。接下来,可以构建programA(规则2)。

    现在满足fileE.txt的所有要求,因此也可以构建它。

    触及fileB.txt时也是如此,但您也需要应用规则3.

    使用这个(部分)示例和信息,您应该能够确定执行哪些命令(以及在哪个命令上)。

答案 2 :(得分:1)

a)第一次在命令提示符下键入make时,make工具会显示和执行哪些命令?

  1. 首先执行makefile中的第一个目标。这是fileE.txt
  2. 由于fileE.txt取决于fileD.txt and programA,因此这些将成为您的目标。
  3. 同样根据您的目标和依赖关系,获得最终目标。
  4. 以下是执行命令的顺序。内联评论

      
        
    1. scriptC fileB.txt> | fileD.txt / *输出是fileD.txt * /
    2.   
    3. gcc -c -Wall programA.c / 输出是programA所需的programA.o /
    4.   
    5. gcc -o programA programA.o / 输出是fileE.txt所需的programA /
    6.   
    7. programA fileD.txt> | fileE.txt / 最终输出文件fileE.txt /
    8.   

    b)现在让我们说你更新或触摸fileB.txt,make工具会显示哪些命令? 执行以下命令。

      
        
    1. scriptC fileB.txt> | fileD.txt / *输出是fileD.txt * /
    2.   
    3. programA fileD.txt> | fileE.txt / 最终输出文件fileE.txt /
    4.   

    在这种情况下,programA不会重建,因为它已经可用。