2013-02-11 20 views
0

我開始學習autotools以便首先理解並在以後擴展現有項目的構建系統。目前該項目會在輸出時構建一個程序。構建系統非常複雜,由幾個子目錄組成,Makefile.am以維護者模式生成的文件等等。我希望可以選擇使用大部分相同的源代碼創建一個庫,重用大部分現有的構建系統。使用gnu autotools定義額外的製作目標

我想象的是一個新的make目標,這樣在運行configure之後,我可以運行make來編譯程序,或者說,運行make library來構建庫。什麼是正確的方法來做到這一點或類似的影響?

我不想在運行普通make(就像之前的程序)時創建庫和程序,並且我不想在運行make library(我只想要庫)時生成該程序。

如果有人能提供一個簡單的例子,例如一個由main.c,foo.cbar.c組成的程序和由foo.cbar.c組成的程序,這也是非常有用的。

編輯

爲了澄清,我本來以爲程序和lib可以完全單獨構建。該庫僅包含主程序的一部分代碼,我相信這兩個是獨立的實體。但事情更復雜。程序本身被構建並用於輸出一些代碼,然後在第二步中編譯到程序中(我認爲)。通過執行以下步驟,我已經得到了我想要的東西。

加上一個有條件的configure.ac

dnl Adds LIBRARY conditional for --enable-foolib mode to 
dnl build foo as a library 
AC_ARG_ENABLE(foolib, 
AS_HELP_STRING([--enable-foolib], 
       [enable qucslib build, default: no]), 
[case "${enableval}" in 
      yes) foolib=true ;; 
      no) foolib=false ;; 
      *) AC_MSG_ERROR([bad value ${enableval} for --enable-foolib]) ;; 
esac], 
[foolib=false]) 

AM_CONDITIONAL(FOOLIB, test x"$foolib" = x"true") 

然後在一個合適的Makefile.am我做類似如下的內容:

if FOOLIB 
noinst_LIBRARIES = libbar.a libfoo.a 
else 
noinst_LIBRARIES = libbar.a 
endif 

bin_PROGRAMS = barprog 

barprog_SOURCES = main.cpp src1.cpp src2.cpp etc.cpp 

barprog_LDADD = libbar.a    \ 
    subdir1/libsubdir1.a     \ 
    subdir2/libsubdir2.a   \ 
    etcdir/libetc.a 

... other stuff 

if FOOLIB 
libfoo_a_LIBADD = libbar.a   \ 
    subdir1/libsubdir1.a     \ 
    subdir2/libsubdir2.a   \ 
    etcdir/libetc.a 

libfoo_a_SOURCES = src1.cpp src2.cpp etc.cpp 
endif 

然後,當我想讓我的庫做

configure --enable-foolib 
make 

這適用於現在,但似乎kludgy。我不確定如何在構建系統中實現提供的答案。

+0

它可以做到這一點。你有什麼嘗試? – ldav1s 2013-02-11 18:15:59

+0

分手。將圖書館放在一個項目中,並將該程序放入另一個項目中。 – 2013-02-11 22:39:42

回答

0

如果程序依賴於庫,那麼在沒有構建庫的情況下將無法構建程序。您已經有能力構建單獨的庫:configure && make libfoo.a應該可以正常工作(或make libfoo.la)。如果你希望一個名爲library目標,你可以簡單地添加以下任何Makefile.am:

library: 
     libfoo.a 

(或者你可能需要libfoo.la基本上,如果在Makefile.amLIBRARIES主要根據指定的庫,那麼你。將使用libfoo.a,但如果在LTLIBRARIES主節點下指定,則將使用libfoo.la。)這隻會在包含Makefile.am的每個目錄中創建一個library目標。如果你有一個複雜的遞歸版本(你真的應該簡化它,但這是另一個問題),你可以把類似的東西在你的頂級Makefile.am以下在整個樹建庫:

library: 
     cd subdir && $(MAKE) $(AM_MAKEFLAGS) library 

這是假設如上所述,您已將library目標添加到subdir/Makefile.am。

要迂腐,您可能需要使用$(am__cd)而不是cd,但這不是必須的。

+0

謝謝,但我不確定如何實現您所說的話,而且事實證明情況比我想象的要複雜。我編輯了我的問題來反映這一點。 – crobar 2013-02-22 17:30:20

相關問題