diff --git a/CMakeLists.txt b/CMakeLists.txt index a30de597..6845d38b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,6 +15,7 @@ option(FTXUI_ENABLE_INSTALL "Generate the install target" ON) option(FTXUI_CLANG_TIDY "Execute clang-tidy" OFF) option(FTXUI_ENABLE_COVERAGE "Execute code coverage" OFF) option(FTXUI_DEV_WARNINGS "Enable more compiler warnings and warnings as errors" OFF) +option(FTXUI_BUILD_MODULES "Build the C++20 modules" OFF) set(FTXUI_MICROSOFT_TERMINAL_FALLBACK_HELP_TEXT "On windows, assume the \ terminal used will be one of Microsoft and use a set of reasonnable fallback \ @@ -176,7 +177,7 @@ include(cmake/iwyu.cmake) include(cmake/ftxui_export.cmake) include(cmake/ftxui_install.cmake) include(cmake/ftxui_package.cmake) +include(cmake/ftxui_modules.cmake) add_subdirectory(examples) add_subdirectory(doc) -add_subdirectory(modules/ftxui) diff --git a/cmake/ftxui_message.cmake b/cmake/ftxui_message.cmake index 49cc4e82..28ca5b4e 100644 --- a/cmake/ftxui_message.cmake +++ b/cmake/ftxui_message.cmake @@ -14,4 +14,5 @@ ftxui_message("│ FTXUI_BUILD_TESTS_FUZZER : ${FTXUI_BUILD_TESTS_FUZZER}") ftxui_message("│ FTXUI_ENABLE_COVERAGE : ${FTXUI_ENABLE_COVERAGE}") ftxui_message("│ FTXUI_DEV_WARNINGS : ${FTXUI_DEV_WARNINGS}") ftxui_message("│ FTXUI_CLANG_TIDY : ${FTXUI_CLANG_TIDY}") +ftxui_message("│ FTXUI_BUILD_MODULES : ${FTXUI_BUILD_MODULES}") ftxui_message("└─────────────────────────────────────") diff --git a/cmake/ftxui_modules.cmake b/cmake/ftxui_modules.cmake new file mode 100644 index 00000000..5f07998c --- /dev/null +++ b/cmake/ftxui_modules.cmake @@ -0,0 +1,106 @@ +if (NOT FTXUI_BUILD_MODULES) + return() +endif() + +# CMake 3.28+ supports the new CMake C++ module system. +if(CMAKE_VERSION VERSION_LESS 3.28) + message(FATAL_ERROR + "FTXUI_BUILD_MODULES requires CMake 3.28 or higher. " + ) + return() +endif() + +# Not all compilers support the C++ module system yet. +if (NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU|MSVC") + message(FATAL_ERROR + "FTXUI_BUILD_MODULES requires a compiler that supports C++20 modules. " + "Currently, only Clang, GCC, and MSVC support this feature." + ) + return() +endif() + +# The list of generators which support scanning sources for C++ modules include: +# - Ninja +# - Ninja Multi-Config +# - Visual Studio 17 2022 +if (NOT (CMAKE_GENERATOR MATCHES "Ninja") AND + NOT (CMAKE_GENERATOR MATCHES "Visual Studio" AND + CMAKE_GENERATOR_VERSION VERSION_GREATER_EQUAL 17)) + message(FATAL_ERROR + "FTXUI_BUILD_MODULES requires a generator that supports C++20 modules. + Please use Ninja or Visual Studio 17 2022 or higher." + ) + return() +endif() + +cmake_minimum_required(VERSION 3.28) +add_library(ftxui-modules) + +target_sources(ftxui-modules + PUBLIC + FILE_SET CXX_MODULES + FILES + src/ftxui/component.cppm + src/ftxui/component/Animation.cppm + src/ftxui/component/CapturedMouse.cppm + src/ftxui/component/Component.cppm + src/ftxui/component/ComponentBase.cppm + src/ftxui/component/ComponentOptions.cppm + src/ftxui/component/Event.cppm + src/ftxui/component/Loop.cppm + src/ftxui/component/Mouse.cppm + src/ftxui/component/Receiver.cppm + src/ftxui/component/ScreenInteractive.cppm + src/ftxui/component/Task.cppm + src/ftxui/dom.cppm + src/ftxui/dom/Canvas.cppm + src/ftxui/dom/Deprecated.cppm + src/ftxui/dom/Direction.cppm + src/ftxui/dom/Elements.cppm + src/ftxui/dom/FlexboxConfig.cppm + src/ftxui/dom/LinearGradient.cppm + src/ftxui/dom/Node.cppm + src/ftxui/dom/Requirement.cppm + src/ftxui/dom/Selection.cppm + src/ftxui/dom/Table.cppm + src/ftxui/screen.cppm + src/ftxui/screen/Box.cppm + src/ftxui/screen/Color.cppm + src/ftxui/screen/ColorInfo.cppm + src/ftxui/screen/Deprecated.cppm + src/ftxui/screen/Image.cppm + src/ftxui/screen/Pixel.cppm + src/ftxui/screen/Screen.cppm + src/ftxui/screen/String.cppm + src/ftxui/screen/Terminal.cppm + src/ftxui/util.cppm + src/ftxui/util/AutoReset.cppm + src/ftxui/util/Ref.cppm + ) + +target_link_libraries(ftxui-modules + PUBLIC + ftxui::screen + ftxui::dom + ftxui::component +) + +target_compile_features(ftxui-modules PUBLIC cxx_std_20) + +#set_target_properties(ftxui-modules PROPERTIES + #CXX_STANDARD 23 + #CXX_STANDARD_REQUIRED ON + #CXX_EXTENSIONS OFF + #CXX_MODULE_DYNDEP OFF +#) + +add_library(ftxui::modules ALIAS ftxui-modules) + +if(FTXUI_ENABLE_INSTALL) + install(TARGETS ftxui-modules + EXPORT ftxui-targets + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + FILE_SET CXX_MODULES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ftxui/modules + ) +endif() diff --git a/modules/ftxui/CMakeLists.txt b/modules/ftxui/CMakeLists.txt deleted file mode 100644 index 28c4f1b5..00000000 --- a/modules/ftxui/CMakeLists.txt +++ /dev/null @@ -1,91 +0,0 @@ -# CMake 3.28+ supports the new CMake C++ module system. -if(CMAKE_VERSION VERSION_LESS 3.28) - return() -endif() - -# Not all compilers support the C++ module system yet. -if (NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU|MSVC") - return() -endif() - -# The list of generators which support scanning sources for C++ modules include: -# - Ninja -# - Ninja Multi-Config -# - Visual Studio 17 2022 -if (NOT (CMAKE_GENERATOR MATCHES "Ninja") AND - NOT (CMAKE_GENERATOR MATCHES "Visual Studio" AND - CMAKE_GENERATOR_VERSION VERSION_GREATER_EQUAL 17)) - return() -endif() - -cmake_minimum_required(VERSION 3.28) -add_library(ftxui_modules) - -target_sources(ftxui_modules - PUBLIC - FILE_SET CXX_MODULES - FILES - component.cppm - component/Animation.cppm - component/CapturedMouse.cppm - component/Component.cppm - component/ComponentBase.cppm - component/ComponentOptions.cppm - component/Event.cppm - component/Loop.cppm - component/Mouse.cppm - component/Receiver.cppm - component/ScreenInteractive.cppm - component/Task.cppm - dom.cppm - dom/Canvas.cppm - dom/Deprecated.cppm - dom/Direction.cppm - dom/Elements.cppm - dom/FlexboxConfig.cppm - dom/LinearGradient.cppm - dom/Node.cppm - dom/Requirement.cppm - dom/Selection.cppm - dom/Table.cppm - screen.cppm - screen/Box.cppm - screen/Color.cppm - screen/ColorInfo.cppm - screen/Deprecated.cppm - screen/Image.cppm - screen/Pixel.cppm - screen/Screen.cppm - screen/String.cppm - screen/Terminal.cppm - util.cppm - util/AutoReset.cppm - util/Ref.cppm - ) - -target_link_libraries(ftxui_modules - PUBLIC - ftxui::screen - ftxui::dom - ftxui::component -) - -target_compile_features(ftxui_modules PUBLIC cxx_std_20) - -#set_target_properties(ftxui_modules PROPERTIES - #CXX_STANDARD 23 - #CXX_STANDARD_REQUIRED ON - #CXX_EXTENSIONS OFF - #CXX_MODULE_DYNDEP OFF -#) - -add_library(ftxui::modules ALIAS ftxui_modules) - -if(FTXUI_ENABLE_INSTALL) - install(TARGETS ftxui_modules - EXPORT ftxui-targets - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - FILE_SET CXX_MODULES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ftxui/modules - ) -endif() diff --git a/modules/ftxui/component.cppm b/src/ftxui/component.cppm similarity index 100% rename from modules/ftxui/component.cppm rename to src/ftxui/component.cppm diff --git a/modules/ftxui/component/Animation.cppm b/src/ftxui/component/Animation.cppm similarity index 100% rename from modules/ftxui/component/Animation.cppm rename to src/ftxui/component/Animation.cppm diff --git a/modules/ftxui/component/CapturedMouse.cppm b/src/ftxui/component/CapturedMouse.cppm similarity index 100% rename from modules/ftxui/component/CapturedMouse.cppm rename to src/ftxui/component/CapturedMouse.cppm diff --git a/modules/ftxui/component/Component.cppm b/src/ftxui/component/Component.cppm similarity index 100% rename from modules/ftxui/component/Component.cppm rename to src/ftxui/component/Component.cppm diff --git a/modules/ftxui/component/ComponentBase.cppm b/src/ftxui/component/ComponentBase.cppm similarity index 100% rename from modules/ftxui/component/ComponentBase.cppm rename to src/ftxui/component/ComponentBase.cppm diff --git a/modules/ftxui/component/ComponentOptions.cppm b/src/ftxui/component/ComponentOptions.cppm similarity index 100% rename from modules/ftxui/component/ComponentOptions.cppm rename to src/ftxui/component/ComponentOptions.cppm diff --git a/modules/ftxui/component/Event.cppm b/src/ftxui/component/Event.cppm similarity index 100% rename from modules/ftxui/component/Event.cppm rename to src/ftxui/component/Event.cppm diff --git a/modules/ftxui/component/Loop.cppm b/src/ftxui/component/Loop.cppm similarity index 100% rename from modules/ftxui/component/Loop.cppm rename to src/ftxui/component/Loop.cppm diff --git a/modules/ftxui/component/Mouse.cppm b/src/ftxui/component/Mouse.cppm similarity index 100% rename from modules/ftxui/component/Mouse.cppm rename to src/ftxui/component/Mouse.cppm diff --git a/modules/ftxui/component/Receiver.cppm b/src/ftxui/component/Receiver.cppm similarity index 100% rename from modules/ftxui/component/Receiver.cppm rename to src/ftxui/component/Receiver.cppm diff --git a/modules/ftxui/component/ScreenInteractive.cppm b/src/ftxui/component/ScreenInteractive.cppm similarity index 100% rename from modules/ftxui/component/ScreenInteractive.cppm rename to src/ftxui/component/ScreenInteractive.cppm diff --git a/modules/ftxui/component/Task.cppm b/src/ftxui/component/Task.cppm similarity index 100% rename from modules/ftxui/component/Task.cppm rename to src/ftxui/component/Task.cppm diff --git a/modules/ftxui/dom.cppm b/src/ftxui/dom.cppm similarity index 100% rename from modules/ftxui/dom.cppm rename to src/ftxui/dom.cppm diff --git a/modules/ftxui/dom/Canvas.cppm b/src/ftxui/dom/Canvas.cppm similarity index 100% rename from modules/ftxui/dom/Canvas.cppm rename to src/ftxui/dom/Canvas.cppm diff --git a/modules/ftxui/dom/Deprecated.cppm b/src/ftxui/dom/Deprecated.cppm similarity index 100% rename from modules/ftxui/dom/Deprecated.cppm rename to src/ftxui/dom/Deprecated.cppm diff --git a/modules/ftxui/dom/Direction.cppm b/src/ftxui/dom/Direction.cppm similarity index 100% rename from modules/ftxui/dom/Direction.cppm rename to src/ftxui/dom/Direction.cppm diff --git a/modules/ftxui/dom/Elements.cppm b/src/ftxui/dom/Elements.cppm similarity index 100% rename from modules/ftxui/dom/Elements.cppm rename to src/ftxui/dom/Elements.cppm diff --git a/modules/ftxui/dom/FlexboxConfig.cppm b/src/ftxui/dom/FlexboxConfig.cppm similarity index 100% rename from modules/ftxui/dom/FlexboxConfig.cppm rename to src/ftxui/dom/FlexboxConfig.cppm diff --git a/modules/ftxui/dom/LinearGradient.cppm b/src/ftxui/dom/LinearGradient.cppm similarity index 100% rename from modules/ftxui/dom/LinearGradient.cppm rename to src/ftxui/dom/LinearGradient.cppm diff --git a/modules/ftxui/dom/Node.cppm b/src/ftxui/dom/Node.cppm similarity index 100% rename from modules/ftxui/dom/Node.cppm rename to src/ftxui/dom/Node.cppm diff --git a/modules/ftxui/dom/Requirement.cppm b/src/ftxui/dom/Requirement.cppm similarity index 100% rename from modules/ftxui/dom/Requirement.cppm rename to src/ftxui/dom/Requirement.cppm diff --git a/modules/ftxui/dom/Selection.cppm b/src/ftxui/dom/Selection.cppm similarity index 100% rename from modules/ftxui/dom/Selection.cppm rename to src/ftxui/dom/Selection.cppm diff --git a/modules/ftxui/dom/Table.cppm b/src/ftxui/dom/Table.cppm similarity index 100% rename from modules/ftxui/dom/Table.cppm rename to src/ftxui/dom/Table.cppm diff --git a/modules/ftxui/screen.cppm b/src/ftxui/screen.cppm similarity index 100% rename from modules/ftxui/screen.cppm rename to src/ftxui/screen.cppm diff --git a/modules/ftxui/screen/Box.cppm b/src/ftxui/screen/Box.cppm similarity index 100% rename from modules/ftxui/screen/Box.cppm rename to src/ftxui/screen/Box.cppm diff --git a/modules/ftxui/screen/Color.cppm b/src/ftxui/screen/Color.cppm similarity index 100% rename from modules/ftxui/screen/Color.cppm rename to src/ftxui/screen/Color.cppm diff --git a/modules/ftxui/screen/ColorInfo.cppm b/src/ftxui/screen/ColorInfo.cppm similarity index 100% rename from modules/ftxui/screen/ColorInfo.cppm rename to src/ftxui/screen/ColorInfo.cppm diff --git a/modules/ftxui/screen/Deprecated.cppm b/src/ftxui/screen/Deprecated.cppm similarity index 100% rename from modules/ftxui/screen/Deprecated.cppm rename to src/ftxui/screen/Deprecated.cppm diff --git a/modules/ftxui/screen/Image.cppm b/src/ftxui/screen/Image.cppm similarity index 100% rename from modules/ftxui/screen/Image.cppm rename to src/ftxui/screen/Image.cppm diff --git a/modules/ftxui/screen/Pixel.cppm b/src/ftxui/screen/Pixel.cppm similarity index 100% rename from modules/ftxui/screen/Pixel.cppm rename to src/ftxui/screen/Pixel.cppm diff --git a/modules/ftxui/screen/Screen.cppm b/src/ftxui/screen/Screen.cppm similarity index 100% rename from modules/ftxui/screen/Screen.cppm rename to src/ftxui/screen/Screen.cppm diff --git a/modules/ftxui/screen/String.cppm b/src/ftxui/screen/String.cppm similarity index 100% rename from modules/ftxui/screen/String.cppm rename to src/ftxui/screen/String.cppm diff --git a/modules/ftxui/screen/Terminal.cppm b/src/ftxui/screen/Terminal.cppm similarity index 100% rename from modules/ftxui/screen/Terminal.cppm rename to src/ftxui/screen/Terminal.cppm diff --git a/modules/ftxui/util.cppm b/src/ftxui/util.cppm similarity index 100% rename from modules/ftxui/util.cppm rename to src/ftxui/util.cppm diff --git a/modules/ftxui/util/AutoReset.cppm b/src/ftxui/util/AutoReset.cppm similarity index 100% rename from modules/ftxui/util/AutoReset.cppm rename to src/ftxui/util/AutoReset.cppm diff --git a/modules/ftxui/util/Ref.cppm b/src/ftxui/util/Ref.cppm similarity index 100% rename from modules/ftxui/util/Ref.cppm rename to src/ftxui/util/Ref.cppm