converted all tabs to spaces for CMake file, eases editing and indenting
[freeglut] / CMakeLists.txt
1 PROJECT(freeglut)
2 CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
3
4 # NOTE: On Windows and Cygwin, the dll's are placed in the
5 # CMAKE_RUNTIME_OUTPUT_DIRECTORY, while their corresponding import
6 # libraries end up in CMAKE_ARCHIVE_OUTPUT_DIRECTORY. On other
7 # platforms, such as Linux, the shared libraries are put in
8 # CMAKE_ARCHIVE_OUTPUT_DIRECTORY instead.
9 # Static libraries end up in CMAKE_ARCHIVE_OUTPUT_DIRECTORY on all
10 # platforms (unless 
11 SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
12 SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
13
14 # setup version numbers
15 # TODO: Update these for each release!
16 set(VERSION_MAJOR 3)
17 set(VERSION_MINOR 0)
18 set(VERSION_PATCH 0)
19
20
21 SET(FREEGLUT_HEADERS
22     include/GL/freeglut.h
23     include/GL/freeglut_ext.h
24     include/GL/freeglut_std.h
25     include/GL/glut.h
26 )
27 SET(FREEGLUT_SRCS
28     ${FREEGLUT_HEADERS}
29     src/fg_callbacks.c
30     src/fg_cursor.c
31     src/fg_display.c
32     src/fg_ext.c
33     src/fg_font_data.c
34     src/fg_gamemode.c
35     src/fg_init.c
36     src/fg_internal.h
37     src/fg_input_devices.c
38     src/fg_joystick.c
39     src/fg_main.c
40     src/fg_misc.c
41     src/fg_overlay.c
42     src/fg_spaceball.c
43     src/fg_state.c
44     src/fg_stroke_mono_roman.c
45     src/fg_stroke_roman.c
46     src/fg_structure.c
47     src/fg_videoresize.c
48     src/fg_window.c
49 )
50 # Android port requires adding a version of these compatible with
51 # OpenGL ES (TODO):
52 IF(NOT ANDROID)
53     LIST(APPEND FREEGLUT_SRCS
54         src/fg_font.c
55         src/fg_geometry.c
56         src/fg_menu.c
57         src/fg_teapot.c
58     )
59 ENDIF()
60
61 IF(WIN32)
62     LIST(APPEND FREEGLUT_SRCS
63         src/mswin/fg_cursor_mswin.c
64         src/mswin/fg_display_mswin.c
65         src/mswin/fg_ext_mswin.c
66         src/mswin/fg_gamemode_mswin.c
67         src/mswin/fg_init_mswin.c
68         src/mswin/fg_internal_mswin.h
69         src/mswin/fg_input_devices_mswin.c
70         src/mswin/fg_joystick_mswin.c
71         src/mswin/fg_main_mswin.c
72         src/mswin/fg_menu_mswin.c
73         src/mswin/fg_spaceball_mswin.c
74         src/mswin/fg_state_mswin.c
75         src/mswin/fg_structure_mswin.c
76         src/mswin/fg_window_mswin.c
77         ${CMAKE_BINARY_DIR}/freeglut.rc # generated below from freeglut.rc.in
78     )
79     IF (NOT CMAKE_CL_64)
80         # .def file only for 32bit Windows builds
81         LIST(APPEND FREEGLUT_SRCS
82             ${CMAKE_BINARY_DIR}/freeglutdll.def # generated below from src/freeglutdll.def.in
83         )
84     ENDIF()
85
86 ELSEIF(ANDROID)
87     LIST(APPEND FREEGLUT_SRCS
88         src/egl/fg_internal_egl.h
89         src/egl/fg_display_egl.c
90         src/egl/fg_init_egl.c
91         src/egl/fg_structure_egl.c
92         src/egl/fg_window_egl.c
93         src/android/native_app_glue/android_native_app_glue.c
94         src/android/native_app_glue/android_native_app_glue.h
95         src/android/fg_runtime_android.c
96         src/android/fg_gamemode_android.c
97         src/android/fg_input_devices_android.c
98         src/android/fg_joystick_android.c
99         src/android/fg_main_android.c
100         src/android/fg_spaceball_android.c
101         src/android/fg_state_android.c
102         src/android/fg_window_android.c
103         src/android/opengles_stubs.c
104         src/android/fg_internal_android.h
105     )
106 ELSE()
107     LIST(APPEND FREEGLUT_SRCS
108         src/x11/fg_cursor_x11.c
109         src/x11/fg_display_x11.c
110         src/x11/fg_ext_x11.c
111         src/x11/fg_gamemode_x11.c
112         src/x11/fg_glutfont_definitions_x11.c
113         src/x11/fg_init_x11.c
114         src/x11/fg_internal_x11.h
115         src/x11/fg_input_devices_x11.c
116         src/x11/fg_joystick_x11.c
117         src/x11/fg_main_x11.c
118         src/x11/fg_menu_x11.c
119         src/x11/fg_spaceball_x11.c
120         src/x11/fg_state_x11.c
121         src/x11/fg_structure_x11.c
122         src/x11/fg_window_x11.c
123         src/x11/fg_xinput_x11.c
124     )
125 ENDIF()
126
127 # BUILD_SHARED_LIBS is already a standard CMake variable, but we need to
128 # re-declare it here so it will show up in the GUI.
129 # by default, we want to build both
130 OPTION(BUILD_SHARED_LIBS "Build FreeGLUT shared library." ON)
131 OPTION(BUILD_STATIC_LIBS "Build FreeGLUT static library." ON)
132
133 # OpenGL ES support
134 OPTION(FREEGLUT_GLES1 "Use OpenGL ES 1.x (requires EGL)" OFF)
135 OPTION(FREEGLUT_GLES2 "Use OpenGL ES 2.x (requires EGL) (overrides BUILD_GLES1)" OFF)
136
137 IF(FREEGLUT_GLES2)
138   ADD_DEFINITIONS(-DGLESv2)
139   LIST(APPEND LIBS GLESv2 EGL)
140 ELSEIF(FREEGLUT_GLES1)
141   ADD_DEFINITIONS(-DGLESv1)
142   LIST(APPEND LIBS GLESv1 EGL)
143 ELSE()
144   FIND_PACKAGE(OpenGL REQUIRED)
145   LIST(APPEND LIBS ${OPENGL_gl_LIBRARY})
146   INCLUDE_DIRECTORIES(${OPENGL_INCLUDE_DIR})
147 ENDIF()
148
149 # lib m for math, not needed on windows
150 IF (NOT WIN32)
151     LIST(APPEND LIBS m)
152 ENDIF()
153
154 IF(WIN32)
155     MESSAGE(WARNING "Insecure CRT warnings hidden (might want to fix these)")
156     ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
157 ENDIF()
158
159 if(UNIX AND NOT ANDROID)
160     FIND_PACKAGE(X11 REQUIRED)
161     LIST(APPEND LIBS ${X11_LIBRARIES})
162     IF(X11_Xrandr_FOUND)
163         SET(HAVE_X11_EXTENSIONS_XRANDR_H TRUE)
164         LIST(APPEND LIBS ${X11_Xrandr_LIB})
165     ENDIF()
166     IF(X11_xf86vmode_FOUND)
167         SET(HAVE_X11_EXTENSIONS_XF86VMODE_H TRUE)
168         # Work-around http://www.cmake.org/Bug/bug_view_page.php?bug_id=6976
169         IF(NOT "${X11_Xxf86vm_LIB}")
170             SET(X11_Xxf86vm_LIB "Xxf86vm")
171         ENDIF()
172         LIST(APPEND LIBS ${X11_Xxf86vm_LIB})
173     ENDIF()
174 ENDIF()
175
176 INCLUDE(CheckIncludeFiles)
177 INCLUDE(CheckFunctionExists)
178 INCLUDE(CheckTypeSize)
179 CHECK_INCLUDE_FILES(sys/types.h HAVE_SYS_TYPES_H)
180 CHECK_INCLUDE_FILES(unistd.h    HAVE_UNISTD_H)
181 CHECK_INCLUDE_FILES(sys/time.h  HAVE_SYS_TIME_H)
182 CHECK_INCLUDE_FILES(stdbool.h   HAVE_STDBOOL_H)
183 CHECK_INCLUDE_FILES(sys/param.h HAVE_SYS_PARAM_H)
184 CHECK_INCLUDE_FILES(sys/ioctl.h HAVE_SYS_IOCTL_H)
185 CHECK_INCLUDE_FILES(fcntl.h     HAVE_FCNTL_H)
186 CHECK_INCLUDE_FILES(errno.h     HAVE_ERRNO_H)
187 CHECK_INCLUDE_FILES(usbhid.h    HAVE_USBHID_H)
188 CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
189 CHECK_FUNCTION_EXISTS(vfprintf  HAVE_VFPRINTF)
190 CHECK_FUNCTION_EXISTS(_doprnt   HAVE_DOPRNT)
191 CHECK_FUNCTION_EXISTS(XParseGeometry   HAVE_XPARSEGEOMETRY)
192 IF (NOT HAVE_XPARSEGEOMETRY)
193    LIST(APPEND FREEGLUT_SRCS
194         src/util/xparsegeometry_repl.c
195         src/util/xparsegeometry_repl.h)
196    SET(NEED_XPARSEGEOMETRY_IMPL TRUE)
197 ENDIF()
198 # decide on suitable type for internal time keeping, 64-bit if possible
199 CHECK_INCLUDE_FILES(stdint.h    HAVE_STDINT_H)
200 CHECK_INCLUDE_FILES(inttypes.h  HAVE_INTTYPES_H)
201 IF (NOT (HAVE_STDINT_H OR HAVE_INTTYPES_H))
202     IF (MSVC)
203         # Some old Microsoft VC don't support unsigned long long, but all we
204         # care about support unsigned __int64, so test for presence of that
205         # type
206         CHECK_TYPE_SIZE("unsigned __int64" U__INT64 BUILTIN_TYPES_ONLY)
207     ELSEIF()
208         CHECK_TYPE_SIZE("unsigned long long" ULONG_LONG BUILTIN_TYPES_ONLY)
209     ENDIF()
210 ENDIF()
211
212
213 # The generated config.h is placed in the project's build directory, just to
214 # ensure that all CMake-generated files are kept away from the main source tree.
215 # As a result, the build directory must to be added to the include path list.
216 CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/config.h.in ${CMAKE_BINARY_DIR}/config.h)
217 INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/src)
218 ADD_DEFINITIONS(-DHAVE_CONFIG_H)
219 IF(WIN32)
220     # we also have to generate freeglut.rc, which contains the version
221     # number
222     CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/freeglut.rc.in ${CMAKE_BINARY_DIR}/freeglut.rc)
223     IF (NOT CMAKE_CL_64)
224         # .def file only for 32bit Windows builds
225         CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/src/freeglutdll.def.in ${CMAKE_BINARY_DIR}/freeglutdll.def)
226     ENDIF()
227 ENDIF()
228
229 IF(BUILD_SHARED_LIBS)
230     ADD_LIBRARY(freeglut SHARED ${FREEGLUT_SRCS})
231 ENDIF()
232 IF(BUILD_STATIC_LIBS)
233     ADD_LIBRARY(freeglut_static STATIC ${FREEGLUT_SRCS})
234 ENDIF()
235
236
237 IF(WIN32)
238     LIST(APPEND LIBS winmm)
239     IF(BUILD_SHARED_LIBS)
240         SET_TARGET_PROPERTIES(freeglut PROPERTIES COMPILE_FLAGS -DFREEGLUT_EXPORTS)
241     ENDIF()
242     IF(BUILD_STATIC_LIBS)
243         SET_TARGET_PROPERTIES(freeglut_static PROPERTIES COMPILE_FLAGS -DFREEGLUT_STATIC)
244         # need to set machine:x64 for linker, at least for VC10, and
245         # doesn't hurt for older compilers:
246         # http://public.kitware.com/Bug/view.php?id=11240#c22768
247         IF (CMAKE_CL_64)
248             SET_TARGET_PROPERTIES(freeglut_static PROPERTIES STATIC_LIBRARY_FLAGS "/machine:x64")
249         ENDIF()
250     ENDIF()
251 ELSE()
252     # on UNIX we need to make sure:
253     # - all shared libraries must have a soname/version, see :
254     #   http://sourceware.org/autobook/autobook/autobook_91.html#SEC91
255     #   http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
256     #   Current: -version-info 12:0:9 -> 3.9.0
257     # - the output library should be named glut so it'll be linkable with -lglut
258     # - the shared library should link to the dependency libraries so that the user
259     #   won't have to link them explicitly (they shouldn't have to know that we depend
260     #   on Xrandr or Xxf86vm)
261     SET_TARGET_PROPERTIES(freeglut PROPERTIES VERSION 3.9.0 SOVERSION 3 OUTPUT_NAME glut)
262     SET_TARGET_PROPERTIES(freeglut_static PROPERTIES OUTPUT_NAME glut)
263     IF(ANDROID)
264         # Not in CMake toolchain file, because the toolchain
265         # file is called several times and generally doesn't
266         # seem to be meant for it:
267         # '-mandroid' is not mandatory but doesn't hurt
268         # '-O0 -gstabs+' helps the currently buggy GDB port
269         # '-DANDROID' is the Android build system convention
270         # Too late to manipulate ENV: SET(ENV{CFLAGS} "$ENV{CFLAGS} -mandroid")
271         # Not using _INIT variables, they seem to be used internally only
272         SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mandroid")
273         SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0 -gstabs+")
274         ADD_DEFINITIONS(-DANDROID)
275     ENDIF()
276 ENDIF()
277 IF(BUILD_SHARED_LIBS)
278     TARGET_LINK_LIBRARIES(freeglut ${LIBS})
279 ENDIF()
280 IF(BUILD_STATIC_LIBS)
281     TARGET_LINK_LIBRARIES(freeglut_static ${LIBS})
282 ENDIF()
283
284 IF(BUILD_SHARED_LIBS)
285     INSTALL(TARGETS freeglut DESTINATION lib)
286 ENDIF()
287 IF(BUILD_STATIC_LIBS)
288     INSTALL(TARGETS freeglut_static DESTINATION lib)
289 ENDIF()
290 INSTALL(FILES ${FREEGLUT_HEADERS} DESTINATION include/GL)
291
292
293
294 # Optionally build demos, on by default.
295 option( FREEGLUT_BUILD_DEMOS "Build FreeGLUT demos." ON )
296
297 SET(DEMO_LIBS ${OPENGL_glu_LIBRARY} ${LIBS})
298 # lib m for math, not needed on windows
299 IF (NOT WIN32)
300     LIST(APPEND DEMO_LIBS m)
301 ENDIF()
302
303 MACRO(ADD_DEMO name)
304     IF( FREEGLUT_BUILD_DEMOS )
305         IF(BUILD_SHARED_LIBS)
306             ADD_EXECUTABLE(${name} ${ARGN})
307             TARGET_LINK_LIBRARIES(${name} ${DEMO_LIBS} freeglut)
308         ENDIF()
309         IF(BUILD_STATIC_LIBS)
310             ADD_EXECUTABLE(${name}_static ${ARGN})
311             TARGET_LINK_LIBRARIES(${name}_static ${DEMO_LIBS} freeglut_static)
312             SET_TARGET_PROPERTIES(${name}_static PROPERTIES COMPILE_FLAGS -DFREEGLUT_STATIC)
313         ENDIF()
314     ENDIF()
315 ENDMACRO()
316
317 ADD_DEMO(CallbackMaker   progs/demos/CallbackMaker/CallbackMaker.c)
318 ADD_DEMO(Fractals        progs/demos/Fractals/fractals.c)
319 ADD_DEMO(Fractals_random progs/demos/Fractals_random/fractals_random.c)
320 ADD_DEMO(Lorenz          progs/demos/Lorenz/lorenz.c)
321 ADD_DEMO(One             progs/demos/One/one.c)
322 ADD_DEMO(Resizer         progs/demos/Resizer/Resizer.cpp)
323 ADD_DEMO(shapes          progs/demos/shapes/shapes.c)
324 ADD_DEMO(smooth_opengl3  progs/demos/smooth_opengl3/smooth_opengl3.c)
325 ADD_DEMO(spaceball       progs/demos/spaceball/spaceball.c
326                          progs/demos/spaceball/vmath.c
327                          progs/demos/spaceball/vmath.h)
328 ADD_DEMO(subwin          progs/demos/subwin/subwin.c)
329 ADD_DEMO(timer           progs/demos/timer/timer.c)
330
331 # finally, if any demos are built, copy needed files to output directory
332 # (currently, thats just the input file for the Fractals demo)
333 IF(FREEGLUT_BUILD_DEMOS)
334     # 1) copy fractals.dat from freeglut/progs/demos/Fractals
335     IF(BUILD_SHARED_LIBS)
336         SET(Frac_target Fractals)
337     ELSE()
338         SET(Frac_target Fractals_static)
339     ENDIF()
340     GET_TARGET_PROPERTY(DEMO_OUTPUT_DIRECTORY ${Frac_target} RUNTIME_OUTPUT_DIRECTORY)
341     ADD_CUSTOM_COMMAND(
342         TARGET ${Frac_target}
343         POST_BUILD
344         COMMAND ${CMAKE_COMMAND} -E copy
345         ${PROJECT_SOURCE_DIR}/progs/demos/Fractals/fractals.dat
346         ${DEMO_OUTPUT_DIRECTORY}/${CMAKE_CFG_INTDIR}
347     )
348 ENDIF()