2009-05-27 47 views
5

我有一個C++ autoconf管理項目,我正在適應在FreeBSD主機上編譯。 原始系統是Linux,所以我讓一個AM_CONDITIONAL來區分我正在構建的主機並將代碼分離到系統特定的文件中。Automake和同名文件

configure.ac

 

AC_CANONICAL_HOST 
AM_CONDITIONAL([IS_FREEBSD],false) 
case $host in 
     *free*)  
      AC_DEFINE([IS_FREEBSD],[1],[FreeBSD Host]) 
      AM_CONDITIONAL([IS_FREEBSD],true) 
      BP_ADD_LDFLAG([-L/usr/local/lib]) 
       ;; 
esac 

Makefile.am

 

lib_LTLIBRARIES=mylib.la 
mylib_la_SOURCES=a.cpp \ 
       b.cpp 

if IS_FREEBSD 
    mylib_la_SOURCES+=freebsd/c.cpp 
else 
    mylib_la_SOURCES+=linux/c.cpp 
endif 

當我運行automake的失敗與此類型的消息:

 
Makefile.am: object `c.lo' created by `linux/c.cpp' and `freebsd/c.cpp' 

如何配置automake的任何想法甚至在Makefile.in構建過程中尊重這個條件?

我這個作品,如果文件有不同的名稱,但它的c + +代碼,我試圖保持文件名相同的類名。

在此先感謝!

+1

Makefile.am中有一個輸入錯誤:「IS_FREEBSD」應爲「if IS_FREEBSD」。 – adl 2009-05-28 07:44:29

+0

謝謝adl,修改 – 2009-05-28 11:52:26

回答

11

你可以請求的對象要建在他們各自的子目錄裏

AUTOMAKE_OPTIONS = subdir-objects 
+1

完美答案,只需要說這是一個Makefile.am選項! 謝謝! – 2009-05-28 11:54:37

7

另一種選擇,除了子目錄對象,是給每個子項目的一些自定義每個項目建立的標誌。當你這樣做的時候,automake改變它的* .o命名規則以將目標名稱預先加到模塊名稱上。例如,這樣的:

mylib_la_CXXFLAGS=$(AM_CXXFLAGS) 
mylib_la_SOURCES=a.cpp b.cpp 

將導致輸出文件mylib_la-a.o和mylib_la-B.O,而不是a.o和b.o.因此,您可以擁有兩個不同的項目,它們具有相同的輸出目錄,每個項目都有一個b.cpp文件,並且不會產生衝突。

請注意,我是通過將項目特定的CXXFLAGS設置爲automake已經使用的值AM_CXXFLAGS來實現的。 Automake不夠智能,無法檢測到這個技巧並使用較短的* .o名稱。如果碰巧你需要每個項目的構建選項,你當然可以做到這一點,而不是這個黑客。

有一個automake變量的whole list,當設置在每個可執行的基礎上,給出相同的效果。因此,舉例來說,也許一個子項目需要特別的鏈接標誌了,所以你給它這樣的:

mylib_la_LDFLAGS=-lfoo 

這會給你的前綴* .o文件就像AM_CXXFLAGS伎倆一樣,只是現在你「合法地」使用這個功能,而不是欺騙automake做這件事。

順便說一下,改變程序的構建方式僅僅是基於它所構建的操作系統,這是很糟糕的autoconf風格。良好的autoconf風格僅用於檢查特定的平臺功能,而不是整個平臺,因爲平臺會發生變化。今天FreeBSD可能是一種特定的方式,但也許在下一個版本中,它會從Linux複製一個功能,這將消除您需要以兩種不同的方式構建您的程序。或者,您今天使用的功能可能已被棄用,並會在下一個版本中刪除。

在autotools,grasshopper中有四十年的便攜式Unix編程智慧。我給出的「maybes」以上有發生在過去,並且肯定會再這樣做。測試各個功能是應對不斷變化的平臺的最敏捷的方式。

您也可以從這種方法中獲得意想不到的獎勵。例如,也許你的程序需要兩個不可移植的功能來完成它的工作。說在FreeBSD上,這些是A和B的特性,而在Linux上,它們是X和Y的特性; A和X是類似的機制,但接口不同,B和Y也是如此。它可能是來自原始BSD的特性,並且在Solaris中,因爲它在80年代具有來自SunOS的BSD根,並且Solaris也具有從90年代初期基於系統V的重新設計開始具備Y功能。通過測試這些功能,您的程序也可以在Solaris上運行,因爲它具有程序需要的功能,而不是與FreeBSD和Linux相同。