mirror of
https://github.com/fltk/fltk.git
synced 2025-12-06 18:21:51 +08:00
- If shared libraries are built, then fluid, fltk-options, and the "games" are linked against the shared FLTK libraries. On some platforms the static and the shared versions of fluid and fltk-options are built. The games are only built if FLTK_BUILD_TEST is enabled. - The CMake 'install' target now installs the games (if built) and their man pages on all platforms (no matter if that is useful, for instance on Windows). - On macOS 'CMAKE_INSTALL_RPATH' is set so *installed* programs automatically find their shared FLTK libraries. The "shared" versions of fluid and fltk-options got their own '.plist' files. This works for both the executables themselves as well as those included in bundles. There may be more to do on the macOS platform.
150 lines
4.6 KiB
CMake
150 lines
4.6 KiB
CMake
#
|
|
# CMakeLists.txt to build fltk-options for the FLTK project using CMake (www.cmake.org)
|
|
#
|
|
# Copyright 2023-2025 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
|
|
#
|
|
|
|
# Targets that will be built: fltk-options and fltk-options-cmd (Windows)
|
|
set(TARGETS "")
|
|
|
|
if(APPLE AND NOT FLTK_BACKEND_X11)
|
|
set(BACKEND_APPLE TRUE)
|
|
set(ICON_NAME fltk-options.icns)
|
|
set(ICON_PATH "${CMAKE_CURRENT_SOURCE_DIR}/icons/${ICON_NAME}")
|
|
list(APPEND SOURCES ${ICON_PATH})
|
|
else()
|
|
set(BACKEND_APPLE FALSE)
|
|
set(ICON_NAME "")
|
|
set(ICON_PATH "")
|
|
endif()
|
|
|
|
# This macro is used to avoid duplicate code to create executable programs.
|
|
# This must be a macro because it changes at least one global variable: TARGETS.
|
|
# This macro also uses some (local) variables defined above.
|
|
# In the future this might be converted to a function to avoid side effects.
|
|
|
|
macro(make_target TARGET GUI SOURCES LIBS EXPORT_NAME)
|
|
|
|
if(ICON_PATH)
|
|
list(APPEND SOURCES ${ICON_PATH}) # macOS only
|
|
endif()
|
|
|
|
# message(STATUS "[fltk-options] make_target ${TARGET} ${GUI} ${SOURCES} ${LIBS} ${EXPORT_NAME}")
|
|
|
|
# Options WIN32 and MACOSX_BUNDLE build a Windows GUI program or macOS bundle,
|
|
# respectively. Both options are ignored on other platforms.
|
|
|
|
if(${GUI})
|
|
add_executable(${TARGET} WIN32 MACOSX_BUNDLE ${SOURCES})
|
|
else()
|
|
add_executable(${TARGET} ${SOURCES})
|
|
endif(${GUI})
|
|
|
|
list(APPEND TARGETS ${TARGET})
|
|
|
|
if(BACKEND_APPLE)
|
|
|
|
# set bundle properties
|
|
set_target_properties(${TARGET} PROPERTIES MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/${TARGET}.plist")
|
|
set_target_properties(${TARGET} PROPERTIES MACOSX_BUNDLE_ICON_FILE ${ICON_NAME})
|
|
set_target_properties(${TARGET} PROPERTIES XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "org.fltk.${TARGET}")
|
|
|
|
# install command line tool
|
|
install(PROGRAMS $<TARGET_FILE:${TARGET}>
|
|
DESTINATION ${FLTK_BINDIR})
|
|
|
|
# create macOS bundle wrapper script
|
|
|
|
set(WRAPPER "${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}/${TARGET}")
|
|
add_custom_command(
|
|
TARGET ${TARGET} POST_BUILD
|
|
COMMAND cp ${FLTK_SOURCE_DIR}/CMake/macOS-bundle-wrapper.in ${WRAPPER}
|
|
COMMAND chmod u+x,g+x,o+x ${WRAPPER}
|
|
BYPRODUCTS ${WRAPPER}
|
|
VERBATIM
|
|
)
|
|
unset(WRAPPER)
|
|
|
|
endif(BACKEND_APPLE)
|
|
|
|
target_link_libraries(${TARGET} PRIVATE ${LIBS})
|
|
set_target_properties(${TARGET} PROPERTIES EXPORT_NAME ${EXPORT_NAME})
|
|
|
|
endmacro(make_target TARGET GUI LIBS EXPORT_NAME)
|
|
|
|
set(SOURCES fltk-options.cxx)
|
|
|
|
make_target(fltk-options TRUE "${SOURCES}" fltk::fltk options)
|
|
|
|
# Add the console app (Windows only)
|
|
# This is done for all Windows targets, even if cross-compiling.
|
|
|
|
if(WIN32)
|
|
make_target(fltk-options-cmd FALSE "${SOURCES}" fltk::fltk options-cmd)
|
|
endif()
|
|
|
|
# Add the "shared" executable (linked against the shared FLTK libs).
|
|
# Note 1: only the GUI version is built as "shared" executable.
|
|
# Note 2: For MSVC we need the special object library 'call_main'.
|
|
|
|
if(FLTK_BUILD_SHARED_LIBS)
|
|
if(MSVC)
|
|
set(libs fltk::fltk-shared call_main)
|
|
else()
|
|
set(libs fltk::fltk-shared)
|
|
endif()
|
|
make_target(fltk-options-shared TRUE "${SOURCES}" "${libs}" options-shared)
|
|
endif()
|
|
|
|
# Create aliases for all executables,
|
|
# replacing 'fltk-options' with 'fltk::options'
|
|
|
|
foreach(tgt ${TARGETS})
|
|
string(REPLACE "fltk-options" "fltk::options" alias ${tgt})
|
|
add_executable(${alias} ALIAS ${tgt})
|
|
unset(alias)
|
|
endforeach()
|
|
|
|
# Install fltk-options GUI and commandline tool
|
|
|
|
# Install the GUI and (on Windows only) the commandline tool 'fltk-options-cmd'
|
|
# message(STATUS "fltk-options: INSTALL TARGETS: ${TARGETS}")
|
|
|
|
install(TARGETS ${TARGETS}
|
|
EXPORT FLTK-Targets
|
|
RUNTIME DESTINATION ${FLTK_BINDIR}
|
|
LIBRARY DESTINATION ${FLTK_LIBDIR}
|
|
ARCHIVE DESTINATION ${FLTK_LIBDIR}
|
|
BUNDLE DESTINATION ${FLTK_BINDIR} # macOS: bundles
|
|
)
|
|
|
|
# Install desktop files
|
|
|
|
if(UNIX)
|
|
install(FILES fltk-options.desktop
|
|
DESTINATION ${FLTK_DATADIR}/applications
|
|
)
|
|
# Install mime-type file(x-fltk-options.desktop method is deprecated)
|
|
install(FILES fltk-options.xml
|
|
DESTINATION ${FLTK_DATADIR}/mime/packages
|
|
)
|
|
|
|
# Install desktop icons
|
|
foreach(icon 32 48 64 128)
|
|
install(FILES icons/fltk-options-${icon}.png
|
|
DESTINATION ${FLTK_DATADIR}/icons/hicolor/${icon}x${icon}/apps
|
|
RENAME fltk-options.png
|
|
)
|
|
endforeach()
|
|
endif(UNIX)
|