CMakeLists.txt 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. #
  2. # firebird (trunk)
  3. #
  4. # This file has following organization:
  5. # 1. cmake settings
  6. # 2. project settings
  7. # 3. packages
  8. # 4. configure
  9. # 5. compiler & linker settings
  10. # 6. pre-build
  11. # 7. build
  12. #
  13. ################################################################################
  14. #
  15. # cmake settings
  16. #
  17. ################################################################################
  18. cmake_minimum_required(VERSION 2.8.12)
  19. # In-source builds are not possible and so disabled.
  20. if (${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR})
  21. message(FATAL_ERROR
  22. "CMake generation for Firebird is not possible within the source directory!"
  23. "\n Remove the CMakeCache.txt file and try again from another folder, e.g.:"
  24. "\n "
  25. "\n rm CMakeCache.txt"
  26. "\n mkdir build"
  27. "\n cd build"
  28. "\n cmake .."
  29. )
  30. endif()
  31. set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/builds/cmake)
  32. if (NATIVE_BUILD_DIR)
  33. get_filename_component(NATIVE_BUILD_DIR ${NATIVE_BUILD_DIR} ABSOLUTE)
  34. else()
  35. set(NATIVE_BUILD_DIR ${CMAKE_BINARY_DIR})
  36. endif()
  37. # Use solution folders.
  38. set_property(GLOBAL PROPERTY USE_FOLDERS ON)
  39. set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "CMake Targets")
  40. ################################################################################
  41. #
  42. # project settings
  43. #
  44. ################################################################################
  45. project("firebird" C CXX)
  46. ########################################
  47. # build type settings
  48. ########################################
  49. # Define build mode
  50. if (NOT DEFINED CMAKE_BUILD_TYPE OR "${CMAKE_BUILD_TYPE}" STREQUAL "")
  51. set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build.")
  52. endif()
  53. # Qt with MSVC does not have multiconfiguration option by default,
  54. # so we create it.
  55. set(DEFAULT_CONFIGURATION)
  56. # Set build types if none was specified
  57. if (NOT DEFINED CMAKE_CONFIGURATION_TYPES)
  58. set(CMAKE_CONFIGURATION_TYPES Debug Release MinSizeRel RelWithDebInfo)
  59. set(DEFAULT_CONFIGURATION ${CMAKE_BUILD_TYPE})
  60. endif()
  61. ########################################
  62. # Output directory settings
  63. ########################################
  64. set(output_dir ${CMAKE_BINARY_DIR}/${PROJECT_NAME})
  65. set(boot_dir ${CMAKE_BINARY_DIR}/src)
  66. set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${output_dir})
  67. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${output_dir})
  68. if (MSVC OR XCODE)
  69. set(output_dir ${output_dir}/$<CONFIG>)
  70. set(boot_dir ${boot_dir}/$<CONFIG>)
  71. endif()
  72. if (MSVC AND DEFAULT_CONFIGURATION)
  73. foreach(conf ${CMAKE_CONFIGURATION_TYPES})
  74. string(TOUPPER ${conf} conf2)
  75. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${conf2} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${DEFAULT_CONFIGURATION})
  76. endforeach()
  77. endif()
  78. if (XCODE)
  79. foreach(conf ${CMAKE_CONFIGURATION_TYPES})
  80. string(TOUPPER ${conf} conf2)
  81. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${conf2} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${conf}/bin)
  82. endforeach()
  83. elseif (UNIX)
  84. set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${output_dir}/bin)
  85. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${output_dir}/bin)
  86. endif()
  87. ################################################################################
  88. #
  89. # packages
  90. #
  91. ################################################################################
  92. ########################################
  93. # icu
  94. ########################################
  95. if (UNIX)
  96. if (NOT ICU_INCLUDE_DIR)
  97. find_path(ICU_INCLUDE_DIR unicode/ucnv.h
  98. PATHS
  99. /usr/include
  100. /usr/include/x86_64-linux-gnu
  101. /usr/local/include
  102. /opt/local/include
  103. /usr/local/opt/icu4c/include
  104. CMAKE_FIND_ROOT_PATH_BOTH
  105. )
  106. if ("${ICU_INCLUDE_DIR}" STREQUAL "ICU_INCLUDE_DIR-NOTFOUND")
  107. message(FATAL_ERROR "ICU headers not found!")
  108. endif()
  109. endif()
  110. if (CMAKE_CROSSCOMPILING)
  111. execute_process(COMMAND ${CMAKE_COMMAND} -E copy_directory
  112. ${ICU_INCLUDE_DIR}/unicode
  113. ${CMAKE_BINARY_DIR}/unicode
  114. )
  115. set(ICU_INCLUDE_DIR ${CMAKE_BINARY_DIR})
  116. endif()
  117. set(ICU_INCLUDE_DIRS ${ICU_INCLUDE_DIR})
  118. include_directories(${ICU_INCLUDE_DIRS})
  119. endif()
  120. ################################################################################
  121. #
  122. # configure
  123. #
  124. ################################################################################
  125. include(Configure)
  126. if (FREEBSD)
  127. # temporary
  128. set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR})
  129. endif()
  130. set(FB_PREFIX ${CMAKE_INSTALL_PREFIX}/${PROJECT_NAME})
  131. set(FB_IPC_NAME "FirebirdIPI")
  132. set(FB_LOGFILENAME "firebird.log")
  133. set(FB_PIPE_NAME "interbas")
  134. set(FB_SERVICE_NAME "gds_db")
  135. set(FB_SERVICE_PORT 3050)
  136. if (WIN32)
  137. set(FB_PREFIX "c:\\\\Program Files\\\\Firebird\\\\")
  138. set(FB_IPC_NAME "FIREBIRD")
  139. endif()
  140. set(AUTOCONFIG_SRC ${CMAKE_SOURCE_DIR}/src/include/gen/autoconfig.h.in)
  141. set(AUTOCONFIG ${CMAKE_BINARY_DIR}/src/include/gen/autoconfig.h)
  142. configure_file(${AUTOCONFIG_SRC} ${AUTOCONFIG} @ONLY)
  143. ################################################################################
  144. #
  145. # compiler & linker settings
  146. #
  147. ################################################################################
  148. add_definitions(-DDEV_BUILD)
  149. if (WIN32)
  150. set(OS_DIR win32)
  151. set(VERSION_RC ${CMAKE_SOURCE_DIR}/src/jrd/version.rc)
  152. if (MSVC)
  153. set(disable_msvc_warnings "/wd4996")
  154. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /MP ${disable_msvc_warnings}")
  155. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP ${disable_msvc_warnings}")
  156. if (MSVC_STATIC_RUNTIME)
  157. set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /MTd")
  158. set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MT")
  159. set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
  160. set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
  161. endif()
  162. endif(MSVC)
  163. set(LIB_Ws2_32 Ws2_32)
  164. set(LIB_comctl32 comctl32)
  165. set(LIB_mpr mpr)
  166. set(LIB_version version)
  167. endif(WIN32)
  168. if (MINGW)
  169. # clear unix-style prefixes
  170. set(CMAKE_SHARED_LIBRARY_PREFIX)
  171. set(CMAKE_SHARED_MODULE_PREFIX)
  172. set(CMAKE_STATIC_LIBRARY_PREFIX)
  173. add_definitions(-D_WIN32_WINNT=0x0600)
  174. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4 -std=c++11")
  175. endif()
  176. if (UNIX)
  177. set(OS_DIR posix)
  178. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
  179. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -msse4 -std=c++11")
  180. if (NOT CMAKE_CROSSCOMPILING)
  181. set(LIB_readline readline)
  182. endif()
  183. if (NOT FREEBSD)
  184. set(LIB_dl dl)
  185. endif()
  186. endif()
  187. if (NOT LINUX AND (CLANG OR IOS))
  188. set(LIB_iconv iconv)
  189. endif()
  190. if (FREEBSD OR APPLE)
  191. include_directories(/usr/local/include)
  192. link_directories(/usr/local/lib)
  193. endif()
  194. if (APPLE)
  195. set(OS_DIR darwin)
  196. if (NOT CMAKE_CROSSCOMPILING)
  197. include_directories(/opt/local/include)
  198. link_directories(/opt/local/lib)
  199. link_directories(/usr/local/opt/icu4c/lib)
  200. endif()
  201. find_library(LIB_CoreFoundation CoreFoundation)
  202. elseif (UNIX)
  203. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pthread")
  204. endif()
  205. ################################################################################
  206. #
  207. # pre-build
  208. #
  209. ################################################################################
  210. if (WIN32)
  211. # icu
  212. if (NOT ICU_EXTRACT)
  213. message(STATUS "Extracting pre-built ICU")
  214. set(ICU_EXTRACT ${CMAKE_CURRENT_SOURCE_DIR}/extern/icu/icu.exe -y
  215. CACHE STRING "ICU extraction variable")
  216. execute_process(COMMAND ${ICU_EXTRACT})
  217. endif()
  218. # determine icu version
  219. foreach(v RANGE 63 83)
  220. if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/extern/icu/icudt${v}l.dat)
  221. set(ICU_VERSION ${v} CACHE STRING "ICU version")
  222. endif()
  223. endforeach()
  224. # zlib
  225. if (NOT ZLIB_EXTRACT)
  226. message(STATUS "Extracting pre-built zlib")
  227. set(ZLIB_EXTRACT ${CMAKE_CURRENT_SOURCE_DIR}/extern/zlib/zlib.exe -y
  228. CACHE STRING "zlib extraction variable")
  229. execute_process(COMMAND ${ZLIB_EXTRACT})
  230. endif()
  231. endif()
  232. if (UNIX)
  233. file(GLOB vers_src "${CMAKE_SOURCE_DIR}/builds/posix/*.vers")
  234. foreach(f ${vers_src})
  235. get_filename_component(name ${f} NAME)
  236. set(name ${CMAKE_BINARY_DIR}/builds/posix/${name})
  237. if (AIX)
  238. file(WRITE ${name} "#!\n")
  239. elseif (LINUX)
  240. file(WRITE ${name} "{\nglobal:\n")
  241. endif()
  242. file(STRINGS ${f} strings)
  243. foreach(s ${strings})
  244. string(REGEX REPLACE "#.*$" "" s "${s}")
  245. string(STRIP "${s}" s)
  246. if (NOT "${s}" STREQUAL "")
  247. if (AIX)
  248. file(APPEND ${name} "\t${s}\n")
  249. elseif (APPLE)
  250. file(APPEND ${name} "\t_${s}\n")
  251. elseif (HPUX)
  252. file(APPEND ${name} "+e ${s}\n")
  253. else()
  254. file(APPEND ${name} "\t${s};\n")
  255. endif()
  256. endif()
  257. endforeach()
  258. if (LINUX)
  259. file(APPEND ${name} "local:\n\t*;\n};\n")
  260. endif()
  261. endforeach()
  262. endif()
  263. ################################################################################
  264. #
  265. # build
  266. #
  267. ################################################################################
  268. include(BuildFunctions)
  269. if (NOT CMAKE_CROSSCOMPILING)
  270. create_boot_commands()
  271. create_master_commands()
  272. endif() # if (NOT CMAKE_CROSSCOMPILING)
  273. crosscompile_prebuild_steps()
  274. include_directories("extern/libtommath")
  275. include_directories("extern/libtomcrypt/src/headers")
  276. include_directories("extern/decNumber")
  277. include_directories("extern/icu/include")
  278. include_directories("extern/zlib")
  279. include_directories("src/include")
  280. include_directories("src/include/gen")
  281. include_directories("${CMAKE_CURRENT_BINARY_DIR}/src/include")
  282. include_directories("${CMAKE_CURRENT_BINARY_DIR}/src/include/gen")
  283. ########################################
  284. # LIBRARY libtommath
  285. ########################################
  286. file(GLOB libtommath_src "extern/libtommath/*.c" "extern/libtommath/*.h")
  287. add_library (libtommath ${libtommath_src})
  288. project_group (libtommath Extern)
  289. ########################################
  290. # LIBRARY libtomcrypt
  291. ########################################
  292. file(GLOB_RECURSE libtomcrypt_src "extern/libtomcrypt/src/*")
  293. list(FILTER libtomcrypt_src EXCLUDE REGEX ".*aes_tab.c")
  294. list(FILTER libtomcrypt_src EXCLUDE REGEX ".*whirltab.c")
  295. list(FILTER libtomcrypt_src EXCLUDE REGEX ".*sober128tab.c")
  296. add_library (libtomcrypt ${libtomcrypt_src})
  297. target_compile_definitions (libtomcrypt PRIVATE LTC_NO_ROLC LTC_SOURCE)
  298. project_group (libtomcrypt Extern)
  299. ########################################
  300. # LIBRARY decNumber
  301. ########################################
  302. file(GLOB_RECURSE decNumber_src "extern/decNumber/*.c" "extern/decNumber/*.h")
  303. list(FILTER decNumber_src EXCLUDE REGEX ".*decBasic.c")
  304. list(FILTER decNumber_src EXCLUDE REGEX ".*decCommon.c")
  305. add_library (decNumber ${decNumber_src})
  306. project_group (decNumber Extern)
  307. ########################################
  308. # EXECUTABLE btyacc
  309. ########################################
  310. file(GLOB btyacc_src "extern/btyacc/*.c" "extern/btyacc/*.h")
  311. if (NOT CMAKE_CROSSCOMPILING)
  312. add_executable (btyacc ${btyacc_src})
  313. project_group (btyacc Extern)
  314. set_output_directory (btyacc . CURRENT_DIR)
  315. endif() # if (NOT CMAKE_CROSSCOMPILING)
  316. ########################################
  317. # EXECUTABLE cloop
  318. ########################################
  319. file(GLOB cloop_src "extern/cloop/src/cloop/*.cpp" "extern/cloop/src/cloop/*.h")
  320. add_executable (cloop ${cloop_src})
  321. project_group (cloop Extern)
  322. ########################################
  323. # subdirectories
  324. ########################################
  325. add_subdirectory("examples")
  326. add_subdirectory("src")
  327. ################################################################################