#Detect what kind of system we're on ifeq ($(OS), Windows_NT) UNAME:=Windows else UNAME:=$(shell uname -s) endif CP=cp ifeq ($(UNAME), Windows) EXE_EXT=.exe STA_LIB_EXT=.a DYN_LIB_EXT=.dll CMAKE_TYPE="MinGW Makefiles" CMAKE_FLAGS=-G $(CMAKE_TYPE) -DCMAKE_SH="CMAKE_SH-NOTFOUND" endif ifeq ($(UNAME), Linux) EXE_EXT= STA_LIB_EXT=.a DYN_LIB_EXT=.so CMAKE_TYPE="Unix Makefiles" CMAKE_FLAGS= -G $(CMAKE_TYPE) endif BIN_DIR=bin BUILD_DIR=build SRC_DIR=src LIB_DIR=lib DOC_DIR=doc CLIENTNAME=client SERVERNAME=server MASTERNAME=#masterserver BINS= EX_PRE = brokengine_ EX_PARTS = $(CLIENTNAME) $(SERVERNAME) $(MASTERNAME) NAMES = $(EX_PARTS:%=$(EX_PRE)%) BINS+= $(foreach part,$(EX_PARTS),$(BIN_DIR)/$(part)/bin/$(EX_PRE)$(part)$(EXE_EXT)) BUILDS = $(EX_PARTS:%=$(BUILD_DIR)/%) SRC_DIRS = $(EX_PARTS:%=$(SRC_DIR)/%) CXX?=g++ MKDIR?=mkdir RM?=rm -f ECHO?=echo LLUADIR=$(LIB_DIR)/luajit LIRRDIR=$(LIB_DIR)/irrlicht LBULDIR=$(LIB_DIR)/bullet LNNGDIR=$(LIB_DIR)/nng LOBJDIR=$(LIB_DIR)/tinyobjloader-c #Include directories ILUADIR=$(LLUADIR)/src IIRRDIR=$(LIRRDIR)/include IBULDIR=$(LBULDIR)/src INNGDIR=$(LNNGDIR)/include IOBJDIR=$(LOBJDIR)/ ISHADIR=src INCLUDE_PATHS=-I$(ILUADIR) -I$(IIRRDIR) -I$(IBULDIR) -I$(INNGDIR) -I$(ISHADIR) -I$(IOBJDIR) #library directories CXXFLAGS+=$(INCLUDE_PATHS) CXXFLAGS+=-Llib #Libraries #static libs LIB_S_LUA=lib/libluajit.a LIB_S_IRR=lib/libIrrlicht.a LIB_S_BCO=lib/libBulletCollision.a LIB_S_BDY=lib/libBulletDynamics.a LIB_S_BLM=lib/libLinearMath.a LIB_S_NNG=lib/libnng.a #dynamic libraries LIB_D_LUA=lib/lua51$(DYN_LIB_EXT) LIB_D_IRR=lib/Irrlicht$(DYN_LIB_EXT) # Bullet cannot be built dynamically LIB_D_BCO=$(LIB_S_BCO) LIB_D_BDY=$(LIB_S_BDY) LIB_D_BLM=$(LIB_S_BLM) LIB_D_NNG=lib/libnng$(DYN_LIB_EXT) CLIENT_DLLS=Irrlicht libnng lua51 SERVER_DLLS=libnng lua51 ifeq ($(DEBUG),true) LIB_OBJS = $(LIB_D_LUA) $(LIB_D_IRR) $(LIB_D_BCO) $(LIB_D_BDY) $(LIB_D_BLM) $(LIB_D_NNG) BINS+=$(CLIENT_DLLS:%=$(BIN_DIR)/$(CLIENTNAME)/bin/%$(DYN_LIB_EXT)) $(SERVER_DLLS:%=$(BIN_DIR)/$(SERVERNAME)/bin/%$(DYN_LIB_EXT)) else LIB_OBJS = $(LIB_S_LUA) $(LIB_S_IRR) $(LIB_S_BCO) $(LIB_S_BDY) $(LIB_S_BLM) $(LIB_S_NNG) endif # Libraries #order matters! CLIENT_LIBS=-lBulletDynamics -lBulletCollision -lLinearMath -lIrrlicht -lnng SERVER_LIBS=-lBulletDynamics -lBulletCollision -lLinearMath -lnng #LIBS=-lBulletDynamics -lBulletCollision -lLinearMath -lIrrlicht -lnng ifeq ($(UNAME),Windows) CLIENT_LIBS+=-lOpenGL32 else CLIENT_LIBS+=-lGL endif ifeq ($(DEBUG),true) CLIENT_LIBS+=-llua51 SERVER_LIBS+=-llua51 else CLIENT_LIBS+=-lluajit SERVER_LIBS+=-lluajit endif #can't compile with -std=c++11 because irrlicht will complain #LDFLAGS+=$(LIBS) ifeq ($(DEBUG), true) else CXXFLAGS += -static $(INCLUDE_PATHS) -D_IRR_STATIC_LIB_ -DNNG_STATIC_LIB endif S_LDFLAGS= $(SERVER_LIBS) C_LDFLAGS= $(CLIENT_LIBS) ifeq ($(UNAME),Windows) C_LDFLAGS += -mwindows -lwinmm -lstdc++ ifeq ($(DEBUG),true) else C_LDFLAGS += -lws2_32 -lmswsock -ladvapi32 S_LDFLAGS += -lws2_32 -lmswsock -ladvapi32 endif endif ifeq ($(DEBUG),true) ifeq ($(UNAME),Windows) C_LDFLAGS+=-Wl,-subsystem,console endif endif ifeq ($(DEBUG),true) CXXFLAGS+=-O0 -g -Wall -Werror else CXXFLAGS+=-O3 endif FSYSTEM_FOLDERS = lua_api phys util lua_api/irr lua_api/phys lua_api/gui lua_api/scene lua_api/video CLIENT_BUILD_FOLDERS = $(FSYSTEM_FOLDERS:%=$(BUILD_DIR)/$(CLIENTNAME)/%) all : $(BINS) @echo "Done" LAPI_S_PHYS = bhingeconstraint bphysbox bphysmodel bphysgeneric LAPI_S_LOAD = load_phys load_net common stream LAPI_PATHS_T = $(LAPI_S_PHYS:%=lua_api/phys/%) $(LAPI_S_LOAD:%=lua_api/%) SHARED_CLIENT_FILES = $(LAPI_PATHS_T) phys/physcommon util/hashmap util/tinyobj SHARED_CLIENT_OBJS = $(SHARED_CLIENT_FILES:%=$(BUILD_DIR)/$(CLIENTNAME)/%.o) # The client-side only stuff LAPI_C_GUI = iguibutton iguicheckbox iguielement iguiimage iguilabel iguiwindow iguieditbox iguicolorselector iguifiledialog iguispinbox iguitreeview iguicombobox LAPI_C_PHYS = cbphysbox cbphysmodel LAPI_C_SCENE = icamera igeneric ilight imesh LAPI_C_VIDEO = iimage itexture smaterial LAPI_C_IO = ifilesystem LAPI_LOAD = load_gui load_scene load_game load_cphys load_video load_io LAPI_OBJS_T = $(LAPI_C_GUI:%=gui/%.o) $(LAPI_C_PHYS:%=phys/%.o) $(LAPI_C_SCENE:%=scene/%.o) $(LAPI_C_VIDEO:%=video/%.o) $(LAPI_C_IO:%=io/%.o) LAPI_OBJS = $(LAPI_OBJS_T:%=$(BUILD_DIR)/$(CLIENTNAME)/lua_api/%) $(LAPI_LOAD:%=$(BUILD_DIR)/$(CLIENTNAME)/lua_api/%.o) CLIENT_FILES = initdevice menuhandeler callbackhandeler CLIENT_SRCS = $(CLIENT_FILES:%=$(BUILD_DIR)/$(CLIENTNAME)/%.o) $(LAPI_OBJS) CLIENT_OBJS = $(BUILD_DIR)/$(CLIENTNAME)/main.o $(CLIENT_SRCS) $(SHARED_CLIENT_OBJS) #Compile the client $(BIN_DIR)/$(CLIENTNAME)/bin/$(EX_PRE)$(CLIENTNAME)$(EXE_EXT) : $(CLIENT_OBJS) $(LIB_OBJS) @echo "[CLIENT] Building binary $@" $(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) $(C_LDFLAGS) $(LIB_OBJS) # -Wl,--verbose # does not have .hpp associated $(BUILD_DIR)/$(CLIENTNAME)/main.o : $(SRC_DIR)/client/main.cpp @$(CXX) $(CXXFLAGS) -c -o $@ $^ # does have the .hpp associated in src/client $(CLIENT_SRCS) : $(BUILD_DIR)/$(CLIENTNAME)/%.o : src/client/%.cpp $(SRC_DIR)/client/%.hpp @echo "[CLIENT] CXX $<" @$(CXX) $(CXXFLAGS) -c -o $@ $< # does have the .hpp associated in src/shared $(SHARED_CLIENT_OBJS) : $(BUILD_DIR)/$(CLIENTNAME)/%.o : src/shared/%.cpp $(SRC_DIR)/shared/%.hpp @echo "[CLIENT] CXX $<" @$(CXX) $(CXXFLAGS) -c -o $@ $< #compile server SERVER_FILES = lua_api/load_game lua_api/load_io SERVER_OBJ=$(SERVER_FILES:%=$(BUILD_DIR)/$(SERVERNAME)/%.o) SHARED_SERVER_FILES= $(LAPI_PATHS_T) util/hashmap phys/physcommon util/tinyobj SHARED_SERVER_OBJS=$(SHARED_SERVER_FILES:%=$(BUILD_DIR)/$(SERVERNAME)/%.o) SERVER_OBJS = $(SERVER_OBJ) $(SHARED_SERVER_OBJS) $(BUILD_DIR)/$(SERVERNAME)/main.o $(BIN_DIR)/$(SERVERNAME)/bin/$(EX_PRE)$(SERVERNAME)$(EXE_EXT) : $(SERVER_OBJS) $(LIB_OBJS) @echo "[SERVER] Building binary $@" @$(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) $(S_LDFLAGS) # Special, main does not have a .hpp associated with it $(BUILD_DIR)/$(SERVERNAME)/main.o : $(SRC_DIR)/server/main.cpp @echo "[SERVER] CXX $<" @$(CXX) $(CXXFLAGS) -c -o $@ $^ $(SHARED_SERVER_OBJS) : $(BUILD_DIR)/$(SERVERNAME)/%.o : $(SRC_DIR)/shared/%.cpp $(SRC_DIR)/shared/%.hpp @echo "[SERVER] CXX $<" @$(CXX) $(CXXFLAGS) -c -o $@ $< $(SERVER_OBJ) : $(BUILD_DIR)/$(SERVERNAME)/%.o : $(SRC_DIR)/server/%.cpp $(SRC_DIR)/server/%.hpp @echo "[SERVER] CXX $<" @$(CXX) $(CXXFLAGS) -c -o $@ $< #compile libraries $(LIBLUA) : $(ILUADIR)/Makefile @echo "Could not find $(LIBLUA), rebuilding" cd $(ILUADIR) && $(MAKE) "BUILDMODE= static" $(CP) $(ILUADIR)/libluajit.a lib IRRMAKEFLAGS= IRRMADELIB= ifeq ($(UNAME), Windows) ifeq ($(DEBUG),true) IRRMAKEFLAGS=sharedlib_win32 IRRMADELIB=$(LIRRDIR)/bin/Win32-gcc else IRRMAKEFLAGS=staticlib_win32 IRRMADELIB=$(LIRRDIR)/lib/Win32-gcc endif else IRRMADELIB=$(LIRRDIR)/lib/Linux endif ifeq ($(DEBUG),true) else IRRMAKEFLAGS+=NDEBUG=1 endif # Library - Irrlicht $(LIB_S_IRR) : $(IRRMADELIB)/libIrrlicht.a $(CP) $^ $@ $(IRRMADELIB)/libIrrlicht.a : $(LIRRDIR)/source/Irrlicht/Makefile sed --in-place=OLD '107s/ -ld3dx9d//' lib/irrlicht/source/Irrlicht/Makefile cd $(LIRRDIR)/source/Irrlicht && $(MAKE) $(IRRMAKEFLAGS) $(LIB_D_IRR) : $(IRRMADELIB)/Irrlicht$(DYN_LIB_EXT) @echo "Could not find $@, remaking..." $(CP) $^ $@ $(BIN_DIR)/$(CLIENTNAME)/bin/Irrlicht$(DYN_LIB_EXT) : $(IRRMADELIB)/Irrlicht$(DYN_LIB_EXT) $(CP) $^ $@ $(IRRMADELIB)/Irrlicht$(DYN_LIB_EXT) : $(LIRRDIR)/source/Irrlicht/Makefile sed --in-place=OLD '107s/ -ld3dx9d//' lib/irrlicht/source/Irrlicht/Makefile cd $(LIRRDIR)/source/Irrlicht && $(MAKE) $(IRRMAKEFLAGS) ifeq ($(UNAME),Windows) LUAJIT_ARGS:= TARGET_SYS=Windows else LUAJIT_ARGS:= endif # Library - Lua # Client $(BIN_DIR)/$(CLIENTNAME)/bin/lua51$(DYN_LIB_EXT) : $(LIB_D_LUA) $(CP) $^ $@ # Server $(BIN_DIR)/$(SERVERNAME)/bin/lua51$(DYN_LIB_EXT) : $(LIB_D_LUA) $(CP) $^ $@ $(LLUADIR)/src/libluajit$(STA_LIB_EXT) : $(LLUADIR)/src/Makefile cd $(LLUADIR)/src && $(MAKE) $(LUAJIT_ARGS) "BUILDMODE= static" $(LIB_S_LUA) : $(LLUADIR)/src/libluajit$(STA_LIB_EXT) $(CP) $^ $@ $(LLUADIR)/src/lua51$(DYN_LIB_EXT) : $(LLUADIR)/src/Makefile cd $(LLUADIR)/src && $(MAKE) $(LUAJIT_ARGS) "BUILDMODE= dynamic" $(LIB_D_LUA) : $(LLUADIR)/src/lua51$(DYN_LIB_EXT) $(CP) $^ $@ # Library - Bullet $(LBULDIR)/lib/libBulletCollision.a : $(LBULDIR)/Makefile cd $(LBULDIR) && $(MAKE) BulletCollision $(LBULDIR)/lib/libBulletDynamics.a : $(LBULDIR)/Makefile cd $(LBULDIR) && $(MAKE) BulletDynamics $(LBULDIR)/lib/libLinearMath.a : $(LBULDIR)/Makefile cd $(LBULDIR) && $(MAKE) LinearMath $(LIB_D_BCO) : $(LBULDIR)/lib/libBulletCollision.a $(CP) $^ $@ $(LIB_D_BDY) : $(LBULDIR)/lib/libBulletDynamics.a $(CP) $^ $@ $(LIB_D_BLM) : $(LBULDIR)/lib/libLinearMath.a $(CP) $^ $@ $(LBULDIR)/Makefile : $(LBULDIR)/CMakeLists.txt cd $(LBULDIR) && cmake $(CMAKE_FLAGS) -DBUILD_EXTRAS=off -DBUILD_DEMOS=off # Library - NNG NNGFLAGS= $(BIN_DIR)/$(CLIENTNAME)/bin/libnng$(DYN_LIB_EXT) : $(LIB_D_NNG) $(CP) $^ $@ $(BIN_DIR)/$(SERVERNAME)/bin/libnng$(DYN_LIB_EXT) : $(LIB_D_NNG) $(CP) $^ $@ $(LNNGDIR)/dynamic/Makefile : $(LNNGDIR)/CMakeLists.txt cd $(LNNGDIR)/dynamic && cmake $(CMAKE_FLAGS) -DBUILD_SHARED_LIBS="TRUE" ../ $(LIB_S_NNG) : $(LNNGDIR)/static/libnng$(STA_LIB_EXT) cp $< $@ $(LIB_D_NNG) : $(LNNGDIR)/dynamic/libnng$(DYN_LIB_EXT).a cp $< $@ $(LNNGDIR)/static/libnng$(DYN_LIB_EXT).a : $(LNNGDIR)/static/Makefile cd $(LNNGDIR)/static && $(MAKE) nng $(LNNGDIR)/dynamic/libnng$(DYN_LIB_EXT) : $(LNNGDIR)/dynamic/Makefile cd $(LNNGDIR)/dynamic && $(MAKE) nng $(LNNGDIR)/Makefile : $(LNNGDIR)/CMakeLists.txt @echo "LIB_OBJS were $(LIB_OBJS)" cd $(LNNGDIR) && cmake $(CMAKE_FLAGS) $(NNGCMAKEFLAGS) TEST_BIN_NAMES=brokengine_client.exe Irrlicht.dll libnanomsg.dll libnng.dll lua51.dll TEST_BINS=$(TEST_BIN_NAMES:%=test/bin/%) #compile & run tests test: $(TEST_BINS) @$(ECHO) "Running busted tests" @./busted busted.spec $(TEST_BINS) : test/bin/% : bin/client/bin/% $(CP) $^ $@ $(TEST_PATH)test_stream : $(TEST_SRC)test_streams.cpp $(SHARED_SRC)/lua_api/stream.cpp $(SHARED_SRC)/lua_api/stream.hpp @$(CC) $(CFLAGS) -o $(TEST_PATH)test_stream $(TEST_SRC)test_streams.cpp $(SHARED_SRC)/lua_api/stream.cpp $(SHARED_SRC)/lua_api/stream.hpp $(TEST_PATH)test_phys : $(TEST_SRC)test_phys.cpp $(CC) $(CFLAGS) -o $(TEST_PATH)test_phys $(TEST_SRC)test_phys.cpp $(SLIBS) #end tests cleantest : echo $(BUILDS:%=%/*.o) clean : $(RM) $(CLIENT_OBJS) $(RM) $(SERVER_OBJS) $(RM) $(BINS)