使用(nobase_)pkginclude_HEADERS在子目录中安装标头

时间:2014-03-20 12:46:24

标签: c++ autotools automake

我在安装标头时使用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文件,而不是规范示例,那么项目就在这里:

https://github.com/NewbiZ/crashburn

1 个答案:

答案 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_。你使用它的结果对我来说不会出乎意料或错误。