自动生成二进制文件到bin /而不是src /

Vit*_*sta 26 automake autoconf autotools

我搜索了这个问题的答案,但找不到任何好处.也许他们已经老了,事情发生了变化,所以我再问一次.

我有一个目录结构:

我的项目

  • SRC

  • 箱子

我想要的是,当我在根目录中制作时,二进制文件放在./bin中,而不是混乱./src.但是怎么样?

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

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

Bra*_*den 34

你在这里有错误的想法.

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

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


pto*_*ato 27

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

如果您不想使源目录混乱,请尝试以下操作:

cd my_project
mkdir build
cd build
../configure
make
Run Code Online (Sandbox Code Playgroud)

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

  • 毕竟,`make install`可能会把它们放在像`$(prefix)/ bin`这样的地方...... (3认同)
  • 另外,如果其他人使用你的软件并看到它使用autoconf/automake,他们不会期望它在一个单独的目录中构建东西(除非他们通过运行configure elsewere来安排它,如ptomato所示).它只是GNU Build System的理念,而Autoconf/Automake是实现GNU Build System的工具而不是其他东西.您可能希望查看Automake的介绍性章节,了解GNU Build System的用户典型用例:http://sources.redhat.com/automake/automake.html#Use-Cases (2认同)

Nie*_*ann 14

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

考虑以下src/Makefile.am:

bin_PROGRAMS = foo
foo_SOURCES = ...
foo_CPPFLAGS = ...
foo_LDFLAGS = ...
Run Code Online (Sandbox Code Playgroud)

它创建了一个二进制"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 = ...
Run Code Online (Sandbox Code Playgroud)

我尝试了一些包,甚至"让distcheck"吞下它.虽然不能成为一个黑客...

  • 无论如何,移动*所有*构建与子文件夹相关,例如构建/(包括目标文件,生成的文本文件,.desktop文件等),类似于我在Java世界中常见的例如Maven. (2认同)
  • 您可以尝试从另一个文件夹执行配置脚本; 例如,你可以创建一个"build"子文件夹,执行"cd build; ../configure; make".这将使"构建"之外的所有内容保持不变并生成"构建"内的所有文件,包括对象和二进制文件. (2认同)