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