通过进行递归调用来建立依赖关系?

时间:2018-06-20 13:42:04

标签: c makefile

我读过一些文章,解释了在编译带有子目录的项目时递归makefile是多么邪恶。

但是,我发现了这种方便的方法来自动生成依赖项

WITH 
  tTable1 
    AS ( SELECT ACC
              , [ACTION]
              , [PRIORITY]
           FROM ( VALUES ('A', 1, 10 )
                       , ('A', 2, 15 )
                       , ('A', 3, 25 )
                       , ('B', 3, 101)
                       , ('B', 4, 102)
                       , ('B', 5, 103)
                ) tTable1(ACC, [ACTION], [PRIORITY])
       )
, tTable2
    AS ( SELECT ACC
              , [ACTION]
              , [TARGET]
           FROM ( VALUES ('A', 1   , 'i')
                       , ('A', 1   , 'j')
                       , ('A', 3   , 'k')
                       , ('B', NULL, 'l')
                       , ('B', 4   , 'm')
                       , ('B', 1   , 'n')
                ) tTable1(ACC, [ACTION], [TARGET])
       )
, tTable1Max
    AS ( SELECT ACC
              , [PRIORITY] = MAX([PRIORITY])
           FROM tTable1
          GROUP BY ACC                
       )
, tResult
    AS ( SELECT [PRIORITY] = CASE WHEN tTable2.[ACTION] IS NOT NULL
                                  THEN tTable1.[PRIORITY]
                                  ELSE tTable1Max.[PRIORITY]
                             END
              , tTable2.[TARGET]      
           FROM tTable2
                LEFT JOIN tTable1  ON tTable1.ACC       = tTable2.ACC       
                                  AND tTable1.[ACTION]  = tTable2.[ACTION]
                OUTER APPLY ( SELECT [PRIORITY]
                                FROM tTable1Max 
                               WHERE tTable1Max.ACC = tTable2.ACC
                            ) tTable1Max 
       )                          

SELECT *
  FROM tResult
 WHERE [PRIORITY] IS NOT NULL
 ORDER BY [PRIORITY]

构建目标“全部”会在需要时更新依赖项文件,然后在需要时考虑重建主执行程序。

这种方法是否存在根本缺陷?

2 个答案:

答案 0 :(得分:4)

如果您使用的是GNU make,则无需进行此破解。 GNU make是smart enough,可自动重建其中包含的任何(make)文件,然后自行重新启动:

  

由于'.d'文件是与其他文件一样的makefile,因此make会根据需要重新制作它们,而无需您进行进一步的工作。参见Remaking Makefiles

关于其他make实现,GNU make手册说:

  

对于旧的make程序,传统的做法是使用[-M]编译器功能通过“ makedepend”之类的命令按需生成先决条件。该命令将创建一个文件依赖,其中包含所有自动生成的先决条件。那么makefile可以使用include读取它们(请参见Include)。

答案 1 :(得分:0)

正如其他贡献者所述,gnu make将.d依赖文件视为Makefile,并在需要时自动重建它们。

这使得不必进行递归调用,问题也就没了。

当然,像往常一样,“被认为有害的”纸质标题必须读得一清二楚,即使是真的也要读,这要归功于悠久的传统(Knuth对Dijkstra纸质的“反驳”引述Disjktra自己的恐惧被相信就像“非常教条”和“其他人信奉宗教”。“狂热的拥护者走遍了董事会!”。