2009-12-28 128 views
0

我正在努力改進對於Bitfighter的冗長的Linux構建過程,並且遇到了make問題。我的過程其實很簡單,因爲make(幾乎)是普遍的,所以如果可以的話,我想堅持下去。使用make構建我的項目

下面我附上我目前的Makefile,它的工作原理,但很笨拙。我正在尋找改進它的方法,並且在這一點上有三個具體問題。

第一個,該項目可以建立幾個選項。我們來看看這個例子的調試和專用。專用選項將排除所有UI代碼,併爲託管(但不玩遊戲)創建更有效的二進制文件。調試選項向編譯器添加一個標誌,激活調試代碼。人們可能希望用這兩種選項中的任何一種或兩種選項來構建遊戲。

所以問題是,我該如何做這項工作?正如您從下面makefile中的註釋中所看到的那樣,通過設置DFLAGS = -DTNL_DEBUG來啓用調試。我想有用戶類型

make dedicated debug 

而不是

make dedicated DFLAGS=-DTNL_DEBUG 

我如何重寫我的makefile所以,這將工作?

其次,當我在不同版本的Linux上安裝lualibs包時,我得到不同的庫。例如,在Ubuntu上,當我使用apt-get安裝lualib軟件包時,我在我的/ usr/lib文件夾中獲得了lua5.1.a。在Centos上,當我用yum安裝相同的東西時,我在我的/ usr/lib文件夾中以liblua.a結束。我怎樣才能弄清楚我擁有哪個圖書館,並將其鏈接到?很明顯,-l指令不夠聰明。我希望用戶不必擔心Lua在安裝時結束的位置,以及makefile才能正常工作。

最後,有沒有什麼辦法讓使檢測是否一定需要的包(freeglut,例如)尚未安裝,並可以自動安裝它們,或者至少提醒用戶他們需要得到事實他們安裝(而不是簡單地終止一個神祕的錯誤消息)?

謝謝!

這是我的Makefile。

 
# Bitfighter Makefile 
####################################### 
# 
# Configuration 
# 
# 
# Some installs of lua call the lua library by different names, and you 
# may need to override the default lua library path. For the ServerHitch 
# CENTOS installs, for example, you will need to specify the lua library 
# on the make command line: 
#  LUALIB=/usr/lib/liblua.a 
# 
# 
# To compile Bitfighter with debugging enabled, specify 
#  DFLAGS=-DTNL_DEBUG 
# on the make command line 
# 
# 
# Building with make on Windows is still highly experimental. You will 
# probably need to add 
#  WFLAGS="-DWIN32 -D_STDCALL_SUPPORTED" THREADLIB= GLUT=-lglut32 INPUT=winJoystick.o 
# to the make command line to have any hope of getting it to work! :-) 
# 
# 
####################################### 

CC=g++ -g -I../tnl -I../glut -I../openal -DTNL_ENABLE_LOGGING 
THREADLIB= -lpthread 
GLUT=-lGL -lGLU -lglut 
INPUT=linuxInput.o 

OBJECTS_ZAP=\ 
    CTFGame.o\ 

...many more... 

    BotNavMeshZone.o\ 
    ../master/masterInterface.o\ 

CFLAGS= 
DFLAGS= 
EXEFILE=bitfighter 
OPENAL=../openal/linux/libopenal.a 
LUALIB=-llua5.1 
WFLAGS= 

.c.o: 
    $(CC) $(DFLAGS) $(WFLAGS) -c $(CFLAGS) $< 

.cpp.o : 
    $(CC) $(DFLAGS) $(WFLAGS) -c $(CFLAGS) $< 


default: ../exe/bitfighter 

bitfighter: ../exe/bitfighter 

dedicated: CFLAGS=-DZAP_DEDICATED 
dedicated: GLUT= 
dedicated: OPENAL= 
dedicated: EXEFILE=bitfighterd 
dedicated: ../exe/bitfighter 


../exe/bitfighter: $(OBJECTS_ZAP) 
    $(CC) -o ../exe/$(EXEFILE) $(OBJECTS_ZAP) ../tnl/libtnl.a \ 
     ../libtomcrypt/libtomcrypt.a \ 
     $(OPENAL) $(GLUT) $(THREADLIB) $(LUALIB) -lstdc++ -lm 

../master/masterInterface.o: 
    make -C ../master 

clean: 
    rm -f $(OBJECTS_ZAP) ../exe/bitfighter ../exe/bitfightered 

cleano: 
    rm -f $(OBJECTS_ZAP) 

回答

4

原始make並不真正支持任何這些用途。 make認爲在命令行中傳入的目標是要構建的不同程序或要採取的不同操作,並且沒有使用傳入的兩個目標切換單個構建的獨立選項的概念。 make也沒有任何內置的支持來檢查安裝的軟件包版本。

