Building my project with make
I'm working to improve the long languishing Linux build process for <a href="http://bitfighter.org">Bitfighter</a>, and am having problems with make.  My process is actually quite simple, and since make is (nearly) universal, I want to stick with it if I can.

Below I've attached my current Makefile, which works, but clumsily so.  I'm looking for ways to improve it, and have three specific questions at this point.

**First**, the project can be built with several options.  Let's take debug and dedicated for this example.  The dedicated option will exclude all UI code, and create a more efficient binary good for hosting (but not playing) games.  The debug option adds a flag to the compiler that activates debugging code.  One might want to build the game with either, both, or neither of these options.

So the question is, how do I make this work?  As you can see from the comments in the makefile below, debugging is enabled by setting DFLAGS=-DTNL_DEBUG.  I'd like to have the user type 

    make dedicated debug

rather than 

    make dedicated DFLAGS=-DTNL_DEBUG

How can I rewrite my makefile so that this will work?

**Secondly**, when I install the lualibs package on different versions of Linux, I get different libraries.  For example, on Ubuntu, when I install the lualib package with apt-get, I get *lua5.1.a* in my /usr/lib folder.  On Centos, when I install the same thing with yum, I end up with *liblua.a* in my /usr/lib folder.  How can I get make to figure out which library I've got, and link that in?  Obviously the -l directive is not smart enough for that.  I'd like the user to not have to worry about where Lua ends up when it gets installed, and for the makefile to just work.

**Finally**, is there any way to get make to detect whether certain required packages (freeglut, for example) have not been installed, and either install them automatically or at least alert the user to the fact they need to get them installed (as opposed to simply terminating with a cryptic error message)?

Thanks!!


Here is my Makefile. 

<pre>
# 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) $&lt;

.cpp.o : 
   $(CC) $(DFLAGS) $(WFLAGS) -c $(CFLAGS) $&lt;


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)
</pre>
Building my project with make
===

I'm working to improve the long languishing Linux build process for <a href="http://bitfighter.org">Bitfighter</a>, and am having problems with make.  My process is actually quite simple, and since make is (nearly) universal, I want to stick with it if I can.

Below I've attached my current Makefile, which works, but clumsily so.  I'm looking for ways to improve it, and have three specific questions at this point.

**First**, the project can be built with several options.  Let's take debug and dedicated for this example.  The dedicated option will exclude all UI code, and create a more efficient binary good for hosting (but not playing) games.  The debug option adds a flag to the compiler that activates debugging code.  One might want to build the game with either, both, or neither of these options.

So the question is, how do I make this work?  As you can see from the comments in the makefile below, debugging is enabled by setting DFLAGS=-DTNL_DEBUG.  I'd like to have the user type 

    make dedicated debug

rather than 

    make dedicated DFLAGS=-DTNL_DEBUG

How can I rewrite my makefile so that this will work?

**Secondly**, when I install the lualibs package on different versions of Linux, I get different libraries.  For example, on Ubuntu, when I install the lualib package with apt-get, I get *lua5.1.a* in my /usr/lib folder.  On Centos, when I install the same thing with yum, I end up with *liblua.a* in my /usr/lib folder.  How can I get make to figure out which library I've got, and link that in?  Obviously the -l directive is not smart enough for that.  I'd like the user to not have to worry about where Lua ends up when it gets installed, and for the makefile to just work.

**Finally**, is there any way to get make to detect whether certain required packages (freeglut, for example) have not been installed, and either install them automatically or at least alert the user to the fact they need to get them installed (as opposed to simply terminating with a cryptic error message)?

Thanks!!


Here is my Makefile. 

<pre>
# 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) $&lt;

.cpp.o : 
   $(CC) $(DFLAGS) $(WFLAGS) -c $(CFLAGS) $&lt;


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)
</pre>