Autotools 库和目标文件输出控制 [英] Autotools library and object file output control

查看:36
本文介绍了Autotools 库和目标文件输出控制的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的目标是将所有目标文件构建在 .objs 目录而不是 Makefile 的根目录中,并将二进制文件(和库)复制到项目的 bin/ 目录中.但我一直无法找到任何资源来解释如何做到这一点.我该怎么做?

My goal is to have all object files built in a .objs directory instead of the root of the Makefile, and to have the binaries (and libraries) copied into the project's bin/ directory. But I have been unable to find any resources to explain how to do this. How would I go about doing this?

这是我的 configure.ac 和 src/Makefile.am - 我有两个引用的共享库的类似 Makefile.am 文件.它们进行编译,并在将它们复制到 bin/ 目录后正常工作.我只是想自动化这个过程.

Here is my configure.ac and src/Makefile.am - I have similar Makefile.am files for two shared libraries that are referenced. They compile, and after copying them to the bin/ directory work as they should. I'm just looking to automate this process.

configure.ac

AC_PREREQ([2.63])
AC_INIT([gtkworkbook], [0.12], [j_bellone@users.sourceforge.net])
AC_CONFIG_SRCDIR([gtkworkbook/cell.c])
AM_INIT_AUTOMAKE([gtkworkbook], [0.12])

# Checks for programs.
AC_PROG_CXX
AC_PROG_CC
AC_PROG_INSTALL
AC_PROG_MAKE_SET
AC_PROG_RANLIB
AC_PROG_LIBTOOL
AC_PROG_CC_C_O

AC_CHECK_LIB([pthread], [pthread_mutex_init], [], [
            echo "pthread library is missing. pthread is required for this program"
            exit -1])

# Checks for header files.
AC_CHECK_HEADERS([arpa/inet.h netdb.h netinet/in.h stdlib.h string.h sys/socket.h unistd.h])

# Checks for typedefs, structures, and compiler characteristics.
AC_HEADER_STDBOOL
AC_C_INLINE
AC_TYPE_SIZE_T

# Checks for library functions.
AC_CHECK_FUNCS([gethostbyname memset socket])

AC_OUTPUT([Makefile
       csv/Makefile
       gtkworkbook/Makefile
       src/Makefile])

src/Makefile.am

AUTOMAKE_OPTIONS= foreign

C_FLAGS= -I/usr/local/include -I/usr/include -I/usr/local/include/gtkextra-2.0 -I$(top_srcdir)/include `pkg-config gtk+-2.0 glib-2.0 --cflags`
L_FLAGS= -L/usr/local/lib -L/usr/lib -L$(top_srcdir)/lib `pkg-config gtk+-2.0 glib-2.0 --libs` -lgtkextra-x11-2.0

bin_PROGRAMS= gtkworkbook
gtkworkbook_SOURCES= application.c config.c main.c parse.c plugin.c
gtkworkbook_CFLAGS= -Wall -lgthread-2.0 -std=c99 $(C_FLAGS)  
gtkworkbook_LFLAGS= -ldl $(L_FLAGS)
gtkworkbook_LDFLAGS= $(L_FLAGS)
gtkworkbook_LDADD= ../gtkworkbook/libgtkworkbook.la ../csv/libcsv.la

lib_LTLIBRARIES= realtime.la
realtime_la_SOURCES= realtime/CsvParser.cpp realtime/Network.cpp realtime/Packet.cpp realtime/plugin_main.cpp 
    realtime/thread_main.cpp realtime/concurrent/Mutex.cpp realtime/concurrent/Semaphore.cpp 
    realtime/concurrent/Thread.cpp realtime/concurrent/ThreadGroup.cpp realtime/concurrent/ThreadPool.cpp 
    realtime/proactor/Dispatcher.cpp realtime/proactor/Event.cpp realtime/proactor/Proactor.cpp 
    realtime/proactor/InputDispatcher.cpp realtime/proactor/Worker.cpp realtime/network/Tcp.cpp
