我開始學習autotools以便首先理解並在以後擴展現有項目的構建系統。目前該項目會在輸出時構建一個程序。構建系統非常複雜,由幾個子目錄組成,Makefile.am
以維護者模式生成的文件等等。我希望可以選擇使用大部分相同的源代碼創建一個庫,重用大部分現有的構建系統。使用gnu autotools定義額外的製作目標
我想象的是一個新的make目標,這樣在運行configure之後,我可以運行make
來編譯程序,或者說,運行make library
來構建庫。什麼是正確的方法來做到這一點或類似的影響?
我不想在運行普通make
(就像之前的程序)時創建庫和程序,並且我不想在運行make library
(我只想要庫)時生成該程序。
如果有人能提供一個簡單的例子,例如一個由main.c
,foo.c
和bar.c
組成的程序和由foo.c
和bar.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。我不確定如何在構建系統中實現提供的答案。
它可以做到這一點。你有什麼嘗試? – ldav1s 2013-02-11 18:15:59
分手。將圖書館放在一個項目中,並將該程序放入另一個項目中。 – 2013-02-11 22:39:42