f040282aa3ccf75566fe2c347e27c31cfbdd32bc
[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()