8

私の目標は、すべてのオブジェクト ファイルを Makefile のルートではなく .objs ディレクトリに構築し、バイナリ (およびライブラリ) をプロジェクトのbin/ディレクトリにコピーすることです。しかし、これを行う方法を説明するリソースを見つけることができませんでした。どうすればこれを行うことができますか?

これが私の configure.ac とsrc/Makefile.amです - 参照されている 2 つの共有ライブラリ用の同様の 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/にコピーし、オブジェクト ファイルをMakefile のルートではなく各プロジェクトの.objに配置することを希望します)。 .

これまでご協力いただきありがとうございました.このウェブサイトは素晴らしいリソースであり、すでに提供されているリンクから多くのことを学びました.

4

2 に答える 2

13

obj/GNU Build System はディレクトリを使用しないため、autotools はそれをサポートするようには設計されていません。

ただし、これを回避する方法は 2 つあります。

インストーラーとして、次のように入力して、ソース ディレクトリから任意のパッケージをビルドできます。

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

次に、出力ファイルがbuilddir/ディレクトリに作成されます。このコンパイル スキームにより、読み取り専用ディレクトリに保存されているソース コードをコンパイルしたり (これは、FSF が圧縮されていないソース コードを含む CD を配布していた時代にはより理にかなっています)、または同じソースを異なる設定でコンパイルすることができます (または異なるアーキテクチャ)。

パッケージャーとして、パッケージにすべてを強制的にビルドさせる唯一の方法は、 inobj/を配置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 年前、Palm OS Emulator である POSE は、上記のようなセットアップを使用していたことを覚えています。メンテナンス性が悪いのでお勧めしません。ツールの哲学に固執し、他の GNU パッケージと同じように機能するビルド システムを使用する方が本当に良いです。

GNU ビルド システムの概要については、Automake マニュアルの概要を読むことをお勧めします: http://www.gnu.org/software/automake/manual/automake.html#GNU-Build-System

特にユースケースセクション。これらの使用例を気にしないのであれば、Automake を使用せず、独自の Makefile を作成するのが最善の方法だと思います。そうしないと、Automake が設計されていないことを Automake に強制しようとし続け、すぐに嫌になるでしょう。

EDIT 2013-08-26 : usingobj/という名前のサブディレクトリを使用する Automake プロジェクトは、BSD make に移植できないことに注意してください。

于 2009-06-23T13:10:18.323 に答える
-1

これを行う最も簡単な方法は、「libdir」をこれらのファイルを配置するディレクトリに設定し、インストール ターゲットを使用してそこにコピーすることです。

ただし、これにより、従来の意味で install ターゲットを使用できなくなります。

于 2009-06-18T23:30:50.627 に答える