CMake updates:
[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
163         # - the output library should be named glut so it'll be linkable with -lglut
164         # - the shared library should link to the dependency libraries so that the user
165         #   won't have to link them explicitly (they shouldn't have to know that we depend
166         #   on Xrandr or Xxf86vm)
167         SET_TARGET_PROPERTIES(freeglut PROPERTIES VERSION 3.9.0 SOVERSION 3 OUTPUT_NAME glut)
168         SET_TARGET_PROPERTIES(freeglut_static PROPERTIES OUTPUT_NAME glut)
169 ENDIF()
170 IF(BUILD_SHARED_LIBS)
171     TARGET_LINK_LIBRARIES(freeglut ${LIBS})
172 ENDIF()
173 IF(BUILD_STATIC_LIBS)
174     TARGET_LINK_LIBRARIES(freeglut_static ${LIBS})
175 ENDIF()
176
177 IF(BUILD_SHARED_LIBS)
178         INSTALL(TARGETS freeglut DESTINATION lib)
179 ENDIF()
180 IF(BUILD_STATIC_LIBS)
181         INSTALL(TARGETS freeglut_static DESTINATION lib)
182 ENDIF()
183 INSTALL(FILES ${FREEGLUT_HEADERS} DESTINATION include/GL)
184
185
186
187 # Optionally build demos, on by default.
188 option( FREEGLUT_BUILD_DEMOS "Build FreeGLUT demos." ON )
189
190 SET(DEMO_LIBS ${OPENGL_glu_LIBRARY} ${LIBS})
191 # lib m for math, not needed on windows
192 IF (NOT WIN32)
193     LIST(APPEND DEMO_LIBS m)
194 ENDIF()
195
196 MACRO(ADD_DEMO name)
197     IF( FREEGLUT_BUILD_DEMOS )
198         IF(BUILD_SHARED_LIBS)
199             ADD_EXECUTABLE(${name} ${ARGN})
200             TARGET_LINK_LIBRARIES(${name} ${DEMO_LIBS} freeglut)
201         ENDIF()
202         IF(BUILD_STATIC_LIBS)
203             ADD_EXECUTABLE(${name}_static ${ARGN})
204             TARGET_LINK_LIBRARIES(${name}_static ${DEMO_LIBS} freeglut_static)
205         ENDIF()
206     ENDIF()
207 ENDMACRO()
208
209 ADD_DEMO(CallbackMaker   progs/demos/CallbackMaker/CallbackMaker.c)
210 ADD_DEMO(Fractals        progs/demos/Fractals/fractals.c)
211 ADD_DEMO(Fractals_random progs/demos/Fractals_random/fractals_random.c)
212 ADD_DEMO(Lorenz          progs/demos/Lorenz/lorenz.c)
213 ADD_DEMO(One             progs/demos/One/one.c)
214 ADD_DEMO(Resizer         progs/demos/Resizer/Resizer.cpp)
215 ADD_DEMO(shapes          progs/demos/shapes/shapes.c)
216 ADD_DEMO(smooth_opengl3  progs/demos/smooth_opengl3/smooth_opengl3.c)
217 ADD_DEMO(spaceball       progs/demos/spaceball/spaceball.c
218                          progs/demos/spaceball/vmath.c
219                          progs/demos/spaceball/vmath.h)
220 ADD_DEMO(subwin          progs/demos/subwin/subwin.c)
221
222