makefile - Autotools 库和目标文件输出控制

标签 makefile gnu autotools autoconf automake

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

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

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 的根目录中。

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

最佳答案

GNU 构建系统不使用 obj/目录,因此自动工具不支持该目录。

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

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

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

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

作为打包者,强制您的包构建 obj/ 中的所有内容的唯一方法就是把你的Makefile.amobj/ ,并在那里声明所有构建规则。这意味着 obj/Makefile.am看起来像:

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 年前,POSE(Palm OS 模拟器)正在使用类似上述的设置。我不推荐它,因为它实际上不可维护。最好坚持工具的理念,并使用像其他 GNU 软件包一样工作的构建系统。

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

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

编辑 2013-08-26:请注意 Automake 项目使用名为 using obj/ is not portable 的子目录到 BSD make。

关于makefile - Autotools 库和目标文件输出控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1015700/

相关文章:

c - 如何使用 autotools 构建架构/机器相关代码

c - 使用 -Wall 运行 ./configure 会导致找不到库

c - 解释一下这个 makefile 是如何工作的?

重定位 vector 表的C代码

c++ - 如何向 "interrupt"调用一个函数?

c - 即使定义了 %.o,也没有制作 something.o 的规则

ffmpeg - 在 RHEL4 上构建 FFmpeg

c++ - 从 MinGW 链接到 OpenCV 的问题

c++ - Makefile 未链接必要的 .hpp 文件

c++ - 错误输出包括最后几行代码