【发布时间】:2018-10-09 07:54:59
【问题描述】:
我有一个使用编译器标志的 c 文件。当编译器标志发生变化时,我强制 c 文件通过在 makefile 中写入来更新它的值:
compilerflagChange: FORCE
echo ${CFLAGS} | cmp -s - $@ || echo ${CFLAGS} > $@
myCFile.o: compilerflagChange
这很好用,除非我清理整个项目然后运行。 在那种情况下,myCFile.C 在来到语句之前还没有生成
myCFile.o: compilerflagChange
这将导致构建崩溃并出现错误“MyCfile.C, no such file”。
问题:如何根据 C 文件是否存在来制定规则? "如果文件存在+cflagChange,则更新文件,否则为空"
更多信息: “为什么不每次生成 MyCFile.c 之后重新构建 myCFile.o 呢?” makefile 中没有合适的位置。为此,我需要深入一些层并失去重建原因的可追溯性。
【问题讨论】:
-
编译器标志是什么,jw?
-
没关系?变量=readAValueFromCmdInput CFLAGS+=- DVARIABLE="\"${变量}\
-
为什么C文件不存在?它是通过预处理创建的吗?这个设置有一些特别之处——但我无法弄清楚你在做什么(或试图做什么)。如果源代码更改或编译器选项更改,您是否尝试重建
myCFile.o?但是源代码并不总是存在,但如果目标文件确实存在,它应该被视为最新的,不需要重新编译?也许myCFile.o规则可能需要对myCFile.c的显式依赖,并且需要成为确保myCFile.c已创建且是最新的规则,但我缺少一些东西。 -
如果
MyCfile.C不存在,你想让Make做什么? -
清理项目后: 1. 如果编译器标志发生变化,myCFile.c 将更新为新值(同时检测首次构建作为更改) 2. “构建开始” - 生成一些目标文件来自 c 文件 3.“构建进行中”-生成一些 c 文件(包括 MyCFile.C) 4.“构建进行中”-从步骤 3 中的 c 文件生成更多目标文件。如果我运行构建而不清洗,不执行步骤 3。第 4 步是使用需要根据编译器标志更改值的现有文件。