我读过一些文章,解释了在编译带有子目录的项目时递归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]
构建目标“全部”会在需要时更新依赖项文件,然后在需要时考虑重建主执行程序。
这种方法是否存在根本缺陷?
答案 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自己的恐惧被相信就像“非常教条”和“其他人信奉宗教”。“狂热的拥护者走遍了董事会!”。