2010-05-24 10 views

回答

0

有兩種方法可以解決這個問題,創建一個單獨的自動工具構建過程,或者廢除自動工具和手動代碼,或者創建一個新的Makefile

 
myprojectfoo 
    | 
    +-- src 
    | 
    +-- man 
    | 
    +-- messages 
    | 
    +-- lib 
    | 
    +-- include 
    | 
    +-- others 

看一看上面的圖示中,名爲myprojectfoo一個虛構項目,並使用自動工具來建立一個名爲foo二進制文件。頂級目錄即myprojectfoo將有configure.acMakefile.amMakefile.in,在子目錄中會有至少Makefile.amMakefile.in。自動工具將創建並執行make命令來構建項目。現在

,從什麼,我理解你正在嘗試做的事:

 
myprojectfoo 
    | \/
    +-- sXc 
    | /\ 
    +-- man 
    | 
    +-- messages 
    | 
    +-- lib 
    |  \/
    +-- incXude 
    | /\ 
    +-- others 

你要拿出src子目錄和它的include's也。那麼在這種情況下,創建一個單獨的Makefile將更容易(讀取-沒有自動工具)構建..在這種情況下,它會更容易。

我能想到的是最好的方法,你將不得不做出這樣的決定最終有多大是要提取,一旦你繼續與該項目的源代碼的子集,刪除所有引用Makefile.amMakefile.in ...並借用現有的簡單的Makefile模板來構建它並調用它像這樣

 
make -f MyMakefile 

OR

如果你想建立使用該子集使用自動工具一個單獨的項目:

  1. 創建裸機Makefile.am,如下圖所示。
  2. 源上創建一個最基本的configure.ac,如下圖所示...
  3. 運行自動掃描挑選出相關性,輸出文件「configure.scan的」的結果添加到configure.ac
  4. 運行automake(這樣做一次!)
  5. 運行autoconf然後。它可能會抱怨缺少的文件,如INSTALL,複製等
  6. 隨後的所有更改到configure.ac,運行autoreconf後,將執行的automake的autoconf等配套汽車修理工具程序。

服用Makefile.am用於Linux的樣本...

 
SUBDIRS = src include 
ACLOCAL_AMFLAGS = -I m4 

服用configure.ac用於Linux的樣本...

 
AC_PREREQ(2.63) 

AC_INIT([mysubsetprojectfoo], [0.1a], [[email protected]]) 
AC_CONFIG_AUX_DIR([build-aux]) 

AM_INIT_AUTOMAKE([-Wall -Werror]) 
AM_GNU_GETTEXT_VERSION([0.17]) 
AM_GNU_GETTEXT([external]) 
AM_CFLAGS= 
# Checks for programs. 
AC_HEADER_STDC 
AC_PROG_CC 

AC_ARG_ENABLE([debug], 
[ --enable-debug    Turn on debugging], 
[case "${enableval}" in 
    yes) debug=true ;; 
    no) debug=false ;; 
    *) AC_MSG_ERROR([bad value ${enableval} for --enable-debug]) ;; 
esac],[debug=false]) 
AM_CONDITIONAL([DEBUG], [test x$debug = xtrue]) 
# Checks for libraries. 
AC_CHECK_LIB([mylib], [mylib_function], [:]) 
if test "$mylib" = :; then 
     AC_MSG_ERROR([MyLib is missing.\ 
            This can be downloaded from 'http://www.foo.baz']) 
fi 
AC_CONFIG_HEADERS([config.h]) 

# Checks for header files. 
# FROM running 'autoscan' on the source directory 
AC_CHECK_HEADERS([arpa/inet.h fcntl.h libintl.h locale.h netinet/in.h stdlib.h string.h sys/ioctl.h sys/socket.h syslog.h unistd.h]) 

# Checks for typedefs, structures, and compiler characteristics. 
AC_C_INLINE 
AC_C_CONST 
AC_TYPE_SIGNAL 
AC_TYPE_PID_T 
AC_TYPE_UID_T 
AC_TYPE_SIZE_T 

# Checks for library functions. 
AC_FUNC_FORK 
AC_FUNC_MALLOC 
AC_CHECK_FUNCS([atexit inet_ntoa memset regcomp socket strdup strerror]) 

AC_CONFIG_FILES([Makefile src/Makefile include/Makefile]) 
AC_OUTPUT 

的自動工具的命令,是我的頭頂,我可能錯過了一些東西..可以通過在這篇文章的底部對此發表評論,並且會相應地進行修改。

+0

太複雜了......我剛剛結束了複製整個項目,並從「./configure」腳本中刪除部分,這些腳本抱怨丟失的東西。 我想從大事物中提取小補充程序。它也有額外的不需要的依賴。 – 2010-05-24 17:52:15

+0

我認爲可能有一件事情會分析makefiles(因爲autotools這麼大),並找到用於構建給定目標的源文件的子集。 – 2010-05-24 17:54:41

+0

而不是直接運行automake和autoconf(並忘記運行aclocal,autoheader,libtoolize等),它更容易運行autoreconf。這將以正確的順序調用所有必需的自動工具。 – 2010-05-25 07:00:16

相關問題