|
| 1 | +cmake_minimum_required (VERSION 3.10) |
| 2 | + |
| 3 | + |
| 4 | +################ |
| 5 | +## Project |
| 6 | +######################### |
| 7 | +project(modest LANGUAGES C) |
| 8 | + |
| 9 | + |
| 10 | +################ |
| 11 | +## User choices |
| 12 | +######################### |
| 13 | +option(MODEST_BUILD_SHARED "Build shared library" ON) |
| 14 | +option(MODEST_BUILD_STATIC "Build static library" ON) |
| 15 | +option(MyHTML_BUILD_WITHOUT_THREADS "Build MyHTML without POSIX Threads" OFF) |
| 16 | +option(MyCORE_BUILD_WITHOUT_THREADS "Build MyCORE without POSIX Threads" OFF) |
| 17 | +option(MODEST_INSTALL_HEADERS "Install header files" ON) |
| 18 | +set(CMAKE_C_STANDARD 99 CACHE STRING "desired compilation C standard: 90, 99, 11") |
| 19 | +#set_property(CACHE CMAKE_C_STANDARD PROPERTY STRINGS 90 99 11) |
| 20 | +option(CMAKE_C_STANDARD_REQUIRED "don't compile using a previous C standard if the one specified is not met" ON) |
| 21 | +#set(CMAKE_CXX_STANDARD 11 CACHE STRING "desired compilation C++ standard: 98, 11, 14, 17, 20") |
| 22 | +#set_property(CACHE CMAKE_CXX_STANDARD PROPERTY STRINGS 98 11 14 17 20) |
| 23 | +#option(CMAKE_CXX_STANDARD_REQUIRED "don't compile using a previous C++ standard if the one specified is not met" ON) |
| 24 | +#option(CMAKE_CXX_EXTENSIONS "compile using C++ standard extensions" FALSE) |
| 25 | +set(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "Suffix for debug binaries") |
| 26 | + |
| 27 | + |
| 28 | +################ |
| 29 | +## Dependencies |
| 30 | +######################### |
| 31 | +if(NOT MyHTML_BUILD_WITHOUT_THREADS OR NOT MyCORE_BUILD_WITHOUT_THREADS) |
| 32 | + set(CMAKE_THREAD_PREFER_PTHREAD 1) |
| 33 | + find_package(Threads REQUIRED) |
| 34 | + if(NOT CMAKE_USE_PTHREADS_INIT) |
| 35 | + message(FATAL_ERROR "Could NOT find pthreads (missing: CMAKE_USE_PTHREADS_INIT)") |
| 36 | + endif() |
| 37 | +endif() |
| 38 | + |
| 39 | + |
| 40 | +################ |
| 41 | +## Project Version |
| 42 | +######################### |
| 43 | +set(PROJECT_VERSION_HEADER_FILE "${CMAKE_CURRENT_LIST_DIR}/include/modest/myosi.h") |
| 44 | + |
| 45 | +file(STRINGS ${PROJECT_VERSION_HEADER_FILE} PROJECT_VERSION_PARTS |
| 46 | +REGEX "^#define[ \t]+MODEST_VERSION_(MAJOR|MINOR|PATCH)[ \t]+[0-9]+$") |
| 47 | + |
| 48 | +list(GET PROJECT_VERSION_PARTS 0 PROJECT_VERSION_MAJOR_PART) |
| 49 | +list(GET PROJECT_VERSION_PARTS 1 PROJECT_VERSION_MINOR_PART) |
| 50 | +list(GET PROJECT_VERSION_PARTS 2 PROJECT_VERSION_PATCH_PART) |
| 51 | + |
| 52 | +string(REGEX REPLACE "#define[ \t]+MODEST_VERSION_MAJOR[ \t]+([0-9]+).*" "\\1" PROJECT_VERSION_MAJOR ${PROJECT_VERSION_MAJOR_PART}) |
| 53 | +string(REGEX REPLACE "#define[ \t]+MODEST_VERSION_MINOR[ \t]+([0-9]+).*" "\\1" PROJECT_VERSION_MINOR ${PROJECT_VERSION_MINOR_PART}) |
| 54 | +string(REGEX REPLACE "#define[ \t]+MODEST_VERSION_PATCH[ \t]+([0-9]+).*" "\\1" PROJECT_VERSION_PATCH ${PROJECT_VERSION_PATCH_PART}) |
| 55 | + |
| 56 | +set(PROJECT_VERSION_STRING "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}") |
| 57 | +message(STATUS "Project version: ${PROJECT_VERSION_STRING}") |
| 58 | + |
| 59 | + |
| 60 | +################ |
| 61 | +## Turn on the ability to create folders to organize projects (.vcproj) |
| 62 | +######################### |
| 63 | +set_property(GLOBAL PROPERTY USE_FOLDERS ON) |
| 64 | + |
| 65 | + |
| 66 | +################ |
| 67 | +## Includes |
| 68 | +######################### |
| 69 | +set(PROJECT_DIR_API_HEADER "${CMAKE_CURRENT_LIST_DIR}/include") |
| 70 | +#file(GLOB_RECURSE PROJECT_PUBLIC_HEADERS ${PROJECT_DIR_API_HEADER}/*.h) |
| 71 | + |
| 72 | + |
| 73 | +################ |
| 74 | +## Sources |
| 75 | +######################### |
| 76 | +MACRO(GET_MODULES_LIST result curdir) |
| 77 | +FILE(GLOB children ${curdir}/ ${curdir}/*) |
| 78 | + SET(dirlist "") |
| 79 | + FOREACH(child ${children}) |
| 80 | + string(REGEX MATCH "\\.[^/]+$" MATCHSTR ${child}) |
| 81 | + IF(IS_DIRECTORY ${child} AND MATCHSTR STREQUAL "") |
| 82 | + string(REGEX MATCH "[^/]+$" MATCHSTR ${child}) |
| 83 | + IF(NOT MATCHSTR STREQUAL "myport") |
| 84 | + LIST(APPEND dirlist ${MATCHSTR}) |
| 85 | + ENDIF() |
| 86 | + ENDIF() |
| 87 | + ENDFOREACH() |
| 88 | + SET(${result} ${dirlist}) |
| 89 | +ENDMACRO() |
| 90 | + |
| 91 | +MACRO(CREATE_MODULES_SOURCE_PATH result dirpath modules) |
| 92 | + SET(dirlist "") |
| 93 | + FOREACH(module ${modules}) |
| 94 | + LIST(APPEND dirlist ${dirpath}/${module}/*.c) |
| 95 | + ENDFOREACH() |
| 96 | + SET(${result} ${dirlist}) |
| 97 | +ENDMACRO() |
| 98 | + |
| 99 | +set(PROJECT_SOURCE "${CMAKE_CURRENT_LIST_DIR}/source") |
| 100 | + |
| 101 | +GET_MODULES_LIST(MODULES ${PROJECT_SOURCE}) |
| 102 | +CREATE_MODULES_SOURCE_PATH(MODULES_PATH ${PROJECT_SOURCE} "${MODULES}") |
| 103 | + |
| 104 | +file(GLOB_RECURSE PROJECT_SOURCES ${MODULES_PATH}) |
| 105 | + |
| 106 | +message(STATUS "Project modules: ${MODULES}") |
| 107 | +#message(STATUS "${PROJECT_SOURCES}") |
| 108 | + |
| 109 | + |
| 110 | +################ |
| 111 | +## Include port based on OS |
| 112 | +######################### |
| 113 | +set(PROJECT_SOURCE_PORT_DIR "${PROJECT_SOURCE}/myport") |
| 114 | + |
| 115 | +if(WIN32) |
| 116 | + file(GLOB_RECURSE PROJECT_SOURCES_PORT ${PROJECT_SOURCE_PORT_DIR}/windows_nt/mycore/*.c ${PROJECT_SOURCE_PORT_DIR}/windows_nt/mycore/*/*.c) |
| 117 | +else() |
| 118 | + file(GLOB_RECURSE PROJECT_SOURCES_PORT ${PROJECT_SOURCE_PORT_DIR}/posix/mycore/*.c ${PROJECT_SOURCE_PORT_DIR}/posix/mycore/utils/*/*.c) |
| 119 | +endif(WIN32) |
| 120 | + |
| 121 | +message(STATUS "Port sources:") |
| 122 | +foreach(__item IN LISTS PROJECT_SOURCES_PORT) |
| 123 | + message(STATUS "${__item}") |
| 124 | +endforeach() |
| 125 | + |
| 126 | + |
| 127 | +################ |
| 128 | +## Target properties |
| 129 | +######################### |
| 130 | +set(PROJECT_PRIVATE_COMPILE_DEFINITIONS "") |
| 131 | +set(PROJECT_INTERFACE_COMPILE_DEFINITIONS "") |
| 132 | +set(PROJECT_INTERFACE_COMPILE_OPTIONS "") |
| 133 | +set(PROJECT_PRIVATE_COMPILE_OPTIONS "") |
| 134 | + |
| 135 | +if (WIN32) |
| 136 | + if(${CMAKE_SIZEOF_VOID_P} EQUAL 8) |
| 137 | + list(APPEND PROJECT_PRIVATE_COMPILE_DEFINITIONS _WIN64) |
| 138 | + else() |
| 139 | + list(APPEND PROJECT_PRIVATE_COMPILE_DEFINITIONS _WIN32) |
| 140 | + endif() |
| 141 | +endif() |
| 142 | + |
| 143 | + |
| 144 | +if(MSVC) |
| 145 | + list(APPEND PROJECT_PRIVATE_COMPILE_DEFINITIONS /wd4100 /wd4255 /wd4820 /wd4668) |
| 146 | + list(APPEND PROJECT_PRIVATE_COMPILE_DEFINITIONS "_CRT_SECURE_NO_WARNINGS") |
| 147 | + list(APPEND PROJECT_PRIVATE_COMPILE_DEFINITIONS "MODEST_BUILD_OS=Windows_NT") |
| 148 | + list(APPEND PROJECT_PRIVATE_COMPILE_DEFINITIONS "MODEST_PORT_NAME=windows_nt") |
| 149 | + list(APPEND PROJECT_PRIVATE_COMPILE_DEFINITIONS "MyCORE_OS_WINDOWS_NT") |
| 150 | + |
| 151 | + list(APPEND PROJECT_INTERFACE_COMPILE_DEFINITIONS "MyCORE_OS_WINDOWS_NT") |
| 152 | +else() |
| 153 | + list(APPEND PROJECT_PRIVATE_COMPILE_OPTIONS -Wall -Werror -pipe -pedantic -Wno-unused-variable -Wno-unused-function) |
| 154 | +endif() |
| 155 | + |
| 156 | +list(APPEND PROJECT_PRIVATE_COMPILE_DEFINITIONS $<$<CONFIG:Debug>:MyCORE_BUILD_DEBUG> $<$<CONFIG:RelWithDebInfo>:MyCORE_BUILD_DEBUG>) |
| 157 | + |
| 158 | +if(MyCORE_BUILD_WITHOUT_THREADS) |
| 159 | + message(STATUS "Build without POSIX Threads") |
| 160 | + list(APPEND PROJECT_PRIVATE_COMPILE_DEFINITIONS "MyCORE_BUILD_WITHOUT_THREADS") |
| 161 | + list(APPEND PROJECT_INTERFACE_COMPILE_DEFINITIONS "MyCORE_BUILD_WITHOUT_THREADS") |
| 162 | +else() |
| 163 | + message(STATUS "Build with POSIX Threads") |
| 164 | +endif() |
| 165 | + |
| 166 | +#message(STATUS "Project private compile definitions: ${PROJECT_PRIVATE_COMPILE_DEFINITIONS}") |
| 167 | + |
| 168 | + |
| 169 | +################ |
| 170 | +## Define targets: static/dynamic library |
| 171 | +######################### |
| 172 | +set(PROJECT_LIB_SHARED "${PROJECT_NAME}_shared") |
| 173 | +set(PROJECT_LIB_STATIC "${PROJECT_NAME}_static") |
| 174 | +set(PROJECT_LIB_SHARED_FILE_NAME "${PROJECT_NAME}") |
| 175 | +if(MSVC) |
| 176 | + set(PROJECT_LIB_STATIC_FILE_NAME "${PROJECT_NAME}_a") |
| 177 | +else() |
| 178 | + set(PROJECT_LIB_STATIC_FILE_NAME "${PROJECT_NAME}") |
| 179 | +endif() |
| 180 | +set(PROJECT_LIBRARY_TARGETS "") |
| 181 | + |
| 182 | + |
| 183 | +if(MODEST_BUILD_SHARED) |
| 184 | + add_library(${PROJECT_LIB_SHARED} SHARED ${PROJECT_SOURCES} ${PROJECT_SOURCES_PORT}) |
| 185 | + set_target_properties(${PROJECT_LIB_SHARED} PROPERTIES OUTPUT_NAME ${PROJECT_LIB_SHARED_FILE_NAME}) |
| 186 | +if (MSVC) |
| 187 | + set_target_properties(${PROJECT_LIB_SHARED} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) |
| 188 | +endif() |
| 189 | + list(APPEND PROJECT_LIBRARY_TARGETS ${PROJECT_LIB_SHARED}) |
| 190 | +endif() |
| 191 | + |
| 192 | +if(MODEST_BUILD_STATIC) |
| 193 | + add_library(${PROJECT_LIB_STATIC} STATIC ${PROJECT_SOURCES} ${PROJECT_SOURCES_PORT}) |
| 194 | + set_target_properties(${PROJECT_LIB_STATIC} PROPERTIES OUTPUT_NAME ${PROJECT_LIB_STATIC_FILE_NAME}) |
| 195 | + list(APPEND PROJECT_LIBRARY_TARGETS ${PROJECT_LIB_STATIC}) |
| 196 | +endif() |
| 197 | + |
| 198 | +foreach(__item IN LISTS PROJECT_LIBRARY_TARGETS) |
| 199 | + set_target_properties(${__item} PROPERTIES VERSION ${PROJECT_VERSION_STRING} SOVERSION ${PROJECT_VERSION_MAJOR}) |
| 200 | +# target_compile_features(${__item} PRIVATE c_std_99) |
| 201 | +# target_compile_features(${__item} PRIVATE cxx_std_11) |
| 202 | + target_compile_definitions(${__item} |
| 203 | + INTERFACE ${PROJECT_INTERFACE_COMPILE_DEFINITIONS} |
| 204 | + PRIVATE ${PROJECT_PRIVATE_COMPILE_DEFINITIONS} |
| 205 | + ) |
| 206 | + target_compile_options(${__item} |
| 207 | +# INTERFACE ${PROJECT_PRIVATE_COMPILE_OPTIONS} |
| 208 | + PRIVATE ${PROJECT_PRIVATE_COMPILE_OPTIONS} |
| 209 | + ) |
| 210 | + target_include_directories(${__item} |
| 211 | + PUBLIC |
| 212 | + $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include> |
| 213 | + $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> # <prefix>/${CMAKE_INSTALL_INCLUDEDIR} |
| 214 | + ) |
| 215 | + target_link_libraries(${__item} |
| 216 | + PRIVATE ${CMAKE_THREAD_LIBS_INIT} |
| 217 | + ) |
| 218 | +endforeach() |
| 219 | + |
| 220 | + |
| 221 | +################ |
| 222 | +## Install |
| 223 | +######################### |
| 224 | +if(NOT MSVC) |
| 225 | + include(GNUInstallDirs) |
| 226 | +endif() |
| 227 | + |
| 228 | +if(NOT DEFINED CMAKE_INSTALL_INCLUDEDIR) |
| 229 | + set(CMAKE_INSTALL_INCLUDEDIR "include") |
| 230 | +endif() |
| 231 | + |
| 232 | +if(NOT DEFINED CMAKE_INSTALL_BINDIR) |
| 233 | + set(CMAKE_INSTALL_BINDIR "bin") |
| 234 | +endif() |
| 235 | + |
| 236 | +if(NOT DEFINED CMAKE_INSTALL_LIBDIR) |
| 237 | + set(CMAKE_INSTALL_LIBDIR "lib") |
| 238 | +endif() |
| 239 | + |
| 240 | +set(MODEST_INSTALL_CONFIGDIR "${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/cmake" CACHE PATH |
| 241 | + "install location of folder with project cmake config files, either relative to CMAKE_INSTALL_PREFIX, or an absolute path") |
| 242 | + |
| 243 | + |
| 244 | +if(MODEST_INSTALL_HEADERS) |
| 245 | + install(DIRECTORY "${PROJECT_DIR_API_HEADER}/" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" FILES_MATCHING PATTERN "*.h") |
| 246 | +endif() |
| 247 | + |
| 248 | +install(TARGETS ${PROJECT_LIBRARY_TARGETS} EXPORT ${PROJECT_NAME} |
| 249 | + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" |
| 250 | + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" |
| 251 | + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" |
| 252 | + #PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" |
| 253 | + #INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" |
| 254 | + ) |
| 255 | + |
| 256 | +#Use this to change the exported target name to be different than the defined target name |
| 257 | +#set_target_properties(modest_shared PROPERTIES EXPORT_NAME Modest_shared) |
| 258 | + |
| 259 | +if(MSVC) |
| 260 | + install(FILES "$<TARGET_PDB_FILE:${PROJECT_LIB_SHARED}>" DESTINATION "${CMAKE_INSTALL_BINDIR}" OPTIONAL) |
| 261 | +endif() |
| 262 | + |
| 263 | + |
| 264 | +#this makes an IMPORTED targets definition file which is specific to the build tree, and is not relocatable |
| 265 | +#export(EXPORT ${PROJECT_NAME} FILE ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.cmake NAMESPACE JSONUtils::) |
| 266 | + |
| 267 | + |
| 268 | +#this makes an IMPORTED targets definition file which is relocatable |
| 269 | +install( |
| 270 | + EXPORT ${PROJECT_NAME} |
| 271 | + NAMESPACE ${PROJECT_NAME}:: |
| 272 | + DESTINATION "${MODEST_INSTALL_CONFIGDIR}" |
| 273 | + FILE ${PROJECT_NAME}.cmake |
| 274 | + CONFIGURATIONS Debug Release |
| 275 | + ) |
| 276 | + |
| 277 | +include(CMakePackageConfigHelpers) |
| 278 | + |
| 279 | +configure_package_config_file( |
| 280 | + ${CMAKE_CURRENT_LIST_DIR}/${PROJECT_NAME}Config.cmake.in |
| 281 | + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake |
| 282 | + INSTALL_DESTINATION ${MODEST_INSTALL_CONFIGDIR} |
| 283 | + PATH_VARS |
| 284 | + MODEST_INSTALL_CONFIGDIR |
| 285 | + ) |
| 286 | + |
| 287 | +write_basic_package_version_file( |
| 288 | + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake |
| 289 | + VERSION ${PROJECT_VERSION_STRING} |
| 290 | + COMPATIBILITY AnyNewerVersion |
| 291 | + ) |
| 292 | + |
| 293 | +#Install the config, configversion and custom find modules |
| 294 | +install(FILES |
| 295 | +# ${CMAKE_CURRENT_LIST_DIR}/cmake/FindRapidJSON.cmake |
| 296 | + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake |
| 297 | + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake |
| 298 | + DESTINATION ${MODEST_INSTALL_CONFIGDIR} |
| 299 | + ) |
| 300 | + |
| 301 | +#Register package in user's package registry |
| 302 | +#export(PACKAGE ${PROJECT_NAME}) |
| 303 | + |
| 304 | + |
| 305 | +#Add an alias so that library can be used inside the build tree, e.g. when testing |
| 306 | +add_library(${PROJECT_NAME}::${PROJECT_LIB_SHARED} ALIAS ${PROJECT_LIB_SHARED}) |
| 307 | +add_library(${PROJECT_NAME}::${PROJECT_LIB_STATIC} ALIAS ${PROJECT_LIB_STATIC}) |
| 308 | + |
| 309 | + |
| 310 | +################ |
| 311 | +## Build a package |
| 312 | +######################### |
| 313 | +set(CPACK_PACKAGE_NAME "${PROJECT_NAME}") |
| 314 | +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Fast C/C++ HTML 5 Renderer. Using threads.") |
| 315 | +set(CPACK_PACKAGE_CONTACT "lex.borisov@gmail.com (Alexander Borisov)") |
| 316 | +set(CPACK_PACKAGE_VENDOR "Alexander Borisov") |
| 317 | + |
| 318 | +set(CPACK_PACKAGE_RELEASE 1) |
| 319 | +set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION_STRING}) |
| 320 | + |
| 321 | +if(${CMAKE_SIZEOF_VOID_P} EQUAL 4) |
| 322 | + set(CPACK_RPM_PACKAGE_ARCHITECTURE i686) |
| 323 | +else() |
| 324 | + set(CPACK_RPM_PACKAGE_ARCHITECTURE x86_64) |
| 325 | +endif() |
| 326 | + |
| 327 | +set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CPACK_PACKAGE_RELEASE}.${CPACK_RPM_PACKAGE_ARCHITECTURE}") |
| 328 | + |
| 329 | +include(CPack) |
0 commit comments