我在安装标头时使用automake处理子目录时遇到了一些问题。
以下是我所拥有的项目层次结构:
foo/
foo-bin/
Makefile.am
...
foo-tests/
Makefile.am
...
foo-lib/
Makefile.am
include/
foo/
header1.h
subdir/
header2.h
src/
file1.cpp
没有什么太花哨的,有一个包含configure.ac
的根目录,以及共享库,主二进制文件和测试的3个子目录。
这里有趣的部分是foo-lib/
。它包含二进制文件和测试链接到的库。
由于我希望能够从源代码树生成配置文件,因此我已决定在$top_srcdir
中使用Makefile.am
- 相对路径。
这是它的样子:
libfoo_la_SOURCES = \
$(top_srcdir)/foo-lib/src/file1.cpp
pkginclude_HEADERS = \
$(top_srcdir)/foo-lib/include/foo/header1.h \
$(top_srcdir)/foo-lib/include/foo/subdir/header2.h
如果没有这些$top_srcdir
- 相对路径,当我尝试使用foo-lib
中的foo-bin
时,或者当我尝试从源树中生成项目时,我会遇到问题。< / p>
现在的问题是:在安装这些标题时,它们最终会被夷为平地! 也就是说,我最终得到了:
$prefix/include/foo/header1.h
$prefix/include/foo/header2.h
虽然我在期待:
$prefix/include/foo/header1.h
$prefix/include/foo/subdir/header2.h
所以我认为这是nobase_
应该达到的目标,但由于我使用的路径不是Makefile.am
,而是$top_srcdir
,我最终会得到整体正在复制的$top_srcdir
路径:
$prefix/include/foo-lib/include/foo/header1.h
$prefix/include/foo-lib/include/foo/subdir/header2.h
这显然不是预期的。
对此有任何想法和建议非常感谢:)
如果您需要访问真实的Makefile.am
文件,而不是规范示例,那么项目就在这里:
答案 0 :(得分:2)
此:
pkginclude_HEADERS = \
$(top_srcdir)/foo-lib/include/foo/header1.h \
$(top_srcdir)/foo-lib/include/foo/subdir/header2.h
告诉安装将标题放在$(pkgincludedir)
上面,所以你告诉他们的方式是扁平的。
你能做的是:
myincludesubdir=$(pkgincludedir)/subdir
pkginclude_HEADERS = $(top_srcdir)/foo-lib/include/foo/header1.h
myincludesub_HEADERS = $(top_srcdir)/foo-lib/include/foo/subdir/header2.h
这应安装header1.h
至$(pkgincludedir)
和header2.h
至$(myincludesubdir)
又称$(pkgincludedir)/subdir
。
在这种情况下,我不会使用nobase_
。你使用它的结果对我来说不会出乎意料或错误。