Warning, /graphics/kseexpr/CMakeLists.txt is written in an unsupported language. File is not indexed.

0001 # SPDX-FileCopyrightText: 2011-2019 Disney Enterprises, Inc.
0002 # SPDX-License-Identifier: LicenseRef-Apache-2.0
0003 # SPDX-FileCopyrightText: 2020-2021 L. E. Segovia <amy@amyspark.me>
0004 # SPDX-License-Identifier: GPL-3.0-or-later
0005 
0006 cmake_minimum_required(VERSION 3.8.0)
0007 
0008 # option() honors normal variables. Needed for LLVM 10.
0009 if (POLICY CMP0077)
0010     cmake_policy(SET CMP0077 NEW)
0011 endif()
0012 # Minimum for SeExpr is 11. LLVM (if used) may need 14.
0013 # LLVM with Clang < 8 crashes on compile: https://github.com/andreasfertig/cppinsights/issues/56#issuecomment-408674466
0014 set(CMAKE_CXX_STANDARD 14)
0015 
0016 ## project name & version
0017 project(KSeExpr
0018     VERSION "4.0.4.0"
0019     DESCRIPTION "An embeddable expression evaluation engine for Krita"
0020 )
0021 
0022 message(STATUS "Welcome to ${CMAKE_PROJECT_NAME} ${CMAKE_PROJECT_VERSION} !")
0023 
0024 enable_testing()
0025 
0026 ## Silence installation messages
0027 set(CMAKE_INSTALL_MESSAGE LAZY)
0028 
0029 # macros
0030 include(GNUInstallDirs)
0031 include(CMakePackageConfigHelpers)
0032 include(GenerateExportHeader)
0033 LIST (APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
0034 include(macros)
0035 include(CheckCXXSourceCompiles)
0036 include(FeatureSummary)
0037 
0038 # Default installation prefix
0039 if (NOT DEFINED FLAVOR)
0040     set(FLAVOR "optimize" CACHE STRING "Build flavor")
0041 endif()
0042 
0043 ## Choose build options
0044 # Disney specific method of choosing variant
0045 if (${FLAVOR} STREQUAL "optimize")
0046     set(CMAKE_BUILD_TYPE "Release" CACHE STRING "type of build" FORCE)
0047 endif()
0048 
0049 if (${FLAVOR} STREQUAL "debug")
0050     set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "type of build" FORCE)
0051 endif()
0052 
0053 if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
0054     execute_process(
0055         COMMAND sh -c "echo `uname -s`-`uname -r | cut -d- -f1`-`uname -m`"
0056         OUTPUT_VARIABLE VARIANT_DIRECTORY OUTPUT_STRIP_TRAILING_WHITESPACE)
0057     set(CMAKE_INSTALL_PREFIX
0058         "${CMAKE_SOURCE_DIR}/${VARIANT_DIRECTORY}-${FLAVOR}"
0059         CACHE PATH "Installation prefix" FORCE)
0060 endif()
0061 
0062 message(STATUS "CMAKE_INSTALL_PREFIX = ${CMAKE_INSTALL_PREFIX}")
0063 message(STATUS "CMAKE_INSTALL_LIBDIR = ${CMAKE_INSTALL_LIBDIR}")
0064 
0065 # Configuration options
0066 option(ENABLE_LLVM_BACKEND "Whether to build with LLVM backend" FALSE)
0067 add_feature_info(LLVMBackend ENABLE_LLVM_BACKEND "Build the LLVM backend of KSeExpr")
0068 option(ENABLE_QT5 "Whether to use Qt5" TRUE)
0069 add_feature_info(KSeExprUI ENABLE_QT5 "Build the KSeExprUI widget library")
0070 option(BUILD_UTILS "Whether to build the utilities" FALSE)
0071 add_feature_info(Utils BUILD_UTILS "Build the utilities")
0072 option(BUILD_DEMOS "Whether to build the demos" FALSE)
0073 add_feature_info(Demos BUILD_DEMOS "Build the demos")
0074 option(BUILD_DOC "Whether to build the documentation" FALSE)
0075 add_feature_info(Docs BUILD_DOC "Build the documentation")
0076 option(BUILD_TESTS "Whether to build the tests" FALSE)
0077 add_feature_info(Tests BUILD_TESTS "Build the tests")
0078 option(ENABLE_SLOW_TESTS "Whether to enable slow tests" FALSE)
0079 add_feature_info(SlowTests ENABLE_SLOW_TESTS "Enables slow tests")
0080 option(USE_PREGENERATED_FILES "Whether to use the bundled pregenerated parser files" FALSE)
0081 add_feature_info(PregeneratedFiles USE_PREGENERATED_FILES "Build the language parser using the bundled, pregenerated files")
0082 option(ENABLE_PERFORMANCE_STATS "Whether to print performance stats across KSeExpr" FALSE)
0083 add_feature_info(PerformanceStats ENABLE_PERFORMANCE_STATS "Print performance stats across KSeExpr")
0084 
0085 # Package lookup
0086 
0087 find_package(Doxygen)
0088 set_package_properties(Doxygen PROPERTIES
0089                        TYPE OPTIONAL
0090                        PURPOSE "Needed to build the documentation")
0091 find_package(ECM 5.52.0 NO_MODULE)
0092 set_package_properties(ECM PROPERTIES
0093                        TYPE OPTIONAL
0094                        PURPOSE "Enables translations (if bundled) and automatic sanitizer support")
0095 find_package(KF5I18n 5.52.0)
0096 set_package_properties(KF5I18n PROPERTIES
0097                        TYPE OPTIONAL
0098                        PURPOSE "Enables detection of fallback languages in KDE apps")
0099 find_package(GTest)
0100 set_package_properties(GTest PROPERTIES
0101                        TYPE OPTIONAL
0102                        PURPOSE "Needed for building the tests")
0103 find_package(PNG)
0104 set_package_properties(PNG PROPERTIES
0105                        TYPE OPTIONAL
0106                        PURPOSE "Needed to support image file output in demos and tests")
0107 find_package(Python3)
0108 set_package_properties(Python3 PROPERTIES
0109                        TYPE OPTIONAL
0110                        PURPOSE "Needed for running some tests")
0111 find_package(BISON)
0112 set_package_properties(BISON PROPERTIES
0113                        TYPE OPTIONAL
0114                        PURPOSE "Needed to build KSeExpr's language parser from source")
0115 find_package(FLEX)
0116 set_package_properties(FLEX PROPERTIES
0117                        TYPE OPTIONAL
0118                        PURPOSE "Needed to build KSeExpr's language parser from source")
0119 find_program(SED_EXE sed)
0120 set_package_properties(SED_EXE PROPERTIES
0121                        TYPE OPTIONAL
0122                        PURPOSE "Needed to build KSeExpr's language parser from source")
0123 
0124 if (ECM_FOUND)
0125     set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${CMAKE_MODULE_PATH})
0126     if (FLAVOR STREQUAL "debug")
0127         message(STATUS "ECM sanitizer support is available.")
0128         include(ECMEnableSanitizers)
0129     endif()
0130 
0131     if (IS_DIRECTORY "${CMAKE_SOURCE_DIR}/poqm")
0132         option(BUILD_TRANSLATIONS "Whether to include translations" TRUE)
0133         add_feature_info(i18n BUILD_TRANSLATIONS "Build and embed translations")
0134     endif ()
0135 endif ()
0136 
0137 if (ENABLE_LLVM_BACKEND)
0138     find_package(LLVM)
0139     set_package_properties(LLVM PROPERTIES
0140                         TYPE OPTIONAL
0141                         PURPOSE "Needed for building the LLVM-based script backend")
0142     if (NOT LLVM_FOUND OR LLVM_VERSION VERSION_LESS 3.8.0)
0143         set(ENABLE_LLVM_BACKEND off)
0144         message(STATUS "Not building with LLVM, version must be >= 3.8.0")
0145     else()
0146         set(SEEXPR_ENABLE_LLVM 1)
0147 
0148         message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}")
0149         set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${LLVM_DIR}")
0150         include(LLVM-Config)
0151         include(LLVMConfig)
0152         include(HandleLLVMOptions)
0153 
0154         message(STATUS "LLVM_DEFINITIONS =" ${LLVM_DEFINITIONS})
0155         message(STATUS "LLVM_INCLUDE_DIRS =" ${LLVM_INCLUDE_DIRS})
0156         message(STATUS "LLVM_LIBRARY_DIR =" ${LLVM_LIBRARY_DIR})
0157         message(STATUS "LLVM_PACKAGE_VERSION =" ${LLVM_PACKAGE_VERSION})
0158 
0159         # construct library names
0160 
0161         message(STATUS "Detected processor: ${CMAKE_SYSTEM_PROCESSOR}")
0162         if(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64.*|x86_64.*|AMD64.*")
0163             set(KSeExpr_PLATFORM_CODEGEN_LIBS
0164                 X86CodeGen
0165                 X86AsmParser)
0166         elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "i686.*|i386.*|x86.*")
0167             set(KSeExpr_PLATFORM_CODEGEN_LIBS
0168                 X86CodeGen
0169                 X86AsmParser)
0170         elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64.*|AARCH64.*|arm64.*|ARM64.*)")
0171             set(KSeExpr_PLATFORM_CODEGEN_LIBS
0172                 AArch64CodeGen
0173                 AArch64AsmParser)
0174         elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm.*|ARM.*)")
0175             set(KSeExpr_PLATFORM_CODEGEN_LIBS
0176                 ARMCodeGen
0177                 ARMAsmParser)
0178         else()
0179             message(ERROR "Unknown processor, unable to set LLVM codegen targets")
0180         endif()
0181 
0182         if (LLVM IN_LIST LLVM_AVAILABLE_LIBS)
0183             message(STATUS "Shared libLLVM is available, using it.")
0184             set(LLVM_LIB LLVM)
0185         else()
0186             message(STATUS "Shared libLLVM is not available, falling back to static linkage.")
0187             llvm_map_components_to_libnames(LLVM_LIB
0188                 Interpreter
0189                 MCJIT
0190                 ObjCARCOpts
0191                 Passes
0192                 ${KSeExpr_PLATFORM_CODEGEN_LIBS}
0193             )
0194         endif()
0195 
0196         message(STATUS "LLVM_LIB = ${LLVM_LIB}")
0197     endif()
0198 endif()
0199 
0200 ## Setup platform specific helper defines build variants
0201 if (WIN32)
0202     add_definitions(-DSEEXPR_WIN32)
0203     add_definitions(-D_CRT_SECURE_NO_WARNINGS)
0204     add_compile_definitions(_USE_MATH_DEFINES)
0205 else()
0206     add_definitions(-Wall -Wextra -Wno-unused-parameter)
0207 
0208     set(CMAKE_POSITION_INDEPENDENT_CODE ON)
0209     if (APPLE)
0210         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-date-time")
0211     endif()
0212 endif()
0213 
0214 # Set to release if nothing else defined
0215 if (NOT CMAKE_BUILD_TYPE)
0216   set(CMAKE_BUILD_TYPE "Release" CACHE STRING
0217       "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
0218       FORCE)
0219 endif()
0220 
0221 if (ENABLE_QT5)
0222     find_package(Qt5 5.9.0 COMPONENTS Core Gui Widgets REQUIRED)
0223     set_package_properties(Qt5 PROPERTIES
0224                             TYPE REQUIRED
0225                             PURPOSE "Required if you're building KSeExprUI")
0226     message(STATUS "Qt5 Enabled")
0227 endif()
0228 
0229 ## Make modules able to see seexpr library
0230 # Setup environment variable to link seexpr
0231 set(SEEXPR_LIBRARIES KSeExpr)
0232 set(SEEXPR_LLVM_LIBRARIES KSeExprLLVM)
0233 set(SEEXPR_EDITOR_LIBRARIES KSeExprUI)
0234 
0235 # make it so seexpr can be found
0236 include_directories(BEFORE ${CMAKE_SOURCE_DIR}/src)
0237 
0238 if (ENABLE_PERFORMANCE_STATS)
0239     add_definitions(-DSEEXPR_PERFORMANCE)
0240 endif()
0241 
0242 ## Traverse subdirectories
0243 add_subdirectory(src/KSeExpr)
0244 if (ENABLE_QT5)
0245     add_subdirectory(src/KSeExprUI)
0246 endif()
0247 if (BUILD_UTILS)
0248     add_subdirectory(src/utils)
0249 endif()
0250 if (BUILD_DEMOS)
0251     add_subdirectory(src/demos)
0252 endif()
0253 if (BUILD_DOC)
0254     add_subdirectory(src/doc)
0255 endif()
0256 if (BUILD_TESTS)
0257     add_subdirectory(src/tests)
0258 endif()
0259 
0260 # cmake packaging -- this is done after adding subdirectories so that
0261 # all exported targets are found by export() below.
0262 configure_file("cmake/kseexpr.pc.in" "kseexpr.pc" @ONLY)
0263 install(FILES "${CMAKE_CURRENT_BINARY_DIR}/kseexpr.pc"
0264     COMPONENT devel DESTINATION share/pkgconfig)
0265 
0266 write_basic_package_version_file("kseexpr-config-version.cmake" VERSION ${${PROJECT_NAME}_VERSION} COMPATIBILITY SameMajorVersion)
0267 
0268 configure_package_config_file(
0269     "cmake/kseexpr-config.cmake" "kseexpr-config.cmake"
0270     INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
0271     PATH_VARS CMAKE_INSTALL_PREFIX CMAKE_INSTALL_LIBDIR CMAKE_INSTALL_INCLUDEDIR)
0272 install(FILES
0273     "${CMAKE_CURRENT_BINARY_DIR}/kseexpr-config.cmake"
0274     "${CMAKE_CURRENT_BINARY_DIR}/kseexpr-config-version.cmake"
0275     DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
0276 )
0277 install(EXPORT ${PROJECT_NAME}Targets
0278     NAMESPACE ${PROJECT_NAME}::
0279     DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
0280 )
0281 
0282 feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)