# # Macro used by the CMake build system for the Fast Light Tool Kit (FLTK). # Originally written by Michael Surette # # Copyright 1998-2024 by Bill Spitzak and others. # # This library is free software. Distribution and use rights are outlined in # the file "COPYING" which should have been included with this file. If this # file is missing or damaged, see the license at: # # https://www.fltk.org/COPYING.php # # Please see the following page on how to report bugs and issues: # # https://www.fltk.org/bugs.php # ####################################################################### # fl_add_library - add a static or shared library to the build #====================================================================== # # Input: # # LIBNAME: name of the library, including 'fltk_' prefix if applicable. # # LIBTYPE: either "STATIC" or "SHARED" # # SOURCES: Files needed to build the library # # Output: # # FLTK_LIBRARIES or FLTK_LIBRARIES_SHARED (in parent scope) # # This function adds the given library to the build, adds it to # either FLTK_LIBRARIES or FLTK_LIBRARIES_SHARED, respectively, # and "exports" the modified variable to the parent scope. # # For each library an alias is defined (see comment below). # ####################################################################### function(fl_add_library LIBNAME LIBTYPE SOURCES) # message(STATUS "Building library **************** ${LIBNAME} ${LIBTYPE}") set(suffix "") if(LIBTYPE STREQUAL "SHARED") set(suffix "-shared") endif() set(TARGET_NAME ${LIBNAME}${suffix}) ## Strip 'fltk_' from target name (if it exists in the name) ## and use the result as EXPORT_NAME property. This makes it ## easy to export library targets fltk::fltk and fltk::images ## rather than fltk::fltk_images. string(REPLACE "fltk_" "" EXPORT_NAME ${TARGET_NAME}) if(MSVC) set(OUTPUT_NAME_DEBUG "${LIBNAME}d") else() set(OUTPUT_NAME_DEBUG "${LIBNAME}") endif(MSVC) set(OUTPUT_NAME_RELEASE "${LIBNAME}") add_library(${TARGET_NAME} ${LIBTYPE} ${SOURCES}) # Create an alias 'fltk::alias_name' for the library # where 'alias_name' is the library name without the prefix 'fltk_' # # e.g. 'fltk' -> 'fltk::fltk' # and 'fltk-shared' -> 'fltk::fltk-shared' # but 'fltk_images' -> 'fltk::images' # and 'fltk_images-shared' -> 'fltk::images-shared' if(NOT (LIBNAME STREQUAL "fltk")) string(REPLACE "fltk_" "" alias_name ${LIBNAME}) else() set(alias_name ${LIBNAME}) endif() set(alias_name "fltk::${alias_name}${suffix}") add_library(${alias_name} ALIAS ${TARGET_NAME}) if(0) fl_debug_var(TARGET_NAME) fl_debug_var(LIBTYPE) fl_debug_var(alias_name) # fl_debug_var(SOURCES) endif() # Target properties for all libraries # Set 'PRIVATE' target compile definitions for the library # so they are not inherited by consumers target_compile_definitions(${TARGET_NAME} PRIVATE "FL_LIBRARY") # Set PUBLIC include and linker directories if(0) # DEBUG message(STATUS "fl_add_library and alias : fltk::${alias_name} ALIAS ${TARGET_NAME}") fl_debug_var(TARGET_NAME) fl_debug_var(FLTK_INCLUDE_DIRS) fl_debug_var(CMAKE_CURRENT_BINARY_DIR) fl_debug_var(CMAKE_CURRENT_SOURCE_DIR) fl_debug_var(FLTK_BUILD_INCLUDE_DIRECTORIES) endif() # Special handling for the core 'fltk' library, # no matter if it's SHARED or STATIC # FIXME: maybe this should be in src/CMakeLists.txt (?) if(LIBNAME STREQUAL "fltk") target_include_directories(${TARGET_NAME} PUBLIC $ $ $ ) ### FIXME: why does the simplified else() block not work? ### Needs investigation, using 'if(1)' for now... if(1) foreach(dir ${FLTK_BUILD_INCLUDE_DIRECTORIES}) target_include_directories(${TARGET_NAME} PRIVATE $ ) endforeach() else() ### This generates a wrong string in property INTERFACE_INCLUDE_DIRECTORIES: ### ... $;/git/fltk/modern-cmake/src/$') ### I don't see anything wrong with this statement though but ### maybe I'm missing something. Albrecht, Jan 22 2024 target_include_directories(${TARGET_NAME} PRIVATE $ ) endif() target_link_directories(${TARGET_NAME} PUBLIC $ $ ) if(APPLE AND NOT FLTK_BACKEND_X11) foreach(item ${FLTK_COCOA_FRAMEWORKS}) target_link_libraries(${TARGET_NAME} PUBLIC "${item}") endforeach() endif() # we must link fltk with cairo if Cairo or Wayland is enabled (or both) if(FLTK_HAVE_CAIRO OR FLTK_USE_CAIRO) target_include_directories(${TARGET_NAME} PUBLIC ${PKG_CAIRO_INCLUDE_DIRS}) target_link_directories (${TARGET_NAME} PUBLIC ${PKG_CAIRO_LIBRARY_DIRS}) target_link_libraries (${TARGET_NAME} PUBLIC ${PKG_CAIRO_LIBRARIES}) endif() endif(LIBNAME STREQUAL "fltk") # Set additional target properties for static libraries if(LIBTYPE STREQUAL "STATIC") set_target_properties(${TARGET_NAME} PROPERTIES OUTPUT_NAME ${LIBNAME} OUTPUT_NAME_DEBUG ${OUTPUT_NAME_DEBUG} OUTPUT_NAME_RELEASE ${OUTPUT_NAME_RELEASE} EXPORT_NAME ${EXPORT_NAME} ) endif(LIBTYPE STREQUAL "STATIC") # Set additional target properties for shared (dynamic) libraries (DLL's) if(LIBTYPE STREQUAL "SHARED") set_target_properties(${TARGET_NAME} PROPERTIES VERSION ${FLTK_VERSION} SOVERSION ${FLTK_VERSION_MAJOR}.${FLTK_VERSION_MINOR} OUTPUT_NAME ${LIBNAME} OUTPUT_NAME_DEBUG ${OUTPUT_NAME_DEBUG} OUTPUT_NAME_RELEASE ${OUTPUT_NAME_RELEASE} EXPORT_NAME ${EXPORT_NAME} ) # Visual Studio only: if(MSVC) set_target_properties(${TARGET_NAME} PROPERTIES OUTPUT_NAME ${LIBNAME}_dll OUTPUT_NAME_DEBUG ${LIBNAME}_dlld OUTPUT_NAME_RELEASE ${LIBNAME}_dll ) target_compile_definitions(${TARGET_NAME} PUBLIC FL_DLL) endif(MSVC) endif(LIBTYPE STREQUAL "SHARED") # Debug library output names (optional) set(DEBUG_ONAME 0) if(DEBUG_ONAME) get_target_property(XX_NAME ${TARGET_NAME} NAME) get_target_property(XX_ONAME ${TARGET_NAME} OUTPUT_NAME) get_target_property(XX_ONAME_DEBUG ${TARGET_NAME} OUTPUT_NAME_DEBUG) get_target_property(XX_ONAME_RELEASE ${TARGET_NAME} OUTPUT_NAME_RELEASE) get_target_property(XX_EXPORT_NAME ${TARGET_NAME} EXPORT_NAME) message(STATUS "--- DEBUG_ONAME ---") fl_debug_var(TARGET_NAME) fl_debug_var(XX_NAME) fl_debug_var(XX_ONAME) fl_debug_var(XX_ONAME_DEBUG) fl_debug_var(XX_ONAME_RELEASE) fl_debug_var(XX_EXPORT_NAME) message(STATUS "--- /DEBUG_ONAME ---") endif(DEBUG_ONAME) if(MSVC) if(FLTK_OPTION_LARGE_FILE) set_target_properties(${TARGET_NAME} PROPERTIES LINK_FLAGS /LARGEADDRESSAWARE ) endif(FLTK_OPTION_LARGE_FILE) endif(MSVC) install(TARGETS ${TARGET_NAME} EXPORT FLTK-Targets RUNTIME DESTINATION ${FLTK_BINDIR} LIBRARY DESTINATION ${FLTK_LIBDIR} ARCHIVE DESTINATION ${FLTK_LIBDIR} ) if(LIBTYPE STREQUAL "SHARED") list(APPEND FLTK_LIBRARIES_SHARED "${TARGET_NAME}") set(FLTK_LIBRARIES_SHARED "${FLTK_LIBRARIES_SHARED}" PARENT_SCOPE) else() list(APPEND FLTK_LIBRARIES "${TARGET_NAME}") set(FLTK_LIBRARIES "${FLTK_LIBRARIES}" PARENT_SCOPE) endif() if(0) fl_debug_var(fl_add_library_DEBUG) fl_debug_var(FLTK_LIBRARIES) fl_debug_var(FLTK_LIBRARIES_SHARED) fl_debug_var(fl_add_library_END) message("") endif() endfunction(fl_add_library LIBNAME LIBTYPE SOURCES)