关于执行“make”命令时“警告:对象目录未从原始状态更改”的问题

时间:2016-07-28 10:45:44

标签: freebsd kernel-module

我最初在FreeBSD mailing list上发布此问题,但遗憾的是无法收到任何回复。所以我在这里重新提出问题,并希望这种行为不会违反SO的任何行为准则。

我正在编写一个简单的FreeBSD内核模块。但重新启动机器后(我不确定这是否是原因),我发现“make”命令无效,并且它总是提示以下字样:

# make
Warning: Object directory not changed from original /root/hello

即使我删除并上传新文件,此问题仍然存在。

在引用此post后,我尝试“make obj” 命令,然后“make”工作:

# make obj
/usr/obj/root/hello created for /root/hello
# make
@ -> /usr/src/sys
machine -> /usr/src/sys/amd64/include
x86 -> /usr/src/sys/x86/include
......

我无法弄清楚背后的根本原因:
(1)为什么make抱怨“Warning: Object directory not changed from original /root/hello”虽然我已经更新了文件? (2)为什么“make obj”可以保存“make”?

2 个答案:

答案 0 :(得分:0)

在稍微阅读/usr/src/share/mk/bsd.obj.mk之后,FreeBSD似乎不希望${.OBJDIR}${.CURDIR}是同一目录,这似乎暗示${.OBJDIR}具有构造不正确(或者不是规范)。

我对为什么发生上述情况的了解不存在,但可以通过运行来解决

make clean

在下次运行make时强制执行干净的构建。

最幸运的朋友,希望您在问题发布后的2年零2个月内已经解决了这个问题。

答案 1 :(得分:0)

FreeBSD 约定是将构建的产品(“对象”)放在与源不同的目录中。您可以在操作系统本身的目录布局中看到这一点(即 /usr/src/usr/obj)。警告指出此组件与约定不同,但由于它是警告,因此可以安全地忽略树外构建。

如您所见,运行 make obj 会在规范位置(即 /usr/obj/${.CURDIR})中为您的组件创建一个对象目录并避免警告。如果 /usr/obj 不存在,这可能会有所帮助,因为该命令会创建所需的目录结构。

有几种方法可以告诉 Makefile 系统“我知道我在做什么”并避免在 /usr/obj 下没有目录的情况下出现警告。最正确的方法是为构建创建一个本地对象目录:

$ cd mysrc
$ mkdir obj
$ env MAKEOBJDIR=$(realpath obj) make

请注意,MAKEOBJDIR 是环境变量,而不是命令行变量。

另一种更黑客的方法是通过将 NO_OBJ= yes 添加到 Makefile 来告诉 make 没有任何目标文件。构建仍会生成对象,但 bsd.obj.mk 不会查找对象目录。