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