e1ac1335171a0addf7eacb383abbca067150a683
[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 FIND_PACKAGE(OpenGL REQUIRED)
90 INCLUDE_DIRECTORIES(${OPENGL_INCLUDE_DIR})
91 LIST(APPEND LIBS ${OPENGL_gl_LIBRARY})
92
93 # lib m for math, not needed on windows
94 IF (NOT WIN32)
95     LIST(APPEND LIBS m)
96 ENDIF()
97
98 IF(WIN32)
99         MESSAGE(WARNING "Insecure CRT warnings hidden (might want to fix these)")
100         ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
101 ENDIF()
102
103 if(UNIX)
104         FIND_PACKAGE(X11 REQUIRED)
105         LIST(APPEND LIBS ${X11_LIBRARIES})
106         IF(X11_Xrandr_FOUND)
107                 SET(HAVE_X11_EXTENSIONS_XRANDR_H TRUE)
108                 LIST(APPEND LIBS ${X11_Xrandr_LIB})
109         ENDIF()
110         IF(X11_xf86vmode_FOUND)
111                 SET(HAVE_X11_EXTENSIONS_XF86VMODE_H TRUE)
112                 # Work-around http://www.cmake.org/Bug/bug_view_page.php?bug_id=6976
113                 IF(NOT "${X11_Xxf86vm_LIB}")
114                         SET(X11_Xxf86vm_LIB "Xxf86vm")
115                 ENDIF()
116                 LIST(APPEND LIBS ${X11_Xxf86vm_LIB})
117         ENDIF()
118 ENDIF()
119
120 INCLUDE(CheckIncludeFiles)
121 INCLUDE(CheckFunctionExists)
122 CHECK_INCLUDE_FILES(sys/types.h HAVE_SYS_TYPES_H)
123 CHECK_INCLUDE_FILES(unistd.h    HAVE_UNISTD_H)
124 CHECK_INCLUDE_FILES(sys/time.h  HAVE_SYS_TIME_H)
125 CHECK_INCLUDE_FILES(stdbool.h   HAVE_STDBOOL_H)
126 CHECK_INCLUDE_FILES(sys/param.h HAVE_SYS_PARAM_H)
127 CHECK_INCLUDE_FILES(sys/ioctl.h HAVE_SYS_IOCTL_H)
128 CHECK_INCLUDE_FILES(fcntl.h     HAVE_FCNTL_H)
129 CHECK_INCLUDE_FILES(errno.h     HAVE_ERRNO_H)
130 CHECK_INCLUDE_FILES(usbhid.h    HAVE_USBHID_H)
131 CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
132 CHECK_FUNCTION_EXISTS(vfprintf HAVE_VFPRINTF)
133 CHECK_FUNCTION_EXISTS(_doprnt HAVE_DOPRNT)
134
135 # The generated config.h is placed in the project's build directory, just to
136 # ensure that all CMake-generated files are kept away from the main source tree.
137 # As a result, the build directory must to be added to the include path list.
138 CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/config.h.in ${CMAKE_BINARY_DIR}/config.h)
139 INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/src)
140 ADD_DEFINITIONS(-DHAVE_CONFIG_H)
141
142 # by default, at least on UNIX, we want to build both
143 IF(BUILD_SHARED_LIBS)
144         ADD_LIBRARY(freeglut SHARED ${FREEGLUT_SRCS})
145 ENDIF()
146 IF(BUILD_STATIC_LIBS)
147         ADD_LIBRARY(freeglut_static STATIC ${FREEGLUT_SRCS})
148 ENDIF()
149
150
151 IF(WIN32)
152         LIST(APPEND LIBS winmm)
153         IF(BUILD_SHARED_LIBS)
154                 LIST(APPEND FREEGLUT_SRCS src/Common/freeglutdll.def freeglut.rc)
155                 # XXX I assume that if we want both shared and static this one is appropriate
156                 ADD_DEFINITIONS(-DFREEGLUT_EXPORTS)
157         ELSE()
158                 ADD_DEFINITIONS(-DFREEGLUT_STATIC)
159         ENDIF()
160 ELSE()
161         # on UNIX we need to make sure:
162         # - all shared libraries must have a soname/version (see
163     #   http://sourceware.org/autobook/autobook/autobook_91.html#SEC91)
164         # - the output library should be named glut so it'll be linkable with -lglut
165         # - the shared library should link to the dependency libraries so that the user
166         #   won't have to link them explicitly (they shouldn't have to know that we depend
167         #   on Xrandr or Xxf86vm)
168         SET_TARGET_PROPERTIES(freeglut PROPERTIES VERSION 3.9.0 SOVERSION 3 OUTPUT_NAME glut)
169         SET_TARGET_PROPERTIES(freeglut_static PROPERTIES OUTPUT_NAME glut)
170 ENDIF()
171 IF(BUILD_SHARED_LIBS)
172     TARGET_LINK_LIBRARIES(freeglut ${LIBS})
173 ENDIF()
174 IF(BUILD_STATIC_LIBS)
175     TARGET_LINK_LIBRARIES(freeglut_static ${LIBS})
176 ENDIF()
177
178 IF(BUILD_SHARED_LIBS)
179         INSTALL(TARGETS freeglut DESTINATION lib)
180 ENDIF()
181 IF(BUILD_STATIC_LIBS)
182         INSTALL(TARGETS freeglut_static DESTINATION lib)
183 ENDIF()
184 INSTALL(FILES ${FREEGLUT_HEADERS} DESTINATION include/GL)
185
186
187
188 # Optionally build demos, on by default.
189 option( FREEGLUT_BUILD_DEMOS "Build FreeGLUT demos." ON )
190
191 SET(DEMO_LIBS ${OPENGL_glu_LIBRARY} ${LIBS})
192 # lib m for math, not needed on windows
193 IF (NOT WIN32)
194     LIST(APPEND DEMO_LIBS m)
195 ENDIF()
196
197 MACRO(ADD_DEMO name)
198     IF( FREEGLUT_BUILD_DEMOS )
199         IF(BUILD_SHARED_LIBS)
200             ADD_EXECUTABLE(${name} ${ARGN})
201             TARGET_LINK_LIBRARIES(${name} ${DEMO_LIBS} freeglut)
202         ENDIF()
203         IF(BUILD_STATIC_LIBS)
204             ADD_EXECUTABLE(${name}_static ${ARGN})
205             TARGET_LINK_LIBRARIES(${name}_static ${DEMO_LIBS} freeglut_static)
206         ENDIF()
207     ENDIF()
208 ENDMACRO()
209
210 ADD_DEMO(CallbackMaker   progs/demos/CallbackMaker/CallbackMaker.c)
211 ADD_DEMO(Fractals        progs/demos/Fractals/fractals.c)
212 ADD_DEMO(Fractals_random progs/demos/Fractals_random/fractals_random.c)
213 ADD_DEMO(Lorenz          progs/demos/Lorenz/lorenz.c)
214 ADD_DEMO(One             progs/demos/One/one.c)
215 ADD_DEMO(Resizer         progs/demos/Resizer/Resizer.cpp)
216 ADD_DEMO(shapes          progs/demos/shapes/shapes.c)
217 ADD_DEMO(smooth_opengl3  progs/demos/smooth_opengl3/smooth_opengl3.c)
218 ADD_DEMO(spaceball       progs/demos/spaceball/spaceball.c
219                          progs/demos/spaceball/vmath.c
220                          progs/demos/spaceball/vmath.h)
221 ADD_DEMO(subwin          progs/demos/subwin/subwin.c)
222
223