【问题标题】:Automake generating binaries to bin/ instead of in src/自动生成二进制文件到 bin/ 而不是 src/
【发布时间】:2011-01-09 12:54:23
【问题描述】:

我搜索了这个问题的答案,但找不到任何好处。也许他们老了,有些东西变了,所以我再问一次。

我的目录结构为:

我的项目

  • src

  • bin

我希望这样,当我在根目录中进行 make 时,将二进制文件放入 ./bin,而不是杂乱无章的 ./src。但是怎么做呢?

编辑:我正在使用 C++。我的 Makefile.am 没有什么特别的。只有 bin_PROGRAM 和 _SOURCES 变量。

当我运行 make 时,生成的二进制文件被放入 ./src。我只是希望它们在 ./bin 中。

【问题讨论】:

  • 发布你所做的(你的makefile),澄清你上面的目录结构,那么帮助会容易得多(另外,你使用的编程语言可能是相关的)
  • 您使用的是完整的 Autotools 堆栈吗?如果是这样,正如@Braden 提到的,只需使用 Autoconf 生成的configure shell 脚本。

标签: autotools autoconf automake


【解决方案1】:

如果您尝试以与预期不同的方式设置目录,Automake 就不能很好地应对。您需要编写额外的规则以在编译后将二进制文件移动到 ../bin,这太复杂了。

如果你不想弄乱你的源目录,试试这个:

cd my_project
mkdir build
cd build
../configure
make

这会将所有生成的文件(如 makefile、二进制文件、目标文件)放在 my_project/build 的子目录中。

【讨论】:

  • 它有效,但有点笨拙。我可以做到,但如果其他人使用我的软件怎么办?他们的 ./src 会杂乱无章。也许我可以简单地将这些命令添加到 Makefile 的所有规则中?
  • configure 是生成生成文件的原因,因此您不能将该命令放入生成文件中。我可以肯定地说,大多数人并不关心他们的 ./src 杂乱无章,因为 Automake 总是这样工作。这是那些关心的人的标准解决方案。如果他们更喜欢将二进制文件放在同一个目录中怎么办?如果您仍然想按照自己的方式进行设置,我认为没有任何方法可以在不放弃 Automake 的情况下做到这一点(尽管您仍然可以使用 Autoconf。)
  • 另外,如果其他人使用您的软件并看到它使用 autoconf/automake,他们不会期望它在单独的目录中构建东西(除非他们通过运行 configure elsewere as ptomato 来安排它已经表明)。这只是 GNU 构建系统的理念,而 Autoconf/Automake 是实现 GNU 构建系统的工具,而不是其他东西。您可能想查看 Automake 的介绍性章节,了解 GNU 构建系统的用户典型用例:sources.redhat.com/automake/automake.html#Use-Cases
  • 毕竟make install 可能会把它们放在$(prefix)/bin 这样的地方...
【解决方案2】:

告诉 Automake 在某个目录中创建二进制文件的一种方法是将此目录添加到“bin_PROGRAMS”变量中的名称。

考虑以下 src/Makefile.am:

bin_PROGRAMS = foo
foo_SOURCES = ...
foo_CPPFLAGS = ...
foo_LDFLAGS = ...

它会创建一个二进制“src/foo”,但您可以告诉 Automake 使用 src 中的源来创建一个二进制“bin/foo”:

bin_PROGRAMS = $(top_builddir)/bin/foo
__top_builddir__bin_foo_SOURCES = ...
__top_builddir__bin_foo_CPPFLAGS = ...
__top_builddir__bin_foo_LDFLAGS = ...

我尝试了一些软件包,甚至“make distcheck”都吞下了它。不过,这可不是什么黑客行为……

【讨论】:

  • 我认为这是最好的解决方案。不完美,因为编译过程创建的所有.o和文件都还在src中,但是……
  • 是否无论如何要移动与子文件夹相关的 everything 构建,例如 build/(包括目标文件、生成的文本文件、.desktop 文件等),类似于什么我在 Java 世界中很常见,例如 Maven。
  • 您可以尝试从另一个文件夹执行配置脚本;例如,您可以创建一个“build”子文件夹,执行“cd build; ../configure ; make”。这将使“构建”之外的所有内容保持不变,并在“构建”内部生成所有文件,包括对象和二进制文件。
  • @NielsLohmann 很好的答案,一些项目(LLVM iirc)希望用户从构建目录调用配置脚本,其他包说这是可能的,但不受支持,大多数都没有提及。我很佩服那些不得不照看项目构建系统的人......
  • @MauganRa 如果项目中不支持外源构建,那么项目是邪恶的,没有 Autotools 会更好。项目作者不知道什么是 Autotools。
【解决方案3】:

你这里的想法是错误的。

您的构建树位于您运行configure 的任何位置。这就是 autoconf 的设计方式。您的软件包的用户(不想弄乱他们的源代码树)会期望它以这种方式工作。

这种方法是一种更通用的解决方案,比您想象的组织具有更大的灵活性。例如,想要在不同的文件系统上维护源代码和构建文件并不少见。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 2013-05-09
    • 2023-03-10
    相关资源
    最近更新 更多