源和对象后缀相同时如何指定makefile依赖?

How to specify makefile dependencies when source and object suffixes are the same?

我正在使用 GNU Make 4.0 在 IBM i 上编译对象。大多数项目都正常且无冲突(.c 编译为 .module.pf 编译为 .file),但有几种类型的项目使用相同的文件名后缀来源和对象。例如,对于源代码和编译后的命令对象,命令以 .cmd 结尾。这导致生成文件定义如下:

C_CODE1.MODULE: C_CODE1.C    # This is ok -- no conflict
COMMAND1.CMD: COMMAND1.CMD   # Error! Make thinks it's a circular dependency.

如何告诉Make左边的.cmd项和右边的项实际上是两个不同的项?对象后缀由操作系统固定,不能更改。源代码后缀可以更改,但如果不进行自定义,它们将无法在我们的代码编辑器中正确显示。源代码确实存在于与对象不同的目录中,但在 makefile 中并没有真正指定路径,除了在设置 VPATH 时。

如果目标名称不必符合先决条件,我会将目标名称更改为其他名称,例如 COMMAND1: COMMAND1.CMD

如果必须匹配它们,那么我会像下面这样写,以在配方中明确添加扩展名。

COMMAND1 :  COMMAND1.CMD 
     cat $< > ${@}.CMD 

对于源,即使您使用的是传统源文件,也没有必要使用标准源成员类型。您可以使用 CMDSRC 作为命令源的源成员类型。