ef47269f90541cc4c25e9ab0b8230d1a0cc3b54e
[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/Common/freeglut_callbacks.c
13         src/Common/freeglut_cursor.c
14         src/Common/freeglut_display.c
15         src/Common/freeglut_ext.c
16         src/Common/freeglut_font.c
17         src/Common/freeglut_font_data.c
18         src/Common/freeglut_gamemode.c
19         src/Common/freeglut_geometry.c
20         src/Common/freeglut_init.c
21         src/Common/freeglut_internal.h
22         src/Common/freeglut_input_devices.c
23         src/Common/freeglut_joystick.c
24         src/Common/freeglut_main.c
25         src/Common/freeglut_menu.c
26         src/Common/freeglut_misc.c
27         src/Common/freeglut_overlay.c
28         src/Common/freeglut_spaceball.c
29         src/Common/freeglut_state.c
30         src/Common/freeglut_stroke_mono_roman.c
31         src/Common/freeglut_stroke_roman.c
32         src/Common/freeglut_structure.c
33         src/Common/freeglut_teapot.c
34         src/Common/freeglut_videoresize.c
35         src/Common/freeglut_window.c
36 )
37
38 IF(WIN32)
39         LIST(APPEND FREEGLUT_SRCS
40                 src/Common/xparsegeometry_repl.c
41                 src/Common/xparsegeometry_repl.h
42                 src/mswin/freeglut_cursor_mswin.c
43                 src/mswin/freeglut_display_mswin.c
44                 src/mswin/freeglut_ext_mswin.c
45                 src/mswin/freeglut_gamemode_mswin.c
46                 src/mswin/freeglut_init_mswin.c
47                 src/mswin/freeglut_internal_mswin.h
48                 src/mswin/freeglut_input_devices_mswin.c
49                 src/mswin/freeglut_joystick_mswin.c
50                 src/mswin/freeglut_main_mswin.c
51                 src/mswin/freeglut_menu_mswin.c
52                 src/mswin/freeglut_spaceball_mswin.c
53                 src/mswin/freeglut_state_mswin.c
54                 src/mswin/freeglut_structure_mswin.c
55                 src/mswin/freeglut_window_mswin.c
56 )
57 ELSE()
58         LIST(APPEND FREEGLUT_SRCS
59                 src/x11/freeglut_cursor_x11.c
60                 src/x11/freeglut_display_x11.c
61                 src/x11/freeglut_ext_x11.c
62                 src/x11/freeglut_gamemode_x11.c
63                 src/x11/freeglut_glutfont_definitions_x11.c
64                 src/x11/freeglut_init_x11.c
65                 src/x11/freeglut_internal_x11.h
66                 src/x11/freeglut_input_devices_x11.c
67                 src/x11/freeglut_joystick_x11.c
68                 src/x11/freeglut_main_x11.c
69                 src/x11/freeglut_menu_x11.c
70                 src/x11/freeglut_spaceball_x11.c
71                 src/x11/freeglut_state_x11.c
72                 src/x11/freeglut_structure_x11.c
73                 src/x11/freeglut_window_x11.c
74                 src/x11/freeglut_xinput_x11.c
75 )
76
77
78 ENDIF()
79
80 # Neatly organize all of the output files in the build directory
81 SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
82 SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
83
84 # BUILD_SHARED_LIBS is already a standard CMake variable, but we need to
85 # re-declare it here so it will show up in the GUI.
86 OPTION(BUILD_SHARED_LIBS "Build FreeGLUT shared library." ON)
87 OPTION(BUILD_STATIC_LIBS "Build FreeGLUT static library." ON)
88
89 # OpenGL ES support
90 OPTION(FREEGLUT_GLES1 "Use OpenGL ES 1.x (requires EGL)" OFF)
91 OPTION(FREEGLUT_GLES2 "Use OpenGL ES 2.x (requires EGL) (overrides BUILD_GLES1)" OFF)
92
93 IF(FREEGLUT_GLES2)
94   ADD_DEFINITIONS(-DGLESv2)
95   LIST(APPEND LIBS GLESv2 EGL)
96 ELSEIF(FREEGLUT_GLES1)
97   ADD_DEFINITIONS(-DGLESv1)
98   LIST(APPEND LIBS GLESv1 EGL)
99 ELSE()
100   FIND_PACKAGE(OpenGL REQUIRED)
101   LIST(APPEND LIBS ${OPENGL_gl_LIBRARY})
102   INCLUDE_DIRECTORIES(${OPENGL_INCLUDE_DIR})
103 ENDIF()
104
105 # lib m for math, not needed on windows
106 IF (NOT WIN32)
107     LIST(APPEND LIBS m)
108 ENDIF()
109
110 IF(WIN32)
111         MESSAGE(WARNING "Insecure CRT warnings hidden (might want to fix these)")
112         ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
113 ENDIF()
114
115 if(UNIX AND NOT ANDROID)
116         FIND_PACKAGE(X11 REQUIRED)
117         LIST(APPEND LIBS ${X11_LIBRARIES})
118         IF(X11_Xrandr_FOUND)
119                 SET(HAVE_X11_EXTENSIONS_XRANDR_H TRUE)
120                 LIST(APPEND LIBS ${X11_Xrandr_LIB})
121         ENDIF()
122         IF(X11_xf86vmode_FOUND)
123                 SET(HAVE_X11_EXTENSIONS_XF86VMODE_H TRUE)
124                 # Work-around http://www.cmake.org/Bug/bug_view_page.php?bug_id=6976
125                 IF(NOT "${X11_Xxf86vm_LIB}")
126                         SET(X11_Xxf86vm_LIB "Xxf86vm")
127                 ENDIF()
128                 LIST(APPEND LIBS ${X11_Xxf86vm_LIB})
129         ENDIF()
130 ENDIF()
131
132 INCLUDE(CheckIncludeFiles)
133 INCLUDE(CheckFunctionExists)
134 CHECK_INCLUDE_FILES(sys/types.h HAVE_SYS_TYPES_H)
135 CHECK_INCLUDE_FILES(unistd.h    HAVE_UNISTD_H)
136 CHECK_INCLUDE_FILES(sys/time.h  HAVE_SYS_TIME_H)
137 CHECK_INCLUDE_FILES(stdbool.h   HAVE_STDBOOL_H)
138 CHECK_INCLUDE_FILES(sys/param.h HAVE_SYS_PARAM_H)
139 CHECK_INCLUDE_FILES(sys/ioctl.h HAVE_SYS_IOCTL_H)
140 CHECK_INCLUDE_FILES(fcntl.h     HAVE_FCNTL_H)
141 CHECK_INCLUDE_FILES(errno.h     HAVE_ERRNO_H)
142 CHECK_INCLUDE_FILES(usbhid.h    HAVE_USBHID_H)
143 CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
144 CHECK_FUNCTION_EXISTS(vfprintf HAVE_VFPRINTF)
145 CHECK_FUNCTION_EXISTS(_doprnt HAVE_DOPRNT)
146
147 # The generated config.h is placed in the project's build directory, just to
148 # ensure that all CMake-generated files are kept away from the main source tree.
149 # As a result, the build directory must to be added to the include path list.
150 CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/config.h.in ${CMAKE_BINARY_DIR}/config.h)
151 INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/src)
152 ADD_DEFINITIONS(-DHAVE_CONFIG_H)
153
154 # by default, at least on UNIX, we want to build both
155 IF(BUILD_SHARED_LIBS)
156         ADD_LIBRARY(freeglut SHARED ${FREEGLUT_SRCS})
157 ENDIF()
158 IF(BUILD_STATIC_LIBS)
159         ADD_LIBRARY(freeglut_static STATIC ${FREEGLUT_SRCS})
160 ENDIF()
161
162
163 IF(WIN32)
164         LIST(APPEND LIBS winmm)
165         IF(BUILD_SHARED_LIBS)
166                 LIST(APPEND FREEGLUT_SRCS src/Common/freeglutdll.def freeglut.rc)
167                 # XXX I assume that if we want both shared and static this one is appropriate
168                 ADD_DEFINITIONS(-DFREEGLUT_EXPORTS)
169         ELSE()
170                 ADD_DEFINITIONS(-DFREEGLUT_STATIC)
171         ENDIF()
172 ELSE()
173         # on UNIX we need to make sure:
174         # - all shared libraries must have a soname/version (see
175     #   http://sourceware.org/autobook/autobook/autobook_91.html#SEC91)
176         # - the output library should be named glut so it'll be linkable with -lglut
177         # - the shared library should link to the dependency libraries so that the user
178         #   won't have to link them explicitly (they shouldn't have to know that we depend
179         #   on Xrandr or Xxf86vm)
180         SET_TARGET_PROPERTIES(freeglut PROPERTIES VERSION 3.9.0 SOVERSION 3 OUTPUT_NAME glut)
181         SET_TARGET_PROPERTIES(freeglut_static PROPERTIES OUTPUT_NAME glut)
182 ENDIF()
183 IF(BUILD_SHARED_LIBS)
184     TARGET_LINK_LIBRARIES(freeglut ${LIBS})
185 ENDIF()
186 IF(BUILD_STATIC_LIBS)
187     TARGET_LINK_LIBRARIES(freeglut_static ${LIBS})
188 ENDIF()
189
190 IF(BUILD_SHARED_LIBS)
191         INSTALL(TARGETS freeglut DESTINATION lib)
192 ENDIF()
193 IF(BUILD_STATIC_LIBS)
194         INSTALL(TARGETS freeglut_static DESTINATION lib)
195 ENDIF()
196 INSTALL(FILES ${FREEGLUT_HEADERS} DESTINATION include/GL)
197
198
199
200 # Optionally build demos, on by default.
201 option( FREEGLUT_BUILD_DEMOS "Build FreeGLUT demos." ON )
202
203 SET(DEMO_LIBS ${OPENGL_glu_LIBRARY} ${LIBS})
204 # lib m for math, not needed on windows
205 IF (NOT WIN32)
206     LIST(APPEND DEMO_LIBS m)
207 ENDIF()
208
209 MACRO(ADD_DEMO name)
210     IF( FREEGLUT_BUILD_DEMOS )
211         IF(BUILD_SHARED_LIBS)
212             ADD_EXECUTABLE(${name} ${ARGN})
213             TARGET_LINK_LIBRARIES(${name} ${DEMO_LIBS} freeglut)
214         ENDIF()
215         IF(BUILD_STATIC_LIBS)
216             ADD_EXECUTABLE(${name}_static ${ARGN})
217             TARGET_LINK_LIBRARIES(${name}_static ${DEMO_LIBS} freeglut_static)
218         ENDIF()
219     ENDIF()
220 ENDMACRO()
221
222 ADD_DEMO(CallbackMaker   progs/demos/CallbackMaker/CallbackMaker.c)
223 ADD_DEMO(Fractals        progs/demos/Fractals/fractals.c)
224 ADD_DEMO(Fractals_random progs/demos/Fractals_random/fractals_random.c)
225 ADD_DEMO(Lorenz          progs/demos/Lorenz/lorenz.c)
226 ADD_DEMO(One             progs/demos/One/one.c)
227 ADD_DEMO(Resizer         progs/demos/Resizer/Resizer.cpp)
228 ADD_DEMO(shapes          progs/demos/shapes/shapes.c)
229 ADD_DEMO(smooth_opengl3  progs/demos/smooth_opengl3/smooth_opengl3.c)
230 ADD_DEMO(spaceball       progs/demos/spaceball/spaceball.c
231                          progs/demos/spaceball/vmath.c
232                          progs/demos/spaceball/vmath.h)
233 ADD_DEMO(subwin          progs/demos/subwin/subwin.c)
234 ADD_DEMO(timer           progs/demos/timer/timer.c)