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:
5FindFLTK
6--------
7
8Find the Fast Light Toolkit (FLTK) library
9
10Input Variables
11^^^^^^^^^^^^^^^
12
13By default this module will search for all of the FLTK components and
14add them to the ``FLTK_LIBRARIES`` variable.  You can limit the components
15which get placed in ``FLTK_LIBRARIES`` by defining one or more of the
16following three options:
17
18``FLTK_SKIP_OPENGL``
19  Set to true to disable searching for the FLTK GL library
20
21``FLTK_SKIP_FORMS``
22  Set to true to disable searching for the FLTK Forms library
23
24``FLTK_SKIP_IMAGES``
25  Set to true to disable searching for the FLTK Images library
26
27FLTK is composed also by a binary tool. You can set the following option:
28
29``FLTK_SKIP_FLUID``
30  Set to true to not look for the FLUID binary
31
32Result Variables
33^^^^^^^^^^^^^^^^
34
35The following variables will be defined:
36
37``FLTK_FOUND``
38  True if all components not skipped were found
39
40``FLTK_INCLUDE_DIR``
41  Path to the include directory for FLTK header files
42
43``FLTK_LIBRARIES``
44  List of the FLTK libraries found
45
46``FLTK_FLUID_EXECUTABLE``
47  Path to the FLUID binary tool
48
49``FLTK_WRAP_UI``
50  True if FLUID is found, used to enable the FLTK_WRAP_UI command
51
52Cache Variables
53^^^^^^^^^^^^^^^
54
55The following cache variables are also available to set or use:
56
57``FLTK_BASE_LIBRARY_RELEASE``
58  The FLTK base library (optimized)
59
60``FLTK_BASE_LIBRARY_DEBUG``
61  The FLTK base library (debug)
62
63``FLTK_GL_LIBRARY_RELEASE``
64  The FLTK GL library (optimized)
65
66``FLTK_GL_LIBRARY_DEBUG``
67  The FLTK GL library (debug)
68
69``FLTK_FORMS_LIBRARY_RELEASE``
70  The FLTK Forms library (optimized)
71
72``FLTK_FORMS_LIBRARY_DEBUG``
73  The FLTK Forms library (debug)
74
75``FLTK_IMAGES_LIBRARY_RELEASE``
76  The FLTK Images protobuf library (optimized)
77
78``FLTK_IMAGES_LIBRARY_DEBUG``
79  The FLTK Images library (debug)
80
81.. versionadded:: 3.11
82  Debug and Release variants are found separately and use per-configuration
83  variables.
84#]=======================================================================]
85
86if(NOT FLTK_SKIP_OPENGL)
87  find_package(OpenGL)
88endif()
89
90#  Platform dependent libraries required by FLTK
91if(WIN32)
92  if(NOT CYGWIN)
93    if(BORLAND)
94      set( FLTK_PLATFORM_DEPENDENT_LIBS import32 )
95    else()
96      set( FLTK_PLATFORM_DEPENDENT_LIBS wsock32 comctl32 )
97    endif()
98  endif()
99endif()
100
101if(UNIX)
102  include(${CMAKE_CURRENT_LIST_DIR}/FindX11.cmake)
103  find_library(FLTK_MATH_LIBRARY m)
104  set( FLTK_PLATFORM_DEPENDENT_LIBS ${X11_LIBRARIES} ${FLTK_MATH_LIBRARY})
105endif()
106
107if(APPLE)
108  set( FLTK_PLATFORM_DEPENDENT_LIBS  "-framework Carbon -framework Cocoa -framework ApplicationServices -lz")
109endif()
110
111# If FLTK_INCLUDE_DIR is already defined we assign its value to FLTK_DIR.
112if(FLTK_INCLUDE_DIR)
113  set(FLTK_DIR ${FLTK_INCLUDE_DIR})
114endif()
115
116
117# If FLTK has been built using CMake we try to find everything directly
118set(FLTK_DIR_STRING "directory containing FLTKConfig.cmake.  This is either the root of the build tree, or PREFIX/lib/fltk for an installation.")
119
120# Search only if the location is not already known.
121if(NOT FLTK_DIR)
122  # Get the system search path as a list.
123  file(TO_CMAKE_PATH "$ENV{PATH}" FLTK_DIR_SEARCH2)
124
125  # Construct a set of paths relative to the system search path.
126  set(FLTK_DIR_SEARCH "")
127  foreach(dir ${FLTK_DIR_SEARCH2})
128    set(FLTK_DIR_SEARCH ${FLTK_DIR_SEARCH} "${dir}/../lib/fltk")
129  endforeach()
130  string(REPLACE "//" "/" FLTK_DIR_SEARCH "${FLTK_DIR_SEARCH}")
131
132  #
133  # Look for an installation or build tree.
134  #
135  find_path(FLTK_DIR FLTKConfig.cmake
136    # Look for an environment variable FLTK_DIR.
137    HINTS
138      ENV FLTK_DIR
139
140    # Look in places relative to the system executable search path.
141    ${FLTK_DIR_SEARCH}
142
143    PATH_SUFFIXES
144    fltk
145    fltk/include
146    lib/fltk
147    lib/fltk/include
148
149    # Help the user find it if we cannot.
150    DOC "The ${FLTK_DIR_STRING}"
151    )
152endif()
153
154# Check if FLTK was built using CMake
155foreach(fltk_include IN LISTS FLTK_DIR)
156  if(EXISTS "${fltk_include}/FLTKConfig.cmake")
157    set(FLTK_BUILT_WITH_CMAKE 1)
158    set(FLTK_CMAKE_PATH "${fltk_include}/FLTKConfig.cmake")
159    break()
160  endif()
161endforeach()
162
163if(FLTK_BUILT_WITH_CMAKE)
164  set(FLTK_FOUND 1)
165  include("${FLTK_CMAKE_PATH}")
166
167  # Fluid
168  if(FLUID_COMMAND)
169    set(FLTK_FLUID_EXECUTABLE ${FLUID_COMMAND} CACHE FILEPATH "Fluid executable")
170  else()
171    find_program(FLTK_FLUID_EXECUTABLE fluid PATHS
172      ${FLTK_EXECUTABLE_DIRS}
173      ${FLTK_EXECUTABLE_DIRS}/RelWithDebInfo
174      ${FLTK_EXECUTABLE_DIRS}/Debug
175      ${FLTK_EXECUTABLE_DIRS}/Release
176      NO_SYSTEM_PATH)
177  endif()
178  # mark_as_advanced(FLTK_FLUID_EXECUTABLE)
179
180  set(FLTK_INCLUDE_DIR ${FLTK_DIR})
181  link_directories(${FLTK_LIBRARY_DIRS})
182
183  set(FLTK_BASE_LIBRARY fltk)
184  set(FLTK_GL_LIBRARY fltk_gl)
185  set(FLTK_FORMS_LIBRARY fltk_forms)
186  set(FLTK_IMAGES_LIBRARY fltk_images)
187
188  # Add the extra libraries
189  load_cache(${FLTK_DIR}
190    READ_WITH_PREFIX
191    FL FLTK_USE_SYSTEM_JPEG
192    FL FLTK_USE_SYSTEM_PNG
193    FL FLTK_USE_SYSTEM_ZLIB
194    )
195
196  set(FLTK_IMAGES_LIBS "")
197  if(FLFLTK_USE_SYSTEM_JPEG)
198    set(FLTK_IMAGES_LIBS ${FLTK_IMAGES_LIBS} fltk_jpeg)
199  endif()
200  if(FLFLTK_USE_SYSTEM_PNG)
201    set(FLTK_IMAGES_LIBS ${FLTK_IMAGES_LIBS} fltk_png)
202  endif()
203  if(FLFLTK_USE_SYSTEM_ZLIB)
204    set(FLTK_IMAGES_LIBS ${FLTK_IMAGES_LIBS} fltk_zlib)
205  endif()
206  set(FLTK_IMAGES_LIBS "${FLTK_IMAGES_LIBS}" CACHE INTERNAL
207    "Extra libraries for fltk_images library.")
208
209else()
210
211  # if FLTK was not built using CMake
212  # Find fluid executable.
213  find_program(FLTK_FLUID_EXECUTABLE fluid ${FLTK_INCLUDE_DIR}/fluid)
214
215  # Use location of fluid to help find everything else.
216  set(FLTK_INCLUDE_SEARCH_PATH "")
217  set(FLTK_LIBRARY_SEARCH_PATH "")
218  if(FLTK_FLUID_EXECUTABLE)
219    get_filename_component(FLTK_BIN_DIR "${FLTK_FLUID_EXECUTABLE}" PATH)
220    set(FLTK_INCLUDE_SEARCH_PATH ${FLTK_INCLUDE_SEARCH_PATH}
221      ${FLTK_BIN_DIR}/../include ${FLTK_BIN_DIR}/..)
222    set(FLTK_LIBRARY_SEARCH_PATH ${FLTK_LIBRARY_SEARCH_PATH}
223      ${FLTK_BIN_DIR}/../lib)
224    set(FLTK_WRAP_UI 1)
225  endif()
226
227  #
228  # Try to find FLTK include dir using fltk-config
229  #
230  if(UNIX)
231    # Use fltk-config to generate a list of possible include directories
232    find_program(FLTK_CONFIG_SCRIPT fltk-config PATHS ${FLTK_BIN_DIR})
233    if(FLTK_CONFIG_SCRIPT)
234      if(NOT FLTK_INCLUDE_DIR)
235        exec_program(${FLTK_CONFIG_SCRIPT} ARGS --cxxflags OUTPUT_VARIABLE FLTK_CXXFLAGS)
236        if(FLTK_CXXFLAGS)
237          string(REGEX MATCHALL "-I[^ ]*" _fltk_temp_dirs ${FLTK_CXXFLAGS})
238          string(REPLACE "-I" "" _fltk_temp_dirs "${_fltk_temp_dirs}")
239          foreach(_dir ${_fltk_temp_dirs})
240            string(STRIP ${_dir} _output)
241            list(APPEND _FLTK_POSSIBLE_INCLUDE_DIRS ${_output})
242          endforeach()
243        endif()
244      endif()
245    endif()
246  endif()
247
248  list(APPEND FLTK_INCLUDE_SEARCH_PATH ${_FLTK_POSSIBLE_INCLUDE_DIRS})
249
250  find_path(FLTK_INCLUDE_DIR
251      NAMES FL/Fl.h FL/Fl.H    # fltk 1.1.9 has Fl.H (#8376)
252      PATH_SUFFIXES fltk fltk/include
253      PATHS ${FLTK_INCLUDE_SEARCH_PATH})
254
255  #
256  # Try to find FLTK library
257  if(UNIX)
258    if(FLTK_CONFIG_SCRIPT)
259      exec_program(${FLTK_CONFIG_SCRIPT} ARGS --libs OUTPUT_VARIABLE _FLTK_POSSIBLE_LIBS)
260      if(_FLTK_POSSIBLE_LIBS)
261        get_filename_component(_FLTK_POSSIBLE_LIBRARY_DIR ${_FLTK_POSSIBLE_LIBS} PATH)
262      endif()
263    endif()
264  endif()
265
266  list(APPEND FLTK_LIBRARY_SEARCH_PATH ${FLTK_INCLUDE_DIR}/lib ${_FLTK_POSSIBLE_LIBRARY_DIR})
267
268  include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake)
269
270  # Allow libraries to be set manually
271  if(NOT FLTK_BASE_LIBRARY)
272      find_library(FLTK_BASE_LIBRARY_RELEASE NAMES fltk PATHS ${FLTK_LIBRARY_SEARCH_PATH} PATH_SUFFIXES fltk fltk/lib)
273      find_library(FLTK_BASE_LIBRARY_DEBUG NAMES fltkd PATHS ${FLTK_LIBRARY_SEARCH_PATH} PATH_SUFFIXES fltk fltk/lib)
274      select_library_configurations(FLTK_BASE)
275  endif()
276  if(NOT FLTK_GL_LIBRARY)
277      find_library(FLTK_GL_LIBRARY_RELEASE NAMES fltkgl fltk_gl PATHS ${FLTK_LIBRARY_SEARCH_PATH} PATH_SUFFIXES fltk fltk/lib)
278      find_library(FLTK_GL_LIBRARY_DEBUG NAMES fltkgld fltk_gld PATHS ${FLTK_LIBRARY_SEARCH_PATH} PATH_SUFFIXES fltk fltk/lib)
279      select_library_configurations(FLTK_GL)
280  endif()
281  if(NOT FLTK_FORMS_LIBRARY)
282      find_library(FLTK_FORMS_LIBRARY_RELEASE NAMES fltkforms fltk_forms PATHS ${FLTK_LIBRARY_SEARCH_PATH} PATH_SUFFIXES fltk fltk/lib)
283      find_library(FLTK_FORMS_LIBRARY_DEBUG NAMES fltkformsd fltk_formsd PATHS ${FLTK_LIBRARY_SEARCH_PATH} PATH_SUFFIXES fltk fltk/lib)
284      select_library_configurations(FLTK_FORMS)
285  endif()
286  if(NOT FLTK_IMAGES_LIBRARY)
287      find_library(FLTK_IMAGES_LIBRARY_RELEASE NAMES fltkimages fltk_images PATHS ${FLTK_LIBRARY_SEARCH_PATH} PATH_SUFFIXES fltk fltk/lib)
288      find_library(FLTK_IMAGES_LIBRARY_DEBUG NAMES fltkimagesd fltk_imagesd PATHS ${FLTK_LIBRARY_SEARCH_PATH} PATH_SUFFIXES fltk fltk/lib)
289      select_library_configurations(FLTK_IMAGES)
290  endif()
291
292  # Find the extra libraries needed for the fltk_images library.
293  if(UNIX)
294    if(FLTK_CONFIG_SCRIPT)
295      exec_program(${FLTK_CONFIG_SCRIPT} ARGS --use-images --ldflags
296        OUTPUT_VARIABLE FLTK_IMAGES_LDFLAGS)
297      set(FLTK_LIBS_EXTRACT_REGEX ".*-lfltk_images (.*) -lfltk.*")
298      if("${FLTK_IMAGES_LDFLAGS}" MATCHES "${FLTK_LIBS_EXTRACT_REGEX}")
299        string(REGEX REPLACE " +" ";" FLTK_IMAGES_LIBS "${CMAKE_MATCH_1}")
300        # The EXEC_PROGRAM will not be inherited into subdirectories from
301        # the file that originally included this module.  Save the answer.
302        set(FLTK_IMAGES_LIBS "${FLTK_IMAGES_LIBS}" CACHE INTERNAL
303          "Extra libraries for fltk_images library.")
304      endif()
305    endif()
306  endif()
307
308endif()
309
310# Append all of the required libraries together (by default, everything)
311set(FLTK_LIBRARIES)
312if(NOT FLTK_SKIP_IMAGES)
313  list(APPEND FLTK_LIBRARIES ${FLTK_IMAGES_LIBRARY})
314endif()
315if(NOT FLTK_SKIP_FORMS)
316  list(APPEND FLTK_LIBRARIES ${FLTK_FORMS_LIBRARY})
317endif()
318if(NOT FLTK_SKIP_OPENGL)
319  list(APPEND FLTK_LIBRARIES ${FLTK_GL_LIBRARY} ${OPENGL_gl_LIBRARY})
320  list(APPEND FLTK_INCLUDE_DIR ${OPENGL_INCLUDE_DIR})
321  list(REMOVE_DUPLICATES FLTK_INCLUDE_DIR)
322endif()
323list(APPEND FLTK_LIBRARIES ${FLTK_BASE_LIBRARY})
324
325include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
326if(FLTK_SKIP_FLUID)
327  FIND_PACKAGE_HANDLE_STANDARD_ARGS(FLTK DEFAULT_MSG FLTK_LIBRARIES FLTK_INCLUDE_DIR)
328else()
329  FIND_PACKAGE_HANDLE_STANDARD_ARGS(FLTK DEFAULT_MSG FLTK_LIBRARIES FLTK_INCLUDE_DIR FLTK_FLUID_EXECUTABLE)
330endif()
331
332if(FLTK_FOUND)
333  if(APPLE)
334    set(FLTK_LIBRARIES ${FLTK_PLATFORM_DEPENDENT_LIBS} ${FLTK_LIBRARIES})
335  else()
336    set(FLTK_LIBRARIES ${FLTK_LIBRARIES} ${FLTK_PLATFORM_DEPENDENT_LIBS})
337  endif()
338
339  # The following deprecated settings are for compatibility with CMake 1.4
340  set (HAS_FLTK ${FLTK_FOUND})
341  set (FLTK_INCLUDE_PATH ${FLTK_INCLUDE_DIR})
342  set (FLTK_FLUID_EXE ${FLTK_FLUID_EXECUTABLE})
343  set (FLTK_LIBRARY ${FLTK_LIBRARIES})
344endif()
345