add some hacky code to allow passing sfc files with -b
[openc2e.git] / CMakeLists.txt
blob1fb9d90746a8b3b1d22c205ccd6304b574d65329
1 PROJECT (OPENC2E CXX C)
3 SET(SRC "${OPENC2E_SOURCE_DIR}")
4 SET(BIN "${OPENC2E_BINARY_DIR}")
5 SET(GEN "${BIN}/generated")
6 EXECUTE_PROCESS(COMMAND mkdir "${GEN}" -p)
8 SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS 1)
9 SET(CMAKE_MODULE_PATH "${SRC}/cmake")
11 SET(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "The type of build to perform. Valid values are: RelWithDebInfo (default), Debug, Release, MinSizeRel")
12 IF (CMAKE_BUILD_TYPE STREQUAL "")
13         SET(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "The type of build to perform. Valid values are: RelWithDebInfo (default), Debug, Release, MinSizeRel" FORCE)
14 ENDIF (CMAKE_BUILD_TYPE STREQUAL "")
16 SET(OPENC2E_USE_QT "TRUE" CACHE BOOL "Build the qt GUI")
17 SET(OPENC2E_USE_OPENAL "AUTO" CACHE STRING "Use OpenAL (YES/NO/AUTO)")
18 IF (OPENC2E_USE_OPENAL MATCHES "^(YES|NO|AUTO)$")
19 ELSE (OPENC2E_USE_OPENAL MATCHES "^(YES|NO|AUTO)$")
20         MESSAGE(SEND_ERROR "The value of OPENC2E_USE_OPENAL must be YES, NO, or AUTO.")
21 ENDIF (OPENC2E_USE_OPENAL MATCHES "^(YES|NO|AUTO)$")
23 SET(OPENC2E_USE_SERIALIZATION "FALSE" CACHE BOOL "Build the experimental serialization code")
24 MARK_AS_ADVANCED(FORCE OPENC2E_USE_SERIALIZATION)
25 IF (OPENC2E_USE_SERIALIZATION)
26         SET(SER_SRCS caosVM_ser_real.cpp)
27 ELSE (OPENC2E_USE_SERIALIZATION)
28         SET(SER_SRCS caosVM_ser_stub.cpp)
29 ENDIF (OPENC2E_USE_SERIALIZATION)
32 SET(OPENC2E_CORE
33         Agent.cpp
34         AgentHelpers.cpp
35         AgentRef.cpp
36         attFile.cpp
37         Backend.cpp
38         Blackboard.cpp
39         blkImage.cpp
40         bmpImage.cpp
41         bytecode.cpp
42         c16Image.cpp
43         c2eBrain.cpp
44         CallButton.cpp
45         Camera.cpp
46         caosScript.cpp
47         caosVar.cpp
48         caosVM_agent.cpp
49         caosVM_camera.cpp
50         caosVM_compound.cpp
51         caosVM_core.cpp
52         caosVM_creatures.cpp
53         caosVM_debug.cpp
54         caosVM_files.cpp
55         caosVM_flow.cpp
56         caosVM_genetics.cpp
57         caosVM_history.cpp
58         caosVM_input.cpp
59         caosVM_map.cpp
60         caosVM_motion.cpp
61         caosVM_net.cpp
62         caosVM.cpp
63         caosVM_ports.cpp
64         caosVM_resources.cpp
65         caosVM_scripts.cpp
66         caosVM_sounds.cpp
67         caosVM_time.cpp
68         caosVM_variables.cpp
69         caosVM_vectors.cpp
70         caosVM_vehicles.cpp
71         caosVM_world.cpp
72         ${GEN}/cataloglexer.cpp
73         Catalogue.cpp
74         ${GEN}/catalogue.tab.cpp
75         ${GEN}/cmddata.cpp
76         cobFile.cpp
77         CompoundAgent.cpp
78         CompoundPart.cpp
79         Creature.cpp
80         CreatureAgent.cpp
81         creaturesImage.cpp
82         dialect.cpp
83         Engine.cpp
84         exceptions.cpp
85         fileSwapper.cpp
86         genomeFile.cpp
87         historyManager.cpp
88         imageManager.cpp
89         #       ${GEN}/lex.mng.cpp
90         ${GEN}/caoslexer.cpp
91         Lift.cpp
92         Map.cpp
93         MetaRoom.cpp
94         mmapifstream.cpp
95         #       mngfile.cpp
96         #       ${GEN}/mngparser.tab.cpp
97         oldBrain.cpp
98         PathResolver.cpp
99         physics.cpp
100         PointerAgent.cpp
101         Port.cpp
102         pray.cpp
103         prayManager.cpp
104         renderable.cpp
105         Room.cpp
106         Scriptorium.cpp
107         SDLBackend.cpp
108         SFCFile.cpp
109         SimpleAgent.cpp
110         SkeletalCreature.cpp
111         sprImage.cpp
112         streamutils.cpp
113         Vehicle.cpp
114         World.cpp
115         main.cpp
116         util.cpp
119 SET(OPENC2E_SDL
120         # all in the main openc2e listing
121         # XXX: non-sdl-based backends?
124 SET(OPENC2E_QT
125         qtgui/qtopenc2e.cpp
126         qtgui/openc2eview.cpp
127         qtgui/AgentInjector.cpp
128         qtgui/BrainViewer.cpp
129         qtgui/imagepreview.cpp
130         qtgui/c1cobfile.cpp
131         qtgui/QtBackend.cpp
132         qtgui/GraphWidget.cpp
133         qtgui/CreatureGrapher.cpp
134         tools/braininavat/brainview.cpp)
136 SET(OPENC2E_QT_MOC_HDRS
137         qtgui/qtopenc2e.h
138         qtgui/openc2eview.h
139         qtgui/AgentInjector.h
140         qtgui/BrainViewer.h
141         qtgui/imagepreview.h
142         qtgui/GraphWidget.h
143         qtgui/CreatureGrapher.h
144         tools/braininavat/brainview.h)
146 SET(OPENC2E_QT_UIS
147         qtgui/agents.ui)
151 cmake_minimum_required(VERSION 2.4.0)
152 INCLUDE(TestBigEndian)
153 INCLUDE(CheckIncludeFile)
154 TEST_BIG_ENDIAN(BIG_ENDIAN)
155 IF(BIG_ENDIAN)
156         ADD_DEFINITIONS("-DOC2E_BIG_ENDIAN=1")
157         CHECK_INCLUDE_FILE(byteswap.h HAVE_BYTESWAP_H)
158         IF(HAVE_BYTESWAP_H)
159                 ADD_DEFINITIONS("-DHAVE_BYTESWAP_H=1")
160         ELSE(HAVE_BYTESWAP_H)
161                 ADD_DEFINITIONS("-DHAVE_BYTESWAP_H=0")
162         ENDIF(HAVE_BYTESWAP_H)
163 ELSE(BIG_ENDIAN)
164         ADD_DEFINITIONS("-DOC2E_BIG_ENDIAN=0")
165 ENDIF(BIG_ENDIAN)
166 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
167 IF(HAVE_STDINT_H)
168         ADD_DEFINITIONS("-DHAVE_STDINT_H=1")
169 ELSE(HAVE_STDINT_H)
170 ENDIF(HAVE_STDINT_H)
172 FIND_PACKAGE(SDL REQUIRED)
173 #FIND_PACKAGE(SDL_mixer REQUIRED)
174 FIND_PACKAGE(SDL_net REQUIRED)
175 FIND_PACKAGE(SDL_gfx REQUIRED)
176 FIND_PACKAGE(SDL_ttf REQUIRED)
177 IF(OPENC2E_USE_OPENAL MATCHES "^(YES|AUTO)$")
178         FIND_PACKAGE(OpenAL)
179 ELSE(OPENC2E_USE_OPENAL MATCHES "^(YES|AUTO)$")
180         SET(OPENAL_FOUND "NO")
181 ENDIF(OPENC2E_USE_OPENAL MATCHES "^(YES|AUTO)$")
182 FIND_PACKAGE(ALUT)
183 FIND_PACKAGE(Boost REQUIRED)
184 IF(OPENC2E_USE_QT)
185         find_package(Qt4 REQUIRED)
186 ENDIF(OPENC2E_USE_QT)
188 SET(USE_OPENAL "NO")
190 IF(OPENAL_FOUND STREQUAL "YES")
191     IF(ALUT_FOUND STREQUAL "YES")
192         SET(USE_OPENAL "YES")
193     ENDIF(ALUT_FOUND STREQUAL "YES")
194 ENDIF(OPENAL_FOUND STREQUAL "YES")
195      
196 IF(USE_OPENAL STREQUAL "NO")
197         IF (OPENC2E_USE_OPENAL MATCHES "^YES")
198                 MESSAGE(FATAL_ERROR "OpenAL not found.")
199         ENDIF (OPENC2E_USE_OPENAL MATCHES "^YES")
200         
201     SET(ALUT_INCLUDE_DIR "")
202     SET(OPENAL_INCLUDE_DIR "")
203     SET(ALUT_LIBRARY "")
204     SET(OPENAL_LIBRARY "")
205     SET(OPENAL_SRC "")
206     SET(OPENAL_DEF "")
207 ELSE(OPENAL_SRC STREQUAL "")
208     SET(OPENAL_SRC "OpenALBackend.cpp")
209     SET(OPENAL_DEF "-DOPENAL_SUPPORT")
210 ENDIF(OPENAL_SRC STREQUAL "")
212 IF(OPENC2E_USE_QT)
213         include(${QT_USE_FILE})
214         SET(SAVED_CMAKE_CURRENT_BINARY_DIR CMAKE_CURRENT_BINARY_DIR)
215         SET(CMAKE_CURRENT_BINARY_DIR ${GEN})
216         QT4_WRAP_UI(OPENC2E_QT_UIS_H ${OPENC2E_QT_UIS})
217         QT4_WRAP_CPP(OPENC2E_QT_MOC_SRCS ${OPENC2E_QT_MOC_HDRS})
218         SET(CMAKE_CURRENT_BINARY_DIR SAVED_CMAKE_CURRENT_BINARY_DIR)
219         SET(QT_DEF "-DQT_SUPPORT")
220 ENDIF(OPENC2E_USE_QT)
222 # Pass flags to the compiler
223 ADD_DEFINITIONS("-W -Wall -Wno-conversion -Wno-unused -pthread -D_REENTRANT -DYYERROR_VERBOSE ${OPENAL_DEF} ${QT_DEF}")
225 IF(OPENC2E_USE_QT)
226         SET(FRONTEND_SRCS ${OPENC2E_QT} ${OPENC2E_QT_UIS_H} ${OPENC2E_QT_MOC_SRCS})
227         SET(FRONTEND_LIBS ${QT_LIBRARIES})
228 ELSE(OPENC2E_USE_QT)
229         SET(FRONTEND_SRCS ${OPENC2E_SDL})
230         SET(FRONTEND_LIBS)
231 ENDIF(OPENC2E_USE_QT)
232 ADD_EXECUTABLE(openc2e ${OPENC2E_CORE} ${FRONTEND_SRCS} ${OPENAL_SRC} ${SER_SRCS})
234 TARGET_LINK_LIBRARIES(openc2e z m pthread 
235         ${SDL_LIBRARY}
236 #       ${SDLMIXER_LIBRARY} 
237         ${SDLNET_LIBRARY}
238         ${SDLTTF_LIBRARY}
239         ${SDLGFX_LIBRARY}
240         ${OPENAL_LIBRARY}
241         ${ALUT_LIBRARY}
242         ${FRONTEND_LIBS}
243         boost_program_options-mt
244         boost_serialization-mt
245         boost_filesystem-mt
246         boost_thread-mt
247         boost_regex-mt
248         )
250 LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})
252 INCLUDE_DIRECTORIES(BEFORE
253         ${GEN}
254         ${SRC}
255         ${SDL_INCLUDE_DIR}
256 #       ${SDLMIXER_INCLUDE_DIR}
257         ${SDLNET_INCLUDE_DIR}
258         ${SDLTTF_INCLUDE_DIR}
259         ${SDLGFX_INCLUDE_DIR}
260         ${OPENAL_INCLUDE_DIR}
261         ${ALUT_INCLUDE_DIR}
262         ${Boost_INCLUDE_DIR}
263         )
265 FILE(GLOB CAOSVM_FILES ${SRC}/caosVM_*.cpp)
266 ADD_CUSTOM_COMMAND(
267         OUTPUT ${GEN}/commandinfo.yml
268         COMMAND perl parsedocs.pl ${CAOSVM_FILES} > ${GEN}/commandinfo.yml
269         DEPENDS parsedocs.pl ${CAOSVM_FILES}
270         WORKING_DIRECTORY ${SRC})
272 ADD_CUSTOM_COMMAND(
273         OUTPUT ${BIN}/caosdocs.html
274         COMMAND perl writehtml.pl ${GEN}/commandinfo.yml > ${BIN}/caosdocs.html
275         DEPENDS writehtml.pl ${GEN}/commandinfo.yml
276         WORKING_DIRECTORY ${SRC})
277 ADD_CUSTOM_COMMAND(
278         OUTPUT ${BIN}/docs.css
279         COMMAND cp docs.css ${BIN}/docs.css
280         DEPENDS docs.css
281         WORKING_DIRECTORY ${SRC})
282 ADD_CUSTOM_COMMAND(
283         OUTPUT ${BIN}/openc2e.6
284         COMMAND pod2man --center="Openc2e Documentation" --section=6 ${SRC}/openc2e.pod ${BIN}/openc2e.6
285         DEPENDS openc2e.pod
286         )
287 # it seems these ADD_CUSTOM_COMMANDS for flex and bison could be made
288 # into a macro... e.g. FLEX(file1) FLEX(file2) etc...
289 ADD_CUSTOM_COMMAND(
290         OUTPUT ${GEN}/cataloglexer.cpp
291         COMMAND re2c -o ${GEN}/cataloglexer.cpp ${SRC}/cataloglexer.re2c
292         DEPENDS ${SRC}/cataloglexer.re2c
293         WORKING_DIRECTORY ${SRC})
295 ADD_CUSTOM_COMMAND(
296         OUTPUT ${GEN}/catalogue.tab.cpp ${GEN}/catalogue.tab.hpp
297         COMMAND bison -d --name-prefix=cata --file-prefix="${GEN}/catalogue" catalogue.ypp
298         DEPENDS catalogue.ypp
299         WORKING_DIRECTORY ${SRC})
301 ADD_CUSTOM_COMMAND(
302         OUTPUT ${GEN}/cmddata.cpp
303         COMMAND perl writecmds.pl ${GEN}/commandinfo.yml > ${GEN}/cmddata.cpp
304         DEPENDS ${GEN}/commandinfo.yml writecmds.pl
305         WORKING_DIRECTORY ${SRC})
307 ADD_CUSTOM_COMMAND(
308         OUTPUT ${GEN}/caoslexer.cpp
309         COMMAND re2c -o ${GEN}/caoslexer.cpp ${SRC}/caoslexer.re2c
310         DEPENDS ${SRC}/caoslexer.re2c
311         WORKING_DIRECTORY ${SRC})
313 #ADD_CUSTOM_COMMAND(
314 #       OUTPUT ${GEN}/lex.mng.cpp ${GEN}/lex.mng.h
315 #       COMMAND flex -+ --prefix=mng -d -o ${GEN}/lex.mng.cpp --header-file=${GEN}/lex.mng.h mng.l
316 #       DEPENDS mng.l
317 #       WORKING_DIRECTORY ${SRC})
319 #ADD_CUSTOM_COMMAND(
320 #       OUTPUT ${GEN}/mngparser.tab.cpp ${GEN}/mngparser.tab.hpp
321 #       COMMAND bison -d --name-prefix=mng --file-prefix="${GEN}/mngparser" mngparser.ypp
322 #       DEPENDS mngparser.ypp
323 #       WORKING_DIRECTORY ${SRC})
325 ADD_CUSTOM_TARGET(docs ALL DEPENDS ${BIN}/caosdocs.html ${BIN}/docs.css ${BIN}/openc2e.6)
326 ADD_CUSTOM_TARGET(generated DEPENDS
327         ${GEN}/catalogue.tab.cpp ${GEN}/catalogue.tab.hpp
328         ${GEN}/caoslexer.cpp
329         ${GEN}/cataloglexer.cpp
330         ${GEN}/cmddata.cpp
331         #       ${GEN}/lex.mng.cpp ${GEN}/lex.mng.h
332         #       ${GEN}/mngparser.tab.cpp ${GEN}/mngparser.tab.hpp