mirror of
https://github.com/fltk/fltk.git
synced 2026-03-23 07:24:03 +08:00
Exporting executable files means that they would appear in the CMake config files as "imported targets". This could break the config files of Linux and other distributions if such executables are not installed when building FLTK programs. The only executable files that need to be exported are the `fluid` executables that may be used to convert .fl files during building.
332 lines
9.2 KiB
CMake
332 lines
9.2 KiB
CMake
#
|
|
# CMakeLists.txt to build fluid for the FLTK project using CMake (www.cmake.org)
|
|
#
|
|
# Copyright 1998-2026 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 installed: fluid, fluid-shared, and fluid-cmd (Windows only)
|
|
set(TARGETS "")
|
|
# Targets that will be installed *and* "exported" as targets in CMake config file
|
|
set(EXPORTS "")
|
|
|
|
# Defaults to be used and potentially modified later
|
|
|
|
set(BACKEND_APPLE FALSE) # FIXME: should be global, e.g. FLTK_BACKEND_APPLE
|
|
set(ICON_NAME "")
|
|
set(ICON_PATH "")
|
|
set(SUFFIX "UNIX") # suffix for platform specific source files
|
|
|
|
# platform specific settings
|
|
|
|
if(APPLE AND NOT FLTK_BACKEND_X11) # macOS "native"
|
|
set(BACKEND_APPLE TRUE)
|
|
set(ICON_NAME fluid.icns)
|
|
set(ICON_PATH "${CMAKE_CURRENT_SOURCE_DIR}/icons/${ICON_NAME}")
|
|
elseif(WIN32)
|
|
set(SUFFIX "WIN32")
|
|
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.
|
|
#
|
|
# Parameters:
|
|
# - TARGET target name, e.g. 'fluid', 'fluid-cmd', 'fluid-shared', ...
|
|
# - GUI TRUE (GUI) or FALSE (command-line)
|
|
# - SOURCES source files
|
|
# - LIBS link libraries
|
|
# - EXPORT_NAME should be the same as TARGET, unless there are reasons...
|
|
# - EXPORT TRUE if "exported" in config file, FALSE if not
|
|
# - (others) see local variables defined above !
|
|
|
|
macro(make_target TARGET GUI SOURCES LIBS EXPORT_NAME EXPORT)
|
|
|
|
if(ICON_PATH)
|
|
list(APPEND SOURCES ${ICON_PATH}) # macOS only
|
|
endif()
|
|
|
|
# message(STATUS "[fluid] make_target ${TARGET} GUI:${GUI} ${SOURCES} ${LIBS} NAME:${EXPORT_NAME} EXPORT:${EXPORT}")
|
|
|
|
# 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})
|
|
|
|
if(${EXPORT})
|
|
list(APPEND EXPORTS ${TARGET})
|
|
else()
|
|
list(APPEND TARGETS ${TARGET})
|
|
endif()
|
|
|
|
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 SOURCES LIBS EXPORT_NAME EXPORT)
|
|
|
|
|
|
# Main source and header files used for the executable because macOS (Xcode)
|
|
# needs at least one source file (main.cxx) to link the main program properly
|
|
|
|
set(MAIN_FILES main.cxx main.h)
|
|
|
|
# Source files for 'fluid-lib': all source files except ${MAIN_FILES}
|
|
|
|
set(CPPFILES
|
|
Fluid.cxx
|
|
Project.cxx
|
|
app/args.cxx
|
|
app/Snap_Action.cxx
|
|
app/Image_Asset.cxx
|
|
app/history.cxx
|
|
app/Menu.cxx
|
|
app/shell_command.cxx
|
|
app/templates.cxx
|
|
io/Code_Writer.cxx
|
|
io/Project_Writer.cxx
|
|
io/Project_Reader.cxx
|
|
io/String_Writer.cxx
|
|
nodes/Tree.cxx
|
|
nodes/Button_Node.cxx
|
|
nodes/Function_Node.cxx
|
|
nodes/Grid_Node.cxx
|
|
nodes/Group_Node.cxx
|
|
nodes/Menu_Node.cxx
|
|
nodes/Node.cxx
|
|
nodes/Widget_Node.cxx
|
|
nodes/Window_Node.cxx
|
|
nodes/callbacks.cxx
|
|
nodes/factory.cxx
|
|
panels/about_panel.cxx
|
|
panels/codeview_panel.cxx
|
|
panels/function_panel.cxx
|
|
panels/settings_panel.cxx
|
|
panels/template_panel.cxx
|
|
panels/widget_panel.cxx
|
|
panels/widget_panel/Grid_Tab.cxx
|
|
panels/widget_panel/Grid_Child_Tab.cxx
|
|
proj/align_widget.cxx
|
|
proj/i18n.cxx
|
|
proj/mergeback.cxx
|
|
proj/undo.cxx
|
|
rsrcs/pixmaps.cxx
|
|
tools/ExternalCodeEditor_${SUFFIX}.cxx
|
|
tools/autodoc.cxx
|
|
tools/filename.cxx
|
|
widgets/App_Menu_Bar.cxx
|
|
widgets/Code_Editor.cxx
|
|
widgets/Code_Viewer.cxx
|
|
widgets/Text_Viewer.cxx
|
|
widgets/Formula_Input.cxx
|
|
widgets/Bin_Button.cxx
|
|
widgets/Style_Parser.cxx
|
|
widgets/Node_Browser.cxx
|
|
)
|
|
|
|
# List header files in Apple's Xcode IDE
|
|
|
|
set(HEADERFILES
|
|
Fluid.h
|
|
Project.h
|
|
app/args.h
|
|
app/Snap_Action.h
|
|
app/Image_Asset.h
|
|
app/history.h
|
|
app/Menu.h
|
|
app/shell_command.h
|
|
app/templates.h
|
|
io/Code_Writer.h
|
|
io/Project_Writer.h
|
|
io/Project_Reader.h
|
|
io/String_Writer.h
|
|
nodes/Tree.h
|
|
nodes/Button_Node.h
|
|
nodes/Function_Node.h
|
|
nodes/Grid_Node.h
|
|
nodes/Group_Node.h
|
|
nodes/Menu_Node.h
|
|
nodes/Node.h
|
|
nodes/Widget_Node.h
|
|
nodes/Window_Node.h
|
|
nodes/callbacks.h
|
|
nodes/factory.h
|
|
panels/about_panel.h
|
|
panels/codeview_panel.h
|
|
panels/function_panel.h
|
|
panels/settings_panel.h
|
|
panels/template_panel.h
|
|
panels/widget_panel.h
|
|
panels/widget_panel/Grid_Tab.h
|
|
panels/widget_panel/Grid_Child_Tab.h
|
|
proj/align_widget.h
|
|
proj/mergeback.h
|
|
proj/i18n.h
|
|
proj/undo.h
|
|
rsrcs/comments.h
|
|
rsrcs/pixmaps.h
|
|
tools/ExternalCodeEditor_${SUFFIX}.h
|
|
tools/autodoc.h
|
|
tools/filename.h
|
|
widgets/App_Menu_Bar.h
|
|
widgets/Code_Editor.h
|
|
widgets/Code_Viewer.h
|
|
widgets/Text_Viewer.h
|
|
widgets/Formula_Input.h
|
|
widgets/Bin_Button.h
|
|
widgets/Style_Parser.h
|
|
widgets/Node_Browser.h
|
|
)
|
|
|
|
source_group(
|
|
TREE
|
|
${CMAKE_CURRENT_SOURCE_DIR}
|
|
FILES
|
|
${CPPFILES}
|
|
${HEADERFILES}
|
|
${MAIN_FILES}
|
|
CMakeLists.txt
|
|
)
|
|
|
|
# Build a local object library to avoid compiling all source files
|
|
# multiple times for all fluid targets on Windows (fluid + fluid-cmd).
|
|
|
|
add_library(fluid-lib OBJECT EXCLUDE_FROM_ALL)
|
|
target_sources(fluid-lib PRIVATE ${CPPFILES} ${HEADERFILES})
|
|
target_include_directories(fluid-lib PUBLIC .)
|
|
target_link_libraries(fluid-lib PUBLIC fltk::images)
|
|
|
|
# Build targets
|
|
|
|
make_target(fluid TRUE "${MAIN_FILES}" fluid-lib fluid TRUE)
|
|
|
|
# Build the console app on Windows
|
|
# This is done for all Windows targets, even if cross-compiling.
|
|
|
|
if(WIN32)
|
|
make_target(fluid-cmd FALSE "${MAIN_FILES}" fluid-lib fluid-cmd TRUE)
|
|
set(FLTK_FLUID_EXECUTABLE fltk::fluid-cmd)
|
|
else()
|
|
set(FLTK_FLUID_EXECUTABLE fltk::fluid)
|
|
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)
|
|
|
|
add_library(fluid-lib-shared OBJECT EXCLUDE_FROM_ALL)
|
|
target_sources(fluid-lib-shared PRIVATE ${CPPFILES} ${HEADERFILES})
|
|
target_include_directories(fluid-lib-shared PUBLIC .)
|
|
if(MSVC)
|
|
target_link_libraries(fluid-lib-shared PUBLIC fltk::fltk-shared)
|
|
else()
|
|
target_link_libraries(fluid-lib-shared PUBLIC fltk::images-shared)
|
|
endif(MSVC)
|
|
|
|
if(MSVC)
|
|
make_target(fluid-shared TRUE "${MAIN_FILES}" "fluid-lib-shared;call_main" fluid-shared FALSE)
|
|
else()
|
|
make_target(fluid-shared TRUE "${MAIN_FILES}" fluid-lib-shared fluid-shared FALSE)
|
|
endif()
|
|
|
|
# experimental
|
|
# if(NOT WIN32)
|
|
# set(FLTK_FLUID_EXECUTABLE fltk::fluid-shared)
|
|
# message(STATUS "** experimental ** FLTK_FLUID_EXECUTABLE = ${FLTK_FLUID_EXECUTABLE}")
|
|
# endif()
|
|
|
|
endif(FLTK_BUILD_SHARED_LIBS)
|
|
|
|
# export the variable FLTK_FLUID_EXECUTABLE to the parent scope
|
|
|
|
set(FLTK_FLUID_EXECUTABLE "${FLTK_FLUID_EXECUTABLE}" PARENT_SCOPE)
|
|
|
|
# Create aliases for all targets
|
|
|
|
foreach(tgt ${TARGETS} ${EXPORTS})
|
|
add_executable(fltk::${tgt} ALIAS ${tgt})
|
|
endforeach()
|
|
|
|
# Install the GUI and (on Windows only) the commandline tool 'fluid-cmd'
|
|
# message(STATUS "[fluid] INSTALL + EXPORT: ${EXPORTS}")
|
|
# message(STATUS "[fluid] INSTALL - only : ${TARGETS}")
|
|
|
|
if(EXPORTS)
|
|
install(TARGETS ${EXPORTS}
|
|
EXPORT FLTK-Targets
|
|
RUNTIME DESTINATION ${FLTK_BINDIR}
|
|
LIBRARY DESTINATION ${FLTK_LIBDIR}
|
|
ARCHIVE DESTINATION ${FLTK_LIBDIR}
|
|
BUNDLE DESTINATION ${FLTK_BINDIR} # macOS: bundles
|
|
)
|
|
endif()
|
|
|
|
if(TARGETS)
|
|
install(TARGETS ${TARGETS}
|
|
RUNTIME DESTINATION ${FLTK_BINDIR}
|
|
LIBRARY DESTINATION ${FLTK_LIBDIR}
|
|
ARCHIVE DESTINATION ${FLTK_LIBDIR}
|
|
BUNDLE DESTINATION ${FLTK_BINDIR} # macOS: bundles
|
|
)
|
|
endif()
|
|
|
|
# Install desktop files
|
|
|
|
if(UNIX)
|
|
install(FILES fluid.desktop
|
|
DESTINATION ${FLTK_DATADIR}/applications
|
|
)
|
|
# Install mime-type file(x-fluid.desktop method is deprecated)
|
|
install(FILES fluid.xml
|
|
DESTINATION ${FLTK_DATADIR}/mime/packages
|
|
)
|
|
|
|
# Install desktop icons
|
|
foreach(icon 32 48 64 128)
|
|
install(FILES icons/fluid-${icon}.png
|
|
DESTINATION ${FLTK_DATADIR}/icons/hicolor/${icon}x${icon}/apps
|
|
RENAME fluid.png
|
|
)
|
|
endforeach()
|
|
endif(UNIX)
|