cleaneup \machine setting for MSVC, now only for 64bit static libs, only
[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         ENDIF()
220     IF(BUILD_STATIC_LIBS)
221         SET_TARGET_PROPERTIES(freeglut_static PROPERTIES COMPILE_FLAGS -DFREEGLUT_STATIC)
222         # need to set machine:x64 for linker, at least for VC10, and
223         # doesn't hurt for older compilers:
224         # http://public.kitware.com/Bug/view.php?id=11240#c22768
225         IF (CMAKE_CL_64)
226             SET_TARGET_PROPERTIES(freeglut_static PROPERTIES STATIC_LIBRARY_FLAGS "/machine:x64")
227         ENDIF()
228         ENDIF()
229 ELSE()
230         # on UNIX we need to make sure:
231         # - all shared libraries must have a soname/version, see :
232         #   http://sourceware.org/autobook/autobook/autobook_91.html#SEC91
233         #   http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
234         #   Current: -version-info 12:0:9 -> 3.9.0
235         # - the output library should be named glut so it'll be linkable with -lglut
236         # - the shared library should link to the dependency libraries so that the user
237         #   won't have to link them explicitly (they shouldn't have to know that we depend
238         #   on Xrandr or Xxf86vm)
239         SET_TARGET_PROPERTIES(freeglut PROPERTIES VERSION 3.9.0 SOVERSION 3 OUTPUT_NAME glut)
240         SET_TARGET_PROPERTIES(freeglut_static PROPERTIES OUTPUT_NAME glut)
241         IF(ANDROID)
242                 # Not in CMake toolchain file, because the toolchain
243                 # file is called several times and generally doesn't
244                 # seem to be meant for it:
245                 # '-mandroid' is not mandatory but doesn't hurt
246                 # '-O0 -gstabs+' helps the currently buggy GDB port
247                 # '-DANDROID' is the Android build system convention
248                 # Too late to manipulate ENV: SET(ENV{CFLAGS} "$ENV{CFLAGS} -mandroid")
249                 # Not using _INIT variables, they seem to be used internally only
250                 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mandroid")
251                 SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0 -gstabs+")
252                 ADD_DEFINITIONS(-DANDROID)
253         ENDIF()
254 ENDIF()
255 IF(BUILD_SHARED_LIBS)
256     TARGET_LINK_LIBRARIES(freeglut ${LIBS})
257 ENDIF()
258 IF(BUILD_STATIC_LIBS)
259     TARGET_LINK_LIBRARIES(freeglut_static ${LIBS})
260 ENDIF()
261
262 IF(BUILD_SHARED_LIBS)
263         INSTALL(TARGETS freeglut DESTINATION lib)
264 ENDIF()
265 IF(BUILD_STATIC_LIBS)
266         INSTALL(TARGETS freeglut_static DESTINATION lib)
267 ENDIF()
268 INSTALL(FILES ${FREEGLUT_HEADERS} DESTINATION include/GL)
269
270
271
272 # Optionally build demos, on by default.
273 option( FREEGLUT_BUILD_DEMOS "Build FreeGLUT demos." ON )
274
275 SET(DEMO_LIBS ${OPENGL_glu_LIBRARY} ${LIBS})
276 # lib m for math, not needed on windows
277 IF (NOT WIN32)
278     LIST(APPEND DEMO_LIBS m)
279 ENDIF()
280
281 MACRO(ADD_DEMO name)
282     IF( FREEGLUT_BUILD_DEMOS )
283         IF(BUILD_SHARED_LIBS)
284             ADD_EXECUTABLE(${name} ${ARGN})
285             TARGET_LINK_LIBRARIES(${name} ${DEMO_LIBS} freeglut)
286         ENDIF()
287         IF(BUILD_STATIC_LIBS)
288             ADD_EXECUTABLE(${name}_static ${ARGN})
289             TARGET_LINK_LIBRARIES(${name}_static ${DEMO_LIBS} freeglut_static)
290             SET_TARGET_PROPERTIES(${name}_static PROPERTIES COMPILE_FLAGS -DFREEGLUT_STATIC)
291         ENDIF()
292     ENDIF()
293 ENDMACRO()
294
295 ADD_DEMO(CallbackMaker   progs/demos/CallbackMaker/CallbackMaker.c)
296 ADD_DEMO(Fractals        progs/demos/Fractals/fractals.c)
297 ADD_DEMO(Fractals_random progs/demos/Fractals_random/fractals_random.c)
298 ADD_DEMO(Lorenz          progs/demos/Lorenz/lorenz.c)
299 ADD_DEMO(One             progs/demos/One/one.c)
300 ADD_DEMO(Resizer         progs/demos/Resizer/Resizer.cpp)
301 ADD_DEMO(shapes          progs/demos/shapes/shapes.c)
302 ADD_DEMO(smooth_opengl3  progs/demos/smooth_opengl3/smooth_opengl3.c)
303 ADD_DEMO(spaceball       progs/demos/spaceball/spaceball.c
304                          progs/demos/spaceball/vmath.c
305                          progs/demos/spaceball/vmath.h)
306 ADD_DEMO(subwin          progs/demos/subwin/subwin.c)
307 ADD_DEMO(timer           progs/demos/timer/timer.c)