CMakeLists.txt 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  1. project(kamailio_utils)
  2. get_property(FINAL_MODULES_LIST GLOBAL PROPERTY ADDED_MODULES_LIST)
  3. set(BIN_DIR "${CMAKE_INSTALL_FULL_SBINDIR}")
  4. set(LIB_DIR "${CMAKE_INSTALL_FULL_LIBDIR}/${MAIN_NAME}")
  5. set(CFG_DIR "${CMAKE_INSTALL_FULL_SYSCONFDIR}/${MAIN_NAME}")
  6. set(SHARE_DIR "${CMAKE_INSTALL_FULL_DATADIR}/${MAIN_NAME}")
  7. set(KAMCTL_BASE_FILES kamctl.base kamctl.ctlbase kamctl.rpcfifo kamctl.ser kamctl.sqlbase)
  8. if("db_berkeley" IN_LIST FINAL_MODULES_LIST)
  9. set(KAMCTL_DB_FILES ${KAMCTL_DB_FILES} kamctl.db_berkeley)
  10. endif()
  11. if("db_text" IN_LIST FINAL_MODULES_LIST)
  12. set(KAMCTL_DB_FILES ${KAMCTL_DB_FILES} kamctl.dbtext)
  13. endif()
  14. if("db_mysql" IN_LIST FINAL_MODULES_LIST)
  15. set(KAMCTL_DB_FILES ${KAMCTL_DB_FILES} kamctl.mysql)
  16. endif()
  17. if("db_oracle" IN_LIST FINAL_MODULES_LIST)
  18. set(KAMCTL_DB_FILES ${KAMCTL_DB_FILES} kamctl.oracle)
  19. endif()
  20. if("db_postgres" IN_LIST FINAL_MODULES_LIST)
  21. set(KAMCTL_DB_FILES ${KAMCTL_DB_FILES} kamctl.pgsql)
  22. endif()
  23. if("db_sqlite" IN_LIST FINAL_MODULES_LIST)
  24. set(KAMCTL_DB_FILES ${KAMCTL_DB_FILES} kamctl.sqlite)
  25. endif()
  26. # Create the depependencies list for the target kamctl
  27. set(KAMCTL_DEPENDENCIES "")
  28. # Install kamctl.base and the rest
  29. foreach(file IN LISTS KAMCTL_BASE_FILES KAMCTL_DB_FILES)
  30. # Append to the depependencies list for the target kamctl
  31. list(APPEND KAMCTL_DEPENDENCIES "${CMAKE_CURRENT_BINARY_DIR}/${file}")
  32. # Process the file with sed and install it
  33. add_custom_command(
  34. OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${file}"
  35. COMMAND sed -e "s#/usr/local/sbin#${BIN_DIR}#g" < ${CMAKE_CURRENT_SOURCE_DIR}/${file} >
  36. ${CMAKE_CURRENT_BINARY_DIR}/${file}
  37. COMMENT "Processed ${file} with sed"
  38. )
  39. install(
  40. PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${file}
  41. DESTINATION ${CMAKE_INSTALL_LIBDIR}/${MAIN_NAME}/kamctl
  42. COMPONENT kamailio-utils-bin
  43. )
  44. endforeach()
  45. # Kamctl target to depend on all kamctl files
  46. # Install kamctl and it's database files
  47. add_custom_target(
  48. kamctl ALL
  49. COMMAND
  50. sed -e "s#/usr/local/sbin#${BIN_DIR}#g" -e "s#/usr/local/lib/kamailio#${LIB_DIR}#g" -e
  51. "s#/usr/local/etc/kamailio#${CFG_DIR}#g" < ${CMAKE_CURRENT_SOURCE_DIR}/kamctl >
  52. ${CMAKE_CURRENT_BINARY_DIR}/kamctl
  53. DEPENDS ${KAMCTL_DEPENDENCIES}
  54. COMMENT "Build kamctl and its dependencies"
  55. )
  56. install(
  57. PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/kamctl
  58. DESTINATION ${CMAKE_INSTALL_SBINDIR}
  59. COMPONENT kamailio-utils-bin
  60. )
  61. # Setup and install kamdbctl stuff
  62. set(KAMDBCTL_BASE_FILES kamdbctl.base)
  63. if("db_berkeley" IN_LIST FINAL_MODULES_LIST)
  64. set(KAMDBCTL_DB_FILES ${KAMDBCTL_DB_FILES} kamdbctl.db_berkeley)
  65. endif()
  66. if("db_text" IN_LIST FINAL_MODULES_LIST)
  67. set(KAMDBCTL_DB_FILES ${KAMDBCTL_DB_FILES} kamdbctl.dbtext)
  68. install(PROGRAMS dbtextdb/dbtextdb.py
  69. DESTINATION ${CMAKE_INSTALL_LIBDIR}/${MAIN_NAME}/kamctl/dbtextdb
  70. )
  71. endif()
  72. if("db_mysql" IN_LIST FINAL_MODULES_LIST)
  73. set(KAMDBCTL_DB_FILES ${KAMDBCTL_DB_FILES} kamdbctl.mysql)
  74. endif()
  75. if("db_oracle" IN_LIST FINAL_MODULES_LIST)
  76. set(KAMDBCTL_DB_FILES ${KAMDBCTL_DB_FILES} kamdbctl.oracle kamdbfunc.oracle)
  77. endif()
  78. if("db_postgres" IN_LIST FINAL_MODULES_LIST)
  79. set(KAMDBCTL_DB_FILES ${KAMDBCTL_DB_FILES} kamdbctl.pgsql)
  80. endif()
  81. if("db_sqlite" IN_LIST FINAL_MODULES_LIST)
  82. set(KAMDBCTL_DB_FILES ${KAMDBCTL_DB_FILES} kamdbctl.sqlite)
  83. endif()
  84. # Install kamdbctl
  85. set(KAMDB_DEPENDENCIES "")
  86. foreach(file IN LISTS KAMDBCTL_BASE_FILES KAMDBCTL_DB_FILES)
  87. list(APPEND KAMDB_DEPENDENCIES "${CMAKE_CURRENT_BINARY_DIR}/${file}")
  88. # Install db setup base script
  89. add_custom_command(
  90. OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${file}"
  91. COMMAND
  92. sed -e "s#/usr/local/sbin#${BIN_DIR}#g" -e "s#/usr/local/etc/kamailio#${CFG_DIR}#g" -e
  93. "s#/usr/local/share/kamailio#${SHARE_DIR}#g" < ${CMAKE_CURRENT_SOURCE_DIR}/${file} >
  94. ${CMAKE_CURRENT_BINARY_DIR}/${file}
  95. COMMENT "Processed ${file}"
  96. )
  97. install(
  98. PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${file}
  99. DESTINATION ${CMAKE_INSTALL_LIBDIR}/${MAIN_NAME}/kamctl
  100. COMPONENT kamailio-utils-bin
  101. )
  102. endforeach()
  103. add_custom_target(
  104. kamdbctl ALL
  105. COMMAND
  106. sed -e "s#/usr/local/sbin#${BIN_DIR}#g" -e "s#/usr/local/lib/kamailio#${LIB_DIR}#g" -e
  107. "s#/usr/local/etc/kamailio#${CFG_DIR}#g" < ${CMAKE_CURRENT_SOURCE_DIR}/kamdbctl >
  108. ${CMAKE_CURRENT_BINARY_DIR}/kamdbctl
  109. DEPENDS ${KAMDB_DEPENDENCIES}
  110. COMMENT "Build kamdbctl and its dependencies"
  111. )
  112. install(
  113. PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/kamdbctl
  114. DESTINATION ${CMAKE_INSTALL_SBINDIR}
  115. COMPONENT kamailio-utils-bin
  116. )
  117. # Install the configuration file (kamctlrc) using a CODE block to check
  118. # existence at install time instead of configure time
  119. install(
  120. CODE "
  121. set(dir \"\$ENV{DESTDIR}${CMAKE_INSTALL_FULL_SYSCONFDIR}/${MAIN_NAME}\")
  122. if(EXISTS \"\${dir}/kamctlrc\")
  123. message(STATUS \"kamctlrc already exists in\${dir}/kamctlrc.
  124. Installing as kamctlrc.sample\")
  125. file(INSTALL \"${CMAKE_CURRENT_SOURCE_DIR}/kamctlrc\"
  126. DESTINATION \"${CMAKE_INSTALL_FULL_SYSCONFDIR}/${MAIN_NAME}\"
  127. RENAME \"kamctlrc.sample\"
  128. PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
  129. )
  130. else()
  131. file(INSTALL \"${CMAKE_CURRENT_SOURCE_DIR}/kamctlrc\"
  132. DESTINATION \"${CMAKE_INSTALL_FULL_SYSCONFDIR}/${MAIN_NAME}\"
  133. PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ)
  134. endif()
  135. "
  136. COMPONENT kamailio-utils-cfg
  137. )
  138. # Man pages generation and installation
  139. add_custom_command(
  140. OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/kamctl.8
  141. COMMAND
  142. sed -e
  143. "s#/etc/${CFG_NAME}/${CFG_NAME}\.cfg#${CMAKE_INSTALL_FULL_SYSCONFDIR}/${MAIN_NAME}/${MAIN_NAME}.cfg#g"
  144. -e "s#/usr/sbin/#${CMAKE_INSTALL_FULL_SBINDIR}/#g" -e
  145. "s#/usr/lib/${CFG_NAME}/modules/#${CMAKE_INSTALL_FULL_LIBDIR}/${MAIN_NAME}/#g" -e
  146. "s#/usr/share/doc/${CFG_NAME}/#${CMAKE_INSTALL_FULL_DOCDIR}/#g" <
  147. ${CMAKE_CURRENT_SOURCE_DIR}/kamctl.8 > ${CMAKE_CURRENT_BINARY_DIR}/kamctl.8
  148. DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/kamctl.8
  149. )
  150. add_custom_command(
  151. OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/kamdbctl.8
  152. COMMAND
  153. sed -e
  154. "s#/etc/${CFG_NAME}/${CFG_NAME}\.cfg#${CMAKE_INSTALL_FULL_SYSCONFDIR}/${MAIN_NAME}/${MAIN_NAME}.cfg#g"
  155. -e "s#/usr/sbin/#${CMAKE_INSTALL_FULL_SBINDIR}/#g" -e
  156. "s#/usr/lib/${CFG_NAME}/modules/#${CMAKE_INSTALL_FULL_LIBDIR}/${MAIN_NAME}/#g" -e
  157. "s#/usr/share/doc/${CFG_NAME}/#${CMAKE_INSTALL_FULL_DOCDIR}/#g" <
  158. ${CMAKE_CURRENT_SOURCE_DIR}/kamdbctl.8 > ${CMAKE_CURRENT_BINARY_DIR}/kamdbctl.8
  159. DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/kamdbctl.8
  160. )
  161. add_custom_target(
  162. kamctl_man DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/kamctl.8 ${CMAKE_CURRENT_BINARY_DIR}/kamdbctl.8
  163. )
  164. install(
  165. FILES ${CMAKE_CURRENT_BINARY_DIR}/kamctl.8 ${CMAKE_CURRENT_BINARY_DIR}/kamdbctl.8
  166. DESTINATION ${CMAKE_INSTALL_MANDIR}/man8
  167. COMPONENT kamailio_man
  168. OPTIONAL
  169. )
  170. # Install targets
  171. # Custom target for installing the kamailio-cfg component
  172. add_custom_target(
  173. install-kamailio-utils-cfg
  174. COMMAND ${CMAKE_COMMAND} --install ${CMAKE_BINARY_DIR} --component kamailio-utils-cfg
  175. COMMENT "Installing kamailio-utils-cfg component"
  176. )
  177. # Custom target for installing the kamailio-utils-bin component
  178. add_custom_target(
  179. install-kamailio-utils-bin
  180. COMMAND ${CMAKE_COMMAND} --install ${CMAKE_BINARY_DIR} --component kamailio-utils-bin
  181. COMMENT "Installing kamailio-utils-bin component"
  182. DEPENDS kamctl kamdbctl
  183. )
  184. # Custom target for installing the kamailio-utils component
  185. add_custom_target(install-kamailio-utils COMMENT "Installing utils components")
  186. add_dependencies(install-kamailio-utils install-kamailio-utils-cfg install-kamailio-utils-bin)
  187. # ----------
  188. # ----------
  189. # dbschema target: Old Makefiles: make dbschema declared in src/ Makefile This
  190. # was using the makefile found in src/lib/srdb1/schema folder.
  191. #
  192. # TODO: Revise where we want the target declared. New CMakelists.txt Declare the
  193. # target in srdb1 CMakeLists.txt file.
  194. find_program(XSLTPROC_EXECUTABLE xsltproc QUIET)
  195. if(NOT XSLTPROC_EXECUTABLE)
  196. message(STATUS "xsltproc is not found. Skip dbschema target.")
  197. else()
  198. option(XSLT_VALIDATE, "Enable schema validation during XSL transformations" ON)
  199. option(XSLT_VERBOSE, "Enable verbose output for XSL transformations" OFF)
  200. set(XSLTPROC_FLAGS --xinclude)
  201. if(NOT ${XSLT_VALIDATE})
  202. set(XSLTPROC_FLAGS ${XSLTPROC_FLAGS} --novalid)
  203. endif()
  204. if(${XSLT_VERBOSE})
  205. set(XSLTPROC_FLAGS ${XSLTPROC_FLAGS} --verbose)
  206. endif()
  207. # Set the root directories
  208. set(ROOTDIR ${CMAKE_SOURCE_DIR})
  209. set(STYLESHEETS ${ROOTDIR}/doc/stylesheets/dbschema_k/xsl)
  210. set(CATALOG ${ROOTDIR}/doc/stylesheets/dbschema_k/catalog.xml)
  211. # List of XML files
  212. file(GLOB TABLES "${CMAKE_SOURCE_DIR}/src/lib/srdb1/schema/kamailio-*.xml")
  213. # message(WARNING "TABLES : ${TABLES}")
  214. set(EXTRACTED_TABLES "")
  215. foreach(table ${TABLES})
  216. get_filename_component(TABLE_NAME "${table}" NAME)
  217. string(REPLACE "kamailio-" "" TABLE_NAME "${TABLE_NAME}")
  218. string(REPLACE ".xml" "" TABLE_NAME "${TABLE_NAME}")
  219. list(APPEND EXTRACTED_TABLES "${TABLE_NAME}")
  220. endforeach()
  221. # Output the extracted table names
  222. if(VERBOSE)
  223. message(STATUS "Extracted Tables for DB schema generation: ${EXTRACTED_TABLES}")
  224. endif()
  225. # Function to add a target for each database type prefix with dbschema ie
  226. # db_name = redis -> target = dbschema_redis
  227. function(add_db_target db_name xsl_file)
  228. # Change name for the folder
  229. if(db_name STREQUAL "pi_framework_table" OR db_name STREQUAL "pi_framework_mod")
  230. set(db_name_folder xhttp_pi)
  231. else()
  232. set(db_name_folder ${db_name})
  233. endif()
  234. add_custom_target(
  235. dbschema_${db_name}
  236. COMMAND ${CMAKE_COMMAND} -E make_directory "${db_name_folder}"
  237. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  238. COMMENT "Creating schemas for ${db_name}"
  239. )
  240. # Loop through each table and add a command for xsltproc
  241. foreach(table ${EXTRACTED_TABLES})
  242. # Determine the prefix based on db_name
  243. if(db_name STREQUAL "db_berkeley"
  244. OR db_name STREQUAL "db_redis"
  245. OR db_name STREQUAL "dbtext"
  246. OR db_name STREQUAL "mongodb"
  247. )
  248. set(prefix '')
  249. set(folder_suffix "${MAIN_NAME}")
  250. else()
  251. set(prefix "${table}-")
  252. set(folder_suffix '')
  253. endif()
  254. add_custom_command(
  255. TARGET dbschema_${db_name}
  256. PRE_BUILD
  257. COMMAND
  258. XML_CATALOG_FILES=${CATALOG} ${XSLTPROC_EXECUTABLE} ${XSLTPROC_FLAGS} --stringparam dir
  259. ${CMAKE_CURRENT_BINARY_DIR}/${db_name_folder}/${folder_suffix} --stringparam prefix
  260. ${prefix} --stringparam db ${db_name} ${xsl_file} "kamailio-${table}.xml"
  261. WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/src/lib/srdb1/schema"
  262. COMMENT "Processing ${table} for ${db_name}"
  263. )
  264. endforeach()
  265. # Before installing, ensure the target is built `dbschema_${db_name}`
  266. install(
  267. DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${db_name_folder}
  268. DESTINATION ${CMAKE_INSTALL_DATADIR}/${MAIN_NAME}
  269. OPTIONAL
  270. )
  271. add_custom_target(
  272. dbschema_${db_name}_clean
  273. COMMAND ${CMAKE_COMMAND} -E remove_directory "${CMAKE_CURRENT_BINARY_DIR}/${db_name_folder}"
  274. COMMENT "Cleaning ${db_name} schema files"
  275. )
  276. endfunction()
  277. # Add targets for each database type
  278. add_custom_target(dbschema COMMENT "Generating schemas for all dbs...")
  279. add_custom_target(dbschema_clean COMMENT "Cleaning schemas for all dbs...")
  280. # Pi framework targets should combined into one
  281. if("xhttp_pi" IN_LIST FINAL_MODULES_LIST)
  282. add_db_target(pi_framework_table "${STYLESHEETS}/pi_framework_table.xsl")
  283. add_db_target(pi_framework_mod "${STYLESHEETS}/pi_framework_mod.xsl")
  284. add_custom_target(dbschema_xhttp_pi)
  285. add_dependencies(dbschema_xhttp_pi dbschema_pi_framework_table dbschema_pi_framework_mod)
  286. add_custom_target(dbschema_xhttp_pi_clean)
  287. add_dependencies(
  288. dbschema_xhttp_pi dbschema_pi_framework_table_clean dbschema_pi_framework_mod_clean
  289. )
  290. add_dependencies(dbschema dbschema_pi_framework_table dbschema_pi_framework_mod)
  291. add_dependencies(
  292. dbschema_clean dbschema_pi_framework_table_clean dbschema_pi_framework_mod_clean
  293. )
  294. endif()
  295. if("db_mysql" IN_LIST FINAL_MODULES_LIST)
  296. add_db_target(mysql "${STYLESHEETS}/mysql.xsl")
  297. add_dependencies(dbschema dbschema_mysql)
  298. add_dependencies(dbschema_clean dbschema_mysql_clean)
  299. endif()
  300. if("db_postgres" IN_LIST FINAL_MODULES_LIST)
  301. add_db_target(postgres "${STYLESHEETS}/postgres.xsl")
  302. add_dependencies(dbschema dbschema_postgres)
  303. add_dependencies(dbschema_clean dbschema_postgres_clean)
  304. endif()
  305. if("db_oracle" IN_LIST FINAL_MODULES_LIST)
  306. add_db_target(oracle "${STYLESHEETS}/oracle.xsl")
  307. add_dependencies(dbschema dbschema_oracle)
  308. add_dependencies(dbschema_clean dbschema_oracle_clean)
  309. endif()
  310. if("db_text" IN_LIST FINAL_MODULES_LIST)
  311. add_db_target(dbtext "${STYLESHEETS}/dbtext.xsl")
  312. add_dependencies(dbschema dbschema_dbtext)
  313. add_dependencies(dbschema_clean dbschema_dbtext_clean)
  314. endif()
  315. if("db_berkeley" IN_LIST FINAL_MODULES_LIST)
  316. add_db_target(db_berkeley "${STYLESHEETS}/db_berkeley.xsl")
  317. add_dependencies(dbschema dbschema_db_berkeley)
  318. add_dependencies(dbschema_clean dbschema_db_berkeley_clean)
  319. endif()
  320. if("db_sqlite" IN_LIST FINAL_MODULES_LIST)
  321. add_db_target(db_sqlite "${STYLESHEETS}/db_sqlite.xsl")
  322. add_dependencies(dbschema dbschema_db_sqlite)
  323. add_dependencies(dbschema_clean dbschema_db_sqlite_clean)
  324. endif()
  325. if("db_mongodb" IN_LIST FINAL_MODULES_LIST)
  326. add_db_target(mongodb "${STYLESHEETS}/mongodb.xsl")
  327. add_dependencies(dbschema dbschema_mongodb)
  328. add_dependencies(dbschema_clean dbschema_mongodb_clean)
  329. # Create the version-create.mongo script
  330. # After processing the JSON files, create the version-create.mongo script
  331. # Usage of generate_version_create_mongo.sh:
  332. # 1. The first argument is the path to create the version-create.mongo script
  333. # 2. The second argument is the path to the directory containing the JSON files
  334. add_custom_command(
  335. TARGET dbschema_mongodb
  336. POST_BUILD
  337. COMMAND
  338. bash ${CMAKE_CURRENT_SOURCE_DIR}/generate_version_create_mongo.sh
  339. "${CMAKE_CURRENT_BINARY_DIR}/mongodb/kamailio/version-create.mongo"
  340. "${CMAKE_CURRENT_BINARY_DIR}/mongodb/kamailio"
  341. COMMENT "Creating version-create.mongo from JSON files"
  342. )
  343. install(
  344. FILES ${CMAKE_CURRENT_BINARY_DIR}/mongodb/kamailio/version-create.mongo
  345. DESTINATION ${CMAKE_INSTALL_DATADIR}/${MAIN_NAME}/mongodb/${MAIN_NAME}
  346. COMPONENT KMONGODB
  347. )
  348. endif()
  349. if("db_redis" IN_LIST FINAL_MODULES_LIST)
  350. add_db_target(db_redis "${STYLESHEETS}/db_redis.xsl")
  351. add_dependencies(dbschema dbschema_db_redis)
  352. add_dependencies(dbschema_clean dbschema_db_redis_clean)
  353. endif()
  354. endif()