realtime_la_CPPFLAGS= -Wall -Wno-write-strings $(C_FLAGS)
realtime_la_LFLAGS= -lgtkworkbook -lcsv $(L_FLAGS)
realtime_la_LDFLAGS= -module -export-dynamic 
realtime_la_LIBADD= ../gtkworkbook/libgtkworkbook.la ../csv/libcsv.la

所以,我的问题是如何为每个 Makefile 的编译结果指定输出目录(我希望它们被复制到 bin/,并且目标文件要在 每个项目的 .obj 而不是 Makefile 的根目录.

So, my question is how to specify the output directories for the compile results of each Makefile (I wish them to be copied to bin/, and for the object files to be in .obj of each project instead of in the root of the Makefile.

感谢迄今为止的帮助......这个网站是一个很好的资源,我从已经提供的链接中学到了很多东西.

Thanks for the help thus far.. this website has been a great resource, and I have learned a lot from the links provided already.

推荐答案

GNU Build System 不使用 obj/ 目录,因此自动工具不支持该目录.

The GNU Build System does not use obj/ directories, so the autotools are not designed to support that.

但是我可以想到两种方法来解决这个问题.

However I can think of two ways to work around this.

作为安装程序,您可以通过键入从其源目录中构建任何包

As an installer, you can build any package out of its source directory by typing

mkdir builddir
cd builddir
../path-to-sourcedir/configure
make

然后将在 builddir/ 目录中创建任何输出文件.这种编译方案使得编译存储在只读目录中的源代码成为可能(这在 FSF 分发带有未压缩源代码的 CD 的年代更有意义),或者使用不同的设置编译相同的源(甚至对于不同的架构).

Then any output file will be created in the builddir/ directory. This compilation scheme makes it possible to compile source code out stored in a readonly directory (this made more sense back in the years where the FSF was distributing CDs with uncompressed source code), or to compile the same source with differents settings (or even for different architectures).

作为打包者,你可以强制你的包在 obj/ 中构建所有东西的唯一方法是将你的 Makefile.am 放在 obj/ 中code>,并在那里声明所有构建规则.这意味着 obj/Makefile.am 看起来像:

As a packager, the only way you could force your package to build everything in obj/ is to put your Makefile.am in obj/, and declare all your build rules there. This would mean a obj/Makefile.am looking like:

bin_PROGRAMS = foo bar
foo_SOURCES = ../src/foo/main.c ../src/foo/help.c ../src/foo/list.c
bar_SOURCES = ../src/bar/bar.c 

等等.我记得 10 年前,Palm OS 模拟器 POSE 使用的设置与上述类似.我不推荐它,因为它不是真正可维护的.坚持工具的理念,并使用像其他 GNU 软件包一样工作的构建系统确实更好.

etc. I remember that 10 years ago, POSE, the Palm OS Emulator, was using a setup like the above. I don't recommend it as it's not really maintainable. It's really better to stick with the philosophy of the tools, and use a build systems that work like the other GNU packages.

关于GNU Build System的介绍,我推荐阅读Automake手册的介绍:http://www.gnu.org/software/automake/manual/automake.html#GNU-Build-System

For an introduction to the GNU Build System, I recommend reading the introduction of the Automake manual: http://www.gnu.org/software/automake/manual/automake.html#GNU-Build-System

尤其是用例部分.如果您不关心这些用例,我认为您最好的方法是不要使用 Automake,而是构建自己的 Makefile.否则你会一直试图强迫 Automake 做一些它不适合做的事情,你很快就会讨厌它.

Especially the Use-Cases section. If you don't care about these use cases, I think your best course is NOT to use Automake, and build your own Makefiles. Otherwise you will keep trying to force Automake doing something it is not designed for, and you'll quickly hate it.

EDIT 2013-08-26:请注意使用名为 使用 obj/ 不可移植到 BSD make.

EDIT 2013-08-26: Note that an Automake project using a subdirectory named using obj/ is not portable to BSD make.

这篇关于Autotools 库和目标文件输出控制的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