2010-01-26 122 views
20

我搜索了这个问题的答案,但找不到任何好处。也许他们已经老了,有什么改变了,所以我再问一次。Automake生成二进制文件到bin /而不是在src/

我有一个目录结构:

MY_PROJECT

  • SRC

我希望,当我做出的根目录,二进制文件放在./bin中,而不是混乱的./src。但是如何?

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

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

+0

发布你已经完成的(你的makefile),澄清你的目录结构,然后它会更容易帮助(同时,你正在使用的编程语言可能是相关的) – KevinDTimm 2010-01-26 14:43:27

+0

您是否使用完整的Autotools堆栈?如果是这样,就像@Braden提到的那样,只需使用由Autoconf生成的configure脚本。 – Plamen 2014-09-03 16:17:34

+0

http:// stackoverflow。com/questions/1015700/autotools-library-and-object-file-output-control – 2016-02-20 20:45:36

回答

29

你在这里有错误的想法。

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

这种方法是比你想象的机构更多的灵活性更通用的解决方案。例如,想要在单独的文件系统上维护源文件和构建文件并不奇怪。

18

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

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

cd my_project 
mkdir build 
cd build 
../configure 
make 

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

+0

它可以工作,但是有点聚合。我可以做到,但如果其他人使用我的软件呢?他们的./src杂乱无章。也许我可以简单地将这些命令添加到Makefile的所有规则中? – 2010-01-28 02:48:55

+1

'configure'是生成makefiles的东西,所以你不能把这个命令放在makefile中。 我可以放心地说,大多数人并不在意他们的./src混乱,因为Automake总是以这种方式工作。这是那些照顾病人的标准解决方案。如果他们更喜欢在同一个目录中有二进制文件呢? 如果你仍然想按照自己的方式设置它,我认为没有放弃Automake的任何方式,尽管你仍然可以使用Autoconf。 – ptomato 2010-01-28 08:53:10

+2

另外,如果其他人使用你的软件并看到它使用autoconf/automake,他们不会期望它在一个单独的目录中创建东西(除非他们通过运行configure,而不是像ptomato显示的那样安排它)。这只是GNU构建系统的哲学,而Autoconf/Automake是实现GNU构建系统的工具,而不是其他的。您可能需要查看Automake的介绍性章节,了解GNU构建系统的用户典型用例:http://sources.redhat.com/automake/automake.html#Use-Cases – adl 2010-01-28 10:13:02

14

一种方式来告诉Automake的某个目录创建二进制文件到该目录中的“bin_PROGRAMS”变量添加正确的名称。

考虑下面的src/Makefile.am:

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

它创建了一个二进制 “的src/foo” 的,但你能告诉Automake的使用来源SRC创建一个二进制的 “斌/富” :

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

我有一些包尝试过了,甚至“让distcheck”吞下它。不能是那么多的黑客,但...

+0

这是我认为最好的解决方案。不完美,因为编译过程创建的所有.o和文件仍然在src中,但是... – 2010-02-10 02:13:58

+1

是否有任何移动*一切*构建与子文件夹相关,如构建/(包括对象文件,生成的文本文件,.desktop文件等),类似于我在Java世界中常见的例子,例如Maven。 – lanoxx 2013-12-05 10:01:29

+2

您可以尝试从另一个文件夹执行配置脚本;例如,你可以创建一个“build”子文件夹,执行“cd build; ../configure; make”。这会使“构建”之外的所有内容都保持原样并在“构建”内部生成所有文件,包括对象和二进制文件。 – 2013-12-05 13:59:25

相关问题