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

Installing headers in subdirectories with (nobase_)pkginclude_HEADERS

本文关键字:子目录 安装 文件 HEADERS nobase pkginclude 使用      更新时间:2023-10-16

在安装头文件时,我在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/。它包含二进制文件和测试文件链接到的库。

由于我希望能够从源树中生成配置文件,因此我决定在Makefile.am中使用$top_srcdir -相对路径。

内容如下:

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-bin中使用foo-lib时,或者当我尝试从源代码树中生成项目时,我会遇到问题。

现在的问题是:当安装这些头文件时,它们最终会变平!也就是说,我最终得到:

$prefix/include/foo/header1.h
$prefix/include/foo/header2.h

when I was expected:

$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

This:

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_。在我看来,使用它得到的结果并不意外或错误。