Automake将二进制文件生成到bin/而不是src/中。

29

我搜索了这个问题的答案,但没有找到什么好的。也许它们已经过时了并且发生了一些变化,所以我再问一次。

我有一个目录结构如下:

my_project

  • src

  • bin

当我在根目录运行`make`命令时,我希望生成的二进制文件被放在`./bin`中,而不是杂乱无章地放在`./src`中。但是该怎么做呢?

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

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


请发布您所做的内容(您的Makefile),并在上面澄清您的目录结构,这样就更容易帮助您了(另外,您使用的编程语言可能是相关的)。 - KevinDTimm
你使用完整的Autotools堆栈吗?如果是这样,就像@Braden提到的那样,只需使用Autoconf生成的configure shell脚本。 - Plamen
https://dev59.com/CkjSa4cB1Zd3GeqPCRJq - Ciro Santilli OurBigBook.com
3个回答

38
您的想法有误。您的构建树是您运行“configure”的位置。这就是autoconf的设计工作方式。您的软件包的用户(不想混淆其源代码树)将期望以此方式工作。
这种方法比您想象的组织方式更具普遍解决方案和更高的灵活性。例如,希望在不同的文件系统上维护源代码和构建文件并不罕见。

28

如果你尝试以不同于Automake期望的方式设置目录,它可能会无法很好地应对。你所想要的将涉及编写额外的规则,在编译后将二进制文件移动到../bin,这样做是不必要的复杂。

如果你不想混乱你的源目录,请尝试以下方法:

cd my_project
mkdir build
cd build
../configure
make

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


它能工作,但有点笨重。我可以这样做,但如果其他人使用我的软件呢?他们的./src会很混乱。也许我可以将这些命令简单地添加到Makefile的所有规则中? - Vitor Baptista
1
“configure” 是生成 makefile 的命令,因此您不能将该命令放在 makefile 中。我可以肯定地说,大多数人不关心他们的 ./src 目录杂乱无序,因为 Automake 总是以这种方式工作。这是那些关心的人的标准解决方案。如果他们更喜欢将二进制文件放在同一个目录中呢?如果您仍然想按照自己的方式设置它,我认为没有任何方法可以在不放弃 Automake 的情况下实现(尽管您仍然可以使用 Autoconf)。 - ptomato
2
此外,如果其他人使用您的软件并发现它使用autoconf/automake,则他们不会期望在单独的目录中构建东西(除非他们按照ptomato所示运行configure)。这只是GNU构建系统的哲学,Autoconf/Automake是实现GNU构建系统而不是其他东西的工具。您可能需要查看Automake的介绍章节,以了解GNU构建系统的典型用例:http://sources.redhat.com/automake/automake.html#Use-Cases - adl
4
最终,make install 很可能会将它们放在类似于 $(prefix)/bin 的位置... - Benjamin Bannier

18

让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中,但是... - Vitor Baptista
2
有没有办法将与构建相关的所有内容移动到子文件夹(例如build/),包括目标文件、生成的文本文件、.desktop文件等,类似于Java世界中常见的Maven。 - lanoxx
2
你可以尝试从另一个文件夹执行configure脚本;例如,你可以创建一个“build”子文件夹,执行“cd build; ../configure ; make”。这将保留“build”外的所有内容,并生成“build”内的所有文件,包括对象和二进制文件。 - Niels Lohmann
1
@NielsLohmann 很好的回答,一些项目(LLVM iirc)希望用户从构建目录调用配置脚本,其他软件包则表示这是可能的,但不受支持,大多数软件包则没有提到。我很钦佩那些必须维护其项目构建系统的人们... - MauganRa
如果一个项目不支持源外构建,则该项目是有问题的,最好不要使用Autotools。该项目的作者可能不了解什么是Autotools。 - Franklin Yu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接