1# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
2# file Copyright.txt or https://cmake.org/licensing for details.
3
4#[=======================================================================[.rst:
5FindGLUT
6--------
7
8Find OpenGL Utility Toolkit (GLUT) library and include files.
9
10IMPORTED Targets
11^^^^^^^^^^^^^^^^
12
13.. versionadded:: 3.1
14
15This module defines the :prop_tgt:`IMPORTED` targets:
16
17``GLUT::GLUT``
18 Defined if the system has GLUT.
19
20Result Variables
21^^^^^^^^^^^^^^^^
22
23This module sets the following variables:
24
25::
26
27  GLUT_INCLUDE_DIR, where to find GL/glut.h, etc.
28  GLUT_LIBRARIES, the libraries to link against
29  GLUT_FOUND, If false, do not try to use GLUT.
30
31Also defined, but not for general use are:
32
33::
34
35  GLUT_glut_LIBRARY = the full path to the glut library.
36  GLUT_Xmu_LIBRARY  = the full path to the Xmu library.
37  GLUT_Xi_LIBRARY   = the full path to the Xi Library.
38
39.. versionadded:: 3.13
40  Debug and Release variants are found separately.
41#]=======================================================================]
42
43include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake)
44include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
45
46function(_add_glut_target_simple)
47  if(TARGET GLUT::GLUT)
48    return()
49  endif()
50  add_library(GLUT::GLUT INTERFACE IMPORTED)
51  if(GLUT_INCLUDE_DIRS)
52    target_include_directories(GLUT::GLUT SYSTEM
53      INTERFACE "${GLUT_INCLUDE_DIRS}")
54  endif()
55  if(GLUT_LIBRARIES)
56    target_link_libraries(GLUT::GLUT INTERFACE ${GLUT_LIBRARIES})
57  endif()
58  if(GLUT_LDFLAGS)
59    target_link_options(GLUT::GLUT INTERFACE ${GLUT_LDFLAGS})
60  endif()
61  if(GLUT_CFLAGS)
62    separate_arguments(GLUT_CFLAGS_SPLIT UNIX_COMMAND "${GLUT_CFLAGS}")
63    target_compile_options(GLUT::GLUT INTERFACE ${GLUT_CFLAGS_SPLIT})
64  endif()
65
66  set_property(TARGET GLUT::GLUT APPEND PROPERTY
67    IMPORTED_LOCATION "${GLUT_glut_LIBRARY}")
68endfunction()
69
70find_package(PkgConfig)
71if(PKG_CONFIG_FOUND)
72  pkg_check_modules(GLUT glut)
73  if(GLUT_FOUND)
74    _add_glut_target_simple()
75    FIND_PACKAGE_HANDLE_STANDARD_ARGS(GLUT REQUIRED_VARS GLUT_FOUND)
76    return()
77  endif()
78endif()
79
80if(WIN32)
81  find_path( GLUT_INCLUDE_DIR NAMES GL/glut.h
82    PATHS  ${GLUT_ROOT_PATH}/include )
83  find_library( GLUT_glut_LIBRARY_RELEASE NAMES glut glut32 freeglut
84    PATHS
85    ${OPENGL_LIBRARY_DIR}
86    ${GLUT_ROOT_PATH}/Release
87    )
88  find_library( GLUT_glut_LIBRARY_DEBUG NAMES freeglutd
89    PATHS
90    ${OPENGL_LIBRARY_DIR}
91    ${GLUT_ROOT_PATH}/Debug
92    )
93  mark_as_advanced(GLUT_glut_LIBRARY_RELEASE GLUT_glut_LIBRARY_DEBUG)
94  select_library_configurations(GLUT_glut)
95elseif(APPLE)
96  find_path(GLUT_INCLUDE_DIR glut.h ${OPENGL_LIBRARY_DIR})
97  find_library(GLUT_glut_LIBRARY GLUT DOC "GLUT library for OSX")
98  find_library(GLUT_cocoa_LIBRARY Cocoa DOC "Cocoa framework for OSX")
99  mark_as_advanced(GLUT_glut_LIBRARY GLUT_cocoa_LIBRARY)
100
101  if(GLUT_cocoa_LIBRARY AND NOT TARGET GLUT::Cocoa)
102    add_library(GLUT::Cocoa UNKNOWN IMPORTED)
103    # Cocoa should always be a Framework, but we check to make sure.
104    if(GLUT_cocoa_LIBRARY MATCHES "/([^/]+)\\.framework$")
105      set(_glut_cocoa "${GLUT_cocoa_LIBRARY}/${CMAKE_MATCH_1}")
106      if(EXISTS "${_glut_cocoa}.tbd")
107        string(APPEND _glut_cocoa ".tbd")
108      endif()
109      set_target_properties(GLUT::Cocoa PROPERTIES
110        IMPORTED_LOCATION "${_glut_cocoa}")
111    else()
112      set_target_properties(GLUT::Cocoa PROPERTIES
113        IMPORTED_LOCATION "${GLUT_cocoa_LIBRARY}")
114    endif()
115  endif()
116else()
117  if(BEOS)
118    set(_GLUT_INC_DIR /boot/develop/headers/os/opengl)
119    set(_GLUT_glut_LIB_DIR /boot/develop/lib/x86)
120  else()
121    find_library( GLUT_Xi_LIBRARY Xi
122      /usr/openwin/lib
123      )
124    mark_as_advanced(GLUT_Xi_LIBRARY)
125
126    find_library( GLUT_Xmu_LIBRARY Xmu
127      /usr/openwin/lib
128      )
129    mark_as_advanced(GLUT_Xmu_LIBRARY)
130
131    if(GLUT_Xi_LIBRARY AND NOT TARGET GLUT::Xi)
132      add_library(GLUT::Xi UNKNOWN IMPORTED)
133      set_target_properties(GLUT::Xi PROPERTIES
134        IMPORTED_LOCATION "${GLUT_Xi_LIBRARY}")
135    endif()
136
137    if(GLUT_Xmu_LIBRARY AND NOT TARGET GLUT::Xmu)
138      add_library(GLUT::Xmu UNKNOWN IMPORTED)
139      set_target_properties(GLUT::Xmu PROPERTIES
140        IMPORTED_LOCATION "${GLUT_Xmu_LIBRARY}")
141    endif()
142
143  endif ()
144
145  find_path( GLUT_INCLUDE_DIR GL/glut.h
146    /usr/include/GL
147    /usr/openwin/share/include
148    /usr/openwin/include
149    /opt/graphics/OpenGL/include
150    /opt/graphics/OpenGL/contrib/libglut
151    ${_GLUT_INC_DIR}
152    )
153
154  find_library( GLUT_glut_LIBRARY glut
155    /usr/openwin/lib
156    ${_GLUT_glut_LIB_DIR}
157    )
158
159  unset(_GLUT_INC_DIR)
160  unset(_GLUT_glut_LIB_DIR)
161endif()
162mark_as_advanced(GLUT_glut_LIBRARY)
163
164FIND_PACKAGE_HANDLE_STANDARD_ARGS(GLUT REQUIRED_VARS GLUT_glut_LIBRARY GLUT_INCLUDE_DIR)
165
166if (GLUT_FOUND)
167  # Is -lXi and -lXmu required on all platforms that have it?
168  # If not, we need some way to figure out what platform we are on.
169  set( GLUT_LIBRARIES
170    ${GLUT_glut_LIBRARY}
171    )
172  foreach(v GLUT_Xmu_LIBRARY GLUT_Xi_LIBRARY GLUT_cocoa_LIBRARY)
173    if(${v})
174      list(APPEND GLUT_LIBRARIES ${${v}})
175    endif()
176  endforeach()
177
178  if(NOT TARGET GLUT::GLUT)
179    add_library(GLUT::GLUT UNKNOWN IMPORTED)
180    set_target_properties(GLUT::GLUT PROPERTIES
181      INTERFACE_INCLUDE_DIRECTORIES "${GLUT_INCLUDE_DIR}")
182    if(GLUT_glut_LIBRARY MATCHES "/([^/]+)\\.framework$")
183      set(_glut_glut "${GLUT_glut_LIBRARY}/${CMAKE_MATCH_1}")
184      if(EXISTS "${_glut_glut}.tbd")
185        string(APPEND _glut_glut ".tbd")
186      endif()
187      set_target_properties(GLUT::GLUT PROPERTIES
188        IMPORTED_LOCATION "${_glut_glut}")
189    else()
190      if(GLUT_glut_LIBRARY_RELEASE)
191        set_property(TARGET GLUT::GLUT APPEND PROPERTY
192          IMPORTED_CONFIGURATIONS RELEASE)
193        set_target_properties(GLUT::GLUT PROPERTIES
194          IMPORTED_LOCATION_RELEASE "${GLUT_glut_LIBRARY_RELEASE}")
195      endif()
196
197      if(GLUT_glut_LIBRARY_DEBUG)
198        set_property(TARGET GLUT::GLUT APPEND PROPERTY
199          IMPORTED_CONFIGURATIONS DEBUG)
200        set_target_properties(GLUT::GLUT PROPERTIES
201          IMPORTED_LOCATION_DEBUG "${GLUT_glut_LIBRARY_DEBUG}")
202      endif()
203
204      if(NOT GLUT_glut_LIBRARY_RELEASE AND NOT GLUT_glut_LIBRARY_DEBUG)
205        set_property(TARGET GLUT::GLUT APPEND PROPERTY
206          IMPORTED_LOCATION "${GLUT_glut_LIBRARY}")
207      endif()
208    endif()
209
210    if(TARGET GLUT::Xmu)
211      set_property(TARGET GLUT::GLUT APPEND
212        PROPERTY INTERFACE_LINK_LIBRARIES GLUT::Xmu)
213    endif()
214
215    if(TARGET GLUT::Xi)
216      set_property(TARGET GLUT::GLUT APPEND
217        PROPERTY INTERFACE_LINK_LIBRARIES GLUT::Xi)
218    endif()
219
220    if(TARGET GLUT::Cocoa)
221      set_property(TARGET GLUT::GLUT APPEND
222        PROPERTY INTERFACE_LINK_LIBRARIES GLUT::Cocoa)
223    endif()
224  endif()
225
226  #The following deprecated settings are for backwards compatibility with CMake1.4
227  set (GLUT_LIBRARY ${GLUT_LIBRARIES})
228  set (GLUT_INCLUDE_PATH ${GLUT_INCLUDE_DIR})
229endif()
230
231mark_as_advanced(GLUT_INCLUDE_DIR)
232