這是一個陡峭的學習曲線,但所有這些問題最常見的解決方案是使用GNU autotools工具鏈(特別是AutoconfAutomake)。這些工具的編寫是爲了幫助編寫可移植,可配置的構建系統,它可以探測系統在不同位置的庫,並根據配置選項和用戶系統生成Makefile。

如果您曾經運行./configure; make; make install,您可能使用了使用Autoconf和Automake生成的configure腳本。

Wikipedia article提供了一些概述,Automake manual提供了一個教程介紹工具鏈。

對於您的使用情況,你可能會想要做的就是創建一個configure使用的Autoconf這需要選項,如--enable-debug--enable-dedicated,以設置生成你的Makefile選項。然後你可以將你的Makefile移植到Automake,或者你可以簡單地把你的Makefile變成一個Makefile.in,其中有一些Autoconf在生成Makefile時會填寫的變量。

儘管GNU Autotools系統非常完整,並且支持很多平臺,但它有點巴洛克式。還有一些支持一些類似自動配置行爲的替代構建系統,如CMakeSCons,如果Autotools感覺太多,可能值得考慮。

對於檢測某些庫的特定任務,並找到需要鏈接到它們的選項,可以使用pkg-config;然而,並非所有的庫都安裝了pkg-config的定義,並且並非所有的系統甚至安裝了pkg-config,所以它不是一個通用的解決方案,但它可以成爲一種快速而簡單的方式來構建一些東西,而不會在其中包含任何選項確實有效。

+0

我認爲,對於我的情況,而不是陷入autotools的複雜性,我會創建一個簡單的bash腳本,找出哪些標誌傳遞製造。如果我的構建比現在更復雜,那麼我會採納你的建議。對於我現在需要的東西來說,看起來似乎過分了。 – Watusimoto 2010-01-04 18:38:49

2

pkgconfig將回答你很多問題。

要檢測是否安裝了LUA,檢查

pkg-config --exists lua 

的返回值(如果已安裝的Lua應該返回0)使用

pkg-config --cflags --libs lua 

,看看有什麼應該在命令傳遞在系統上與lua進行編譯。 (你可能想把它添加到CFLAGS中)。

首先,Make不會幫助你。你給它的命令指定目標,而不是選項。你會想使用類似autoconf的東西來生成一個./configure腳本。從這裏,你的用戶可以輸入./configure --enable-debug --enable-dedicated(或者用--disable- *明確地關閉它們)。只要您的依賴關係使用pkg-config(大多數* nix程序所做的,不確定freeglut),那麼使用autoconf中的PKG_CHECK_MODULES宏可以很容易地給出友好的錯誤消息,併爲這些庫獲取正確的命令行參數。

由於它看起來像要用Windows構建,您可能需要考慮使用CMake來生成特定於所用系統和所需配置的Makefile。輸出看起來更好,它應該仍然可以與pkg-config配合使用。

+0

是的,這將有助於檢測thinkgs。但是它沒有提供構建適當makefile的框架。 – 2009-12-29 00:26:54

+0

對不起,如果它不清楚,但autoconf將這樣做與PKG_CHECK_MODULES和相關的宏 – sargas 2010-01-02 07:25:17

0

我會從推薦CMake開始(就像我一直這樣做)。它會從更高級別的抽象中爲您生成makefile。如果你想構建不同的配置二進制文件,你可以讓CMake生成具有不同參數的不同構建樹(一個用於「調試」,另一個用於「專用」)。這將爲您提供兩組獨立的Makefile,一組構建調試二進制文件,另一組構建專用二進制文件,全部來自同一組源代碼。 (目前大多數常用平臺的CMake可用二進制形式提供,Linux,Solaris,Windows,OSX等等,也可以從其他平臺上的源代碼構建。)

CMake也支持檢測外部庫的存在,雖然我很少使用它的經驗。

如果你想使用GMAKE繼續,我會通過遞歸調用make,這樣解決了「調試與專用」的問題:

default: debug 

debug: 
     $(MAKE) all FLAGS=.... 

dedicated: 
     $(MAKE) all FLAGS=... 
+0

感謝您的建議。這似乎無法很好地處理「專用調試」情況。然而,我會考慮CMake,看看它是否給我我所需要的。 – Watusimoto 2010-01-04 18:40:36

+0

CMake非常靈活;通常有幾種方法來解決這樣的問題。 – JesperE 2010-01-04 21:35:34

0

有第一個點一個快捷方式,不完全令人滿意的。用途:

make dedicated DEBUG=1 

,並在你的Makefile:

ifdef DEBUG 
    DFLAGS += -DTNL_DEBUG 
endif 

它也能打開其他選項,例如:

ifdef DEBUG 
    # Turn on gdb symbols 
    CFLAGS += -ggdb3 
    # Pass a specific DEBUG level to your code 
    CFLAGS += -DDEBUG=$(DEBUG) 
    # And so on 
endif 
相關問題