【问题标题】:GNU Autotools: How do you include source files in the 'make dist' tarball that are above the root source directory?GNU Autotools:如何在根源目录上方的“make dist”压缩包中包含源文件?
【发布时间】:2009-12-02 22:11:33
【问题描述】:

我有一个 Subversion 项目,它使用 Gnu Autotools(即 automake、autoconf 和 libtool)来管理子文件夹(称为“子包”)中的源代码。子包引用子包根源目录之上的源文件,并且对其他子包是通用的。不幸的是,当运行 'make dist' 来创建发行版 tarball 时,公共源文件不会包含在发行版中。

有没有办法在分发源代码之前使用 autoconf/automake 将这些公共源文件移动到子包的子目录中,并让 makefile 自行调整以正确指向重新定位的源文件?显然,可以在编译之前让 makefile 移动这些源文件,但是对于在 Subversion 存储库中工作,这会导致问题,因为这些移动的文件是受修订控制的,并且很容易意外编辑移动的文件而不是原始文件.

【问题讨论】:

    标签: gnu autotools autoconf automake


    【解决方案1】:

    您可以在子包中有一个空目录,称为“common”,其中包含一个将外部文件复制到其中的 makefile。然后您可以使用 dist-hook 目标将文件直接移动到“ common”目录,该目录将被压缩到 tarball 中。这样,您就不必担心它们四处散布并被编辑。您还可以在复制时覆盖“common”中的 Makefile.am、Makefile.in 和 Makefile。

    subpackage/common/Makefile.am 中的示例(未经测试):

    dist-hook:
        cp -p $(top_srcdir)/../common/Makefile* $(top_srcdir)/../common/*.[ch] $(distdir)
    

    我不是 100% 肯定这会奏效。它可能会破坏你的包的其余部分,这取决于其他所有东西都希望在哪里找到这些源文件;如果您解压缩 tarball 并尝试从那里制作 dist,它可能会破坏制作 dist。你应该知道这种诡计是不受欢迎的。但我希望我已经给了你足够的想法来玩弄。

    【讨论】:

    • 感谢您的建议!这有点类似于我们今天在类似的环境中所做的事情,除了我们首先复制文件然后构建它们(以便 Makefiles 对于颠覆和分发都是正确的)。问题是让所有 Makefile(公共目录中的 makefile 和 $(top_srcdir) 中的 makefile 都能正常播放。
    【解决方案2】:

    为什么不使用符号链接而不是移动文件(这对我来说总是很可疑),为什么不使用符号链接?您可以让您的子包仅引用本地文件,并使用Makefile 规则说明“如果本地文件不在这里,则创建指向父文件的符号链接”。在make dist期间,符号链接会自动转换为纯文件。

    【讨论】:

    • 我喜欢这种方法,并且会试一试!我唯一的犹豫是它是否可以在 Windows 系统上运行(可能运行 Cygwin)。在 Windows 系统上,符号链接显示为 .lnk 文件。这在纯 Cygwin 设置中可能没问题(因为 Cygwin Bash 正确地将 .lnk 文件解释为符号链接),但我想知道 Microsoft Visual Studio 是否也能正确处理它们。
    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多