CMakeLists.txt 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  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. endif()
  175. if (UNIX)
  176. set(OS_DIR posix)
  177. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
  178. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -msse4 -std=c++11")
  179. if (NOT CMAKE_CROSSCOMPILING)
  180. set(LIB_readline readline)
  181. endif()
  182. if (NOT FREEBSD)
  183. set(LIB_dl dl)
  184. endif()
  185. endif()
  186. if (NOT LINUX AND (CLANG OR IOS))
  187. set(LIB_iconv iconv)
  188. endif()
  189. if (FREEBSD OR APPLE)
  190. include_directories(/usr/local/include)
  191. link_directories(/usr/local/lib)
  192. endif()
  193. if (APPLE)
  194. set(OS_DIR darwin)
  195. if (NOT CMAKE_CROSSCOMPILING)
  196. include_directories(/opt/local/include)
  197. link_directories(/opt/local/lib)
  198. link_directories(/usr/local/opt/icu4c/lib)
  199. endif()
  200. find_library(LIB_CoreFoundation CoreFoundation)
  201. elseif (UNIX)
  202. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pthread")
  203. endif()
  204. ################################################################################
  205. #
  206. # pre-build
  207. #
  208. ################################################################################
  209. if (WIN32)
  210. # icu
  211. if (NOT ICU_EXTRACT)
  212. message(STATUS "Extracting pre-built ICU")
  213. set(ICU_EXTRACT ${CMAKE_CURRENT_SOURCE_DIR}/extern/icu/icu.exe -y
  214. CACHE STRING "ICU extraction variable")
  215. execute_process(COMMAND ${ICU_EXTRACT})
  216. endif()
  217. # zlib
  218. if (NOT ZLIB_EXTRACT)
  219. message(STATUS "Extracting pre-built zlib")
  220. set(ZLIB_EXTRACT ${CMAKE_CURRENT_SOURCE_DIR}/extern/zlib/zlib.exe -y
  221. CACHE STRING "zlib extraction variable")
  222. execute_process(COMMAND ${ZLIB_EXTRACT})
  223. endif()
  224. endif()
  225. if (UNIX)
  226. file(GLOB vers_src "${CMAKE_SOURCE_DIR}/builds/posix/*.vers")
  227. foreach(f ${vers_src})
  228. get_filename_component(name ${f} NAME)
  229. set(name ${CMAKE_BINARY_DIR}/builds/posix/${name})
  230. if (AIX)
  231. file(WRITE ${name} "#!\n")
  232. elseif (LINUX)
  233. file(WRITE ${name} "{\nglobal:\n")
  234. endif()
  235. file(STRINGS ${f} strings)
  236. foreach(s ${strings})
  237. string(REGEX REPLACE "#.*$" "" s "${s}")
  238. string(STRIP "${s}" s)
  239. if (NOT "${s}" STREQUAL "")
  240. if (AIX)
  241. file(APPEND ${name} "\t${s}\n")
  242. elseif (APPLE)
  243. file(APPEND ${name} "\t_${s}\n")
  244. elseif (HPUX)
  245. file(APPEND ${name} "+e ${s}\n")
  246. else()
  247. file(APPEND ${name} "\t${s};\n")
  248. endif()
  249. endif()
  250. endforeach()
  251. if (LINUX)
  252. file(APPEND ${name} "local:\n\t*;\n};\n")
  253. endif()
  254. endforeach()
  255. endif()
  256. ################################################################################
  257. #
  258. # build
  259. #
  260. ################################################################################
  261. include(BuildFunctions)
  262. if (NOT CMAKE_CROSSCOMPILING)
  263. create_boot_commands()
  264. create_master_commands()
  265. endif() # if (NOT CMAKE_CROSSCOMPILING)
  266. crosscompile_prebuild_steps()
  267. include_directories("extern/libtommath")
  268. include_directories("extern/libtomcrypt/src/headers")
  269. include_directories("extern/decNumber")
  270. include_directories("extern/icu/include")
  271. include_directories("extern/zlib")
  272. include_directories("src/include")
  273. include_directories("src/include/gen")
  274. include_directories("${CMAKE_CURRENT_BINARY_DIR}/src/include")
  275. include_directories("${CMAKE_CURRENT_BINARY_DIR}/src/include/gen")
  276. ########################################
  277. # LIBRARY libtommath
  278. ########################################
  279. file(GLOB libtommath_src "extern/libtommath/*.c" "extern/libtommath/*.h")
  280. add_library (libtommath ${libtommath_src})
  281. project_group (libtommath Extern)
  282. ########################################
  283. # LIBRARY libtomcrypt
  284. ########################################
  285. file(GLOB_RECURSE libtomcrypt_src "extern/libtomcrypt/src/*")
  286. list(FILTER libtomcrypt_src EXCLUDE REGEX ".*aes_tab.c")
  287. list(FILTER libtomcrypt_src EXCLUDE REGEX ".*whirltab.c")
  288. list(FILTER libtomcrypt_src EXCLUDE REGEX ".*sober128tab.c")
  289. add_library (libtomcrypt ${libtomcrypt_src})
  290. target_compile_definitions (libtomcrypt PRIVATE LTC_NO_ROLC)
  291. project_group (libtomcrypt Extern)
  292. ########################################
  293. # LIBRARY decNumber
  294. ########################################
  295. file(GLOB_RECURSE decNumber_src "extern/decNumber/*.c" "extern/decNumber/*.h")
  296. list(FILTER decNumber_src EXCLUDE REGEX ".*decBasic.c")
  297. list(FILTER decNumber_src EXCLUDE REGEX ".*decCommon.c")
  298. add_library (decNumber ${decNumber_src})
  299. project_group (decNumber Extern)
  300. ########################################
  301. # EXECUTABLE btyacc
  302. ########################################
  303. file(GLOB btyacc_src "extern/btyacc/*.c" "extern/btyacc/*.h")
  304. if (NOT CMAKE_CROSSCOMPILING)
  305. add_executable (btyacc ${btyacc_src})
  306. project_group (btyacc Extern)
  307. set_output_directory (btyacc . CURRENT_DIR)
  308. endif() # if (NOT CMAKE_CROSSCOMPILING)
  309. ########################################
  310. # EXECUTABLE cloop
  311. ########################################
  312. file(GLOB cloop_src "extern/cloop/src/cloop/*.cpp" "extern/cloop/src/cloop/*.h")
  313. add_executable (cloop ${cloop_src})
  314. project_group (cloop Extern)
  315. ########################################
  316. # subdirectories
  317. ########################################
  318. add_subdirectory("examples")
  319. add_subdirectory("src")
  320. ################################################################################