CMake: add precision about version-info / soname
[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_data.c
17         src/Common/freeglut_gamemode.c
18         src/Common/freeglut_init.c
19         src/Common/freeglut_internal.h
20         src/Common/freeglut_input_devices.c
21         src/Common/freeglut_joystick.c
22         src/Common/freeglut_main.c
23         src/Common/freeglut_misc.c
24         src/Common/freeglut_overlay.c
25         src/Common/freeglut_spaceball.c
26         src/Common/freeglut_state.c
27         src/Common/freeglut_stroke_mono_roman.c
28         src/Common/freeglut_stroke_roman.c
29         src/Common/freeglut_structure.c
30         src/Common/freeglut_videoresize.c
31         src/Common/freeglut_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/Common/freeglut_font.c
38                src/Common/freeglut_geometry.c
39                src/Common/freeglut_menu.c
40                src/Common/freeglut_teapot.c
41 )
42 ENDIF()
43
44 IF(WIN32)
45         LIST(APPEND FREEGLUT_SRCS
46                 src/Common/xparsegeometry_repl.c
47                 src/Common/xparsegeometry_repl.h
48                 src/mswin/freeglut_cursor_mswin.c
49                 src/mswin/freeglut_display_mswin.c
50                 src/mswin/freeglut_ext_mswin.c
51                 src/mswin/freeglut_gamemode_mswin.c
52                 src/mswin/freeglut_init_mswin.c
53                 src/mswin/freeglut_internal_mswin.h
54                 src/mswin/freeglut_input_devices_mswin.c
55                 src/mswin/freeglut_joystick_mswin.c
56                 src/mswin/freeglut_main_mswin.c
57                 src/mswin/freeglut_menu_mswin.c
58                 src/mswin/freeglut_spaceball_mswin.c
59                 src/mswin/freeglut_state_mswin.c
60                 src/mswin/freeglut_structure_mswin.c
61                 src/mswin/freeglut_window_mswin.c
62 )
63 ELSEIF(ANDROID)
64        LIST(APPEND FREEGLUT_SRCS
65                src/Common/xparsegeometry_repl.c
66                src/Common/xparsegeometry_repl.h
67                src/egl/freeglut_internal_egl.h
68                src/egl/freeglut_display_egl.c
69                src/egl/freeglut_init_egl.c
70                src/egl/freeglut_structure_egl.c
71                src/egl/freeglut_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/freeglut_runtime_android.c
75                src/android/freeglut_gamemode_android.c
76                src/android/freeglut_input_devices_android.c
77                src/android/freeglut_joystick_android.c
78                src/android/freeglut_main_android.c
79                src/android/freeglut_spaceball_android.c
80                src/android/freeglut_state_android.c
81                src/android/freeglut_window_android.c
82                src/android/opengles_stubs.c
83                src/android/freeglut_internal_android.h
84 )
85 ELSE()
86         LIST(APPEND FREEGLUT_SRCS
87                 src/x11/freeglut_cursor_x11.c
88                 src/x11/freeglut_display_x11.c
89                 src/x11/freeglut_ext_x11.c
90                 src/x11/freeglut_gamemode_x11.c
91                 src/x11/freeglut_glutfont_definitions_x11.c
92                 src/x11/freeglut_init_x11.c
93                 src/x11/freeglut_internal_x11.h
94                 src/x11/freeglut_input_devices_x11.c
95                 src/x11/freeglut_joystick_x11.c
96                 src/x11/freeglut_main_x11.c
97                 src/x11/freeglut_menu_x11.c
98                 src/x11/freeglut_spaceball_x11.c
99                 src/x11/freeglut_state_x11.c
100                 src/x11/freeglut_structure_x11.c
101                 src/x11/freeglut_window_x11.c
102                 src/x11/freeglut_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 CHECK_INCLUDE_FILES(sys/types.h HAVE_SYS_TYPES_H)
163 CHECK_INCLUDE_FILES(unistd.h    HAVE_UNISTD_H)
164 CHECK_INCLUDE_FILES(sys/time.h  HAVE_SYS_TIME_H)
165 CHECK_INCLUDE_FILES(stdbool.h   HAVE_STDBOOL_H)
166 CHECK_INCLUDE_FILES(sys/param.h HAVE_SYS_PARAM_H)
167 CHECK_INCLUDE_FILES(sys/ioctl.h HAVE_SYS_IOCTL_H)
168 CHECK_INCLUDE_FILES(fcntl.h     HAVE_FCNTL_H)
169 CHECK_INCLUDE_FILES(errno.h     HAVE_ERRNO_H)
170 CHECK_INCLUDE_FILES(usbhid.h    HAVE_USBHID_H)
171 CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
172 CHECK_FUNCTION_EXISTS(vfprintf HAVE_VFPRINTF)
173 CHECK_FUNCTION_EXISTS(_doprnt HAVE_DOPRNT)
174
175 # The generated config.h is placed in the project's build directory, just to
176 # ensure that all CMake-generated files are kept away from the main source tree.
177 # As a result, the build directory must to be added to the include path list.
178 CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/config.h.in ${CMAKE_BINARY_DIR}/config.h)
179 INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/src)
180 ADD_DEFINITIONS(-DHAVE_CONFIG_H)
181
182 # by default, at least on UNIX, we want to build both
183 IF(BUILD_SHARED_LIBS)
184         ADD_LIBRARY(freeglut SHARED ${FREEGLUT_SRCS})
185 ENDIF()
186 IF(BUILD_STATIC_LIBS)
187         ADD_LIBRARY(freeglut_static STATIC ${FREEGLUT_SRCS})
188 ENDIF()
189
190
191 IF(WIN32)
192         LIST(APPEND LIBS winmm)
193         IF(BUILD_SHARED_LIBS)
194                 LIST(APPEND FREEGLUT_SRCS src/Common/freeglutdll.def freeglut.rc)
195                 # XXX I assume that if we want both shared and static this one is appropriate
196                 ADD_DEFINITIONS(-DFREEGLUT_EXPORTS)
197         ELSE()
198                 ADD_DEFINITIONS(-DFREEGLUT_STATIC)
199         ENDIF()
200 ELSE()
201         # on UNIX we need to make sure:
202         # - all shared libraries must have a soname/version, see :
203         #   http://sourceware.org/autobook/autobook/autobook_91.html#SEC91
204         #   http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
205         #   Current: -version-info 12:0:9 -> 3.9.0
206         # - the output library should be named glut so it'll be linkable with -lglut
207         # - the shared library should link to the dependency libraries so that the user
208         #   won't have to link them explicitly (they shouldn't have to know that we depend
209         #   on Xrandr or Xxf86vm)
210         SET_TARGET_PROPERTIES(freeglut PROPERTIES VERSION 3.9.0 SOVERSION 3 OUTPUT_NAME glut)
211         SET_TARGET_PROPERTIES(freeglut_static PROPERTIES OUTPUT_NAME glut)
212         IF(ANDROID)
213                 # Not in CMake toolchain file, because the toolchain
214                 # file is called several times and generally doesn't
215                 # seem to be meant for it:
216                 # '-mandroid' is not mandatory but doesn't hurt
217                 # '-O0 -gstabs+' helps the currently buggy GDB port
218                 # '-DANDROID' is the Android build system convention
219                 # Too late to manipulate ENV: SET(ENV{CFLAGS} "$ENV{CFLAGS} -mandroid")
220                 # Not using _INIT variables, they seem to be used internally only
221                 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mandroid")
222                 SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0 -gstabs+")
223                 ADD_DEFINITIONS(-DANDROID)
224         ENDIF()
225 ENDIF()
226 IF(BUILD_SHARED_LIBS)
227     TARGET_LINK_LIBRARIES(freeglut ${LIBS})
228 ENDIF()
229 IF(BUILD_STATIC_LIBS)
230     TARGET_LINK_LIBRARIES(freeglut_static ${LIBS})
231 ENDIF()
232
233 IF(BUILD_SHARED_LIBS)
234         INSTALL(TARGETS freeglut DESTINATION lib)
235 ENDIF()
236 IF(BUILD_STATIC_LIBS)
237         INSTALL(TARGETS freeglut_static DESTINATION lib)
238 ENDIF()
239 INSTALL(FILES ${FREEGLUT_HEADERS} DESTINATION include/GL)
240
241
242
243 # Optionally build demos, on by default.
244 option( FREEGLUT_BUILD_DEMOS "Build FreeGLUT demos." ON )
245
246 SET(DEMO_LIBS ${OPENGL_glu_LIBRARY} ${LIBS})
247 # lib m for math, not needed on windows
248 IF (NOT WIN32)
249     LIST(APPEND DEMO_LIBS m)
250 ENDIF()
251
252 MACRO(ADD_DEMO name)
253     IF( FREEGLUT_BUILD_DEMOS )
254         IF(BUILD_SHARED_LIBS)
255             ADD_EXECUTABLE(${name} ${ARGN})
256             TARGET_LINK_LIBRARIES(${name} ${DEMO_LIBS} freeglut)
257         ENDIF()
258         IF(BUILD_STATIC_LIBS)
259             ADD_EXECUTABLE(${name}_static ${ARGN})
260             TARGET_LINK_LIBRARIES(${name}_static ${DEMO_LIBS} freeglut_static)
261         ENDIF()
262     ENDIF()
263 ENDMACRO()
264
265 ADD_DEMO(CallbackMaker   progs/demos/CallbackMaker/CallbackMaker.c)
266 ADD_DEMO(Fractals        progs/demos/Fractals/fractals.c)
267 ADD_DEMO(Fractals_random progs/demos/Fractals_random/fractals_random.c)
268 ADD_DEMO(Lorenz          progs/demos/Lorenz/lorenz.c)
269 ADD_DEMO(One             progs/demos/One/one.c)
270 ADD_DEMO(Resizer         progs/demos/Resizer/Resizer.cpp)
271 ADD_DEMO(shapes          progs/demos/shapes/shapes.c)
272 ADD_DEMO(smooth_opengl3  progs/demos/smooth_opengl3/smooth_opengl3.c)
273 ADD_DEMO(spaceball       progs/demos/spaceball/spaceball.c
274                          progs/demos/spaceball/vmath.c
275                          progs/demos/spaceball/vmath.h)
276 ADD_DEMO(subwin          progs/demos/subwin/subwin.c)
277 ADD_DEMO(timer           progs/demos/timer/timer.c)