我最初在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
”?
答案 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
不会查找对象目录。