Selaa lähdekoodia

cmake: Centralize dbschema generation

- Do not define the targets if xsltproc is missing
Xenofon Karamanos 4 kuukautta sitten
vanhempi
commit
6753acd068

+ 129 - 63
cmake/dbschema.cmake

@@ -2,12 +2,77 @@
 # dbschema target: Old Makefiles: make dbschema declared in src/ Makefile This
 # was using the makefile found in src/lib/srdb1/schema folder.
 #
-# TODO: Revise where we want the target declared.
-# CMake includes this file dbschema.cmake in each module that has a schema
-# folder.
-
+# CMakeLists.txt in src/ includes this file. All modules that have a schema
+# should be appended to the end of this file. See the the rest of modules.
 find_program(XSLTPROC_EXECUTABLE xsltproc QUIET)
 
+# Function to add a target for each database type prefix with dbschema ie
+# db_name = redis -> target = dbschema_redis
+function(add_db_target group_name db_name xsl_file)
+  if(NOT XSLTPROC_EXECUTABLE)
+    return()
+  endif()
+  # Change name for the folder
+  if(db_name STREQUAL "pi_framework_table" OR db_name STREQUAL "pi_framework_mod")
+    set(db_name_folder xhttp_pi)
+  else()
+    set(db_name_folder ${db_name})
+  endif()
+
+  add_custom_target(
+    dbschema_${db_name}
+    COMMAND ${CMAKE_COMMAND} -E make_directory "${db_name_folder}"
+    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/utils/kamctl
+    COMMENT "Creating schemas for ${db_name}"
+  )
+
+  # Loop through each table and add a command for xsltproc
+  foreach(table ${EXTRACTED_TABLES})
+    # Determine the prefix based on db_name
+    if(db_name STREQUAL "db_berkeley"
+       OR db_name STREQUAL "db_redis"
+       OR db_name STREQUAL "dbtext"
+       OR db_name STREQUAL "mongodb"
+    )
+      set(prefix '')
+      set(folder_suffix "${MAIN_NAME}")
+    else()
+      set(prefix "${table}-")
+      set(folder_suffix '')
+    endif()
+
+    add_custom_command(
+      TARGET dbschema_${db_name}
+      PRE_BUILD
+      COMMAND
+        "XML_CATALOG_FILES=${CATALOG}" ${XSLTPROC_EXECUTABLE} ${XSLTPROC_FLAGS} --stringparam dir
+        ${CMAKE_BINARY_DIR}/utils/kamctl/${db_name_folder}/${folder_suffix} --stringparam prefix
+        ${prefix} --stringparam db ${db_name} ${xsl_file} "kamailio-${table}.xml"
+      WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/src/lib/srdb1/schema"
+      COMMENT "Processing ${table} for ${db_name}"
+    )
+  endforeach()
+
+  add_custom_target(
+    dbschema_${db_name}_clean
+    COMMAND ${CMAKE_COMMAND} -E remove_directory
+            "${CMAKE_BINARY_DIR}/utils/kamctl/${db_name_folder}"
+    COMMENT "Cleaning ${db_name} schema files"
+  )
+
+  add_dependencies(dbschema dbschema_${db_name})
+  add_dependencies(dbschema_clean dbschema_${db_name}_clean)
+
+  # message(WARNING "group name is ${group_name}")
+  # Before installing, ensure the target is built `dbschema_${db_name}`
+  install(
+    DIRECTORY ${CMAKE_BINARY_DIR}/utils/kamctl/${db_name_folder}
+    DESTINATION ${CMAKE_INSTALL_DATADIR}/${MAIN_NAME}
+    OPTIONAL
+    COMPONENT ${group_name}
+  )
+endfunction()
+
 if(NOT XSLTPROC_EXECUTABLE)
   message(STATUS "xsltproc is not found. Skip dbschema target.")
 else()
@@ -49,69 +114,70 @@ else()
   if(VERBOSE)
     message(STATUS "Extracted Tables for DB schema generation: ${EXTRACTED_TABLES}")
   endif()
+endif()
 
-  # Function to add a target for each database type prefix with dbschema ie
-  # db_name = redis -> target = dbschema_redis
-  function(add_db_target group_name db_name xsl_file)
-    # Change name for the folder
-    if(db_name STREQUAL "pi_framework_table" OR db_name STREQUAL "pi_framework_mod")
-      set(db_name_folder xhttp_pi)
-    else()
-      set(db_name_folder ${db_name})
-    endif()
+#---- DB berkeley
+add_db_target("${group_name}" db_berkeley "${STYLESHEETS}/db_berkeley.xsl")
 
-    add_custom_target(
-      dbschema_${db_name}
-      COMMAND ${CMAKE_COMMAND} -E make_directory "${db_name_folder}"
-      WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/utils/kamctl
-      COMMENT "Creating schemas for ${db_name}"
-    )
+#---- DB monogo
+add_db_target("${group_name}" mongodb "${STYLESHEETS}/mongodb.xsl")
+# Create the version-create.mongo script
+# After processing the JSON files, create the version-create.mongo script
+# Usage of generate_version_create_mongo.sh:
+# 1. The first argument is the path to create the version-create.mongo script
+# 2. The second argument is the path to the directory containing the JSON files
+if(TARGET dbschema_mongodb)
+  add_custom_command(
+    TARGET dbschema_mongodb
+    POST_BUILD
+    COMMAND
+      bash generate_version_create_mongo.sh
+      "${CMAKE_BINARY_DIR}/utils/kamctl/mongodb/kamailio/version-create.mongo"
+      "${CMAKE_BINARY_DIR}/utils/kamctl/mongodb/kamailio"
+    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/utils/kamctl
+    COMMENT "Creating version-create.mongo from JSON files"
+  )
+endif()
 
-    # Loop through each table and add a command for xsltproc
-    foreach(table ${EXTRACTED_TABLES})
-      # Determine the prefix based on db_name
-      if(db_name STREQUAL "db_berkeley"
-         OR db_name STREQUAL "db_redis"
-         OR db_name STREQUAL "dbtext"
-         OR db_name STREQUAL "mongodb"
-      )
-        set(prefix '')
-        set(folder_suffix "${MAIN_NAME}")
-      else()
-        set(prefix "${table}-")
-        set(folder_suffix '')
-      endif()
-
-      add_custom_command(
-        TARGET dbschema_${db_name}
-        PRE_BUILD
-        COMMAND
-          "XML_CATALOG_FILES=${CATALOG}" ${XSLTPROC_EXECUTABLE} ${XSLTPROC_FLAGS} --stringparam dir
-          ${CMAKE_BINARY_DIR}/utils/kamctl/${db_name_folder}/${folder_suffix} --stringparam prefix
-          ${prefix} --stringparam db ${db_name} ${xsl_file} "kamailio-${table}.xml"
-        WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/src/lib/srdb1/schema"
-        COMMENT "Processing ${table} for ${db_name}"
-      )
-    endforeach()
-
-    add_custom_target(
-      dbschema_${db_name}_clean
-      COMMAND ${CMAKE_COMMAND} -E remove_directory
-              "${CMAKE_BINARY_DIR}/utils/kamctl/${db_name_folder}"
-      COMMENT "Cleaning ${db_name} schema files"
-    )
+install(
+  FILES ${CMAKE_BINARY_DIR}/utils/kamctl/mongodb/kamailio/version-create.mongo
+  DESTINATION ${CMAKE_INSTALL_DATADIR}/${MAIN_NAME}/mongodb/${MAIN_NAME}
+  OPTIONAL
+  COMPONENT ${group_name}
+)
 
-    add_dependencies(dbschema dbschema_${db_name})
-    add_dependencies(dbschema_clean dbschema_${db_name}_clean)
+#---- DB mysql
+add_db_target("${group_name}" mysql "${STYLESHEETS}/mysql.xsl")
 
-    # message(WARNING "group name is ${group_name}")
-    # Before installing, ensure the target is built `dbschema_${db_name}`
-    install(
-      DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${db_name_folder}
-      DESTINATION ${CMAKE_INSTALL_DATADIR}/${MAIN_NAME}
-      OPTIONAL
-      COMPONENT ${group_name}
-    )
+#---- DB Oracle
+add_db_target("${group_name}" db_oracle "${STYLESHEETS}/oracle.xsl")
+
+#---- DB postgres
+add_db_target("${group_name}" postgres "${STYLESHEETS}/postgres.xsl")
+
+#---- DB redis
+add_db_target("${group_name}" db_redis "${STYLESHEETS}/db_redis.xsl")
+
+#---- DB sqlite
+add_db_target("${group_name}" db_sqlite "${STYLESHEETS}/db_sqlite.xsl")
+
+#---- DB text
+add_db_target("${group_name}" dbtext "${STYLESHEETS}/dbtext.xsl")
+
+#---- DB xhttp_pi
+add_db_target("${group_name}" pi_framework_table "${STYLESHEETS}/pi_framework_table.xsl")
+add_db_target("${group_name}" pi_framework_mod "${STYLESHEETS}/pi_framework_mod.xsl")
+
+# Add alias targets that match the dbschema
+if(XSLTPROC_EXECUTABLE)
+  add_custom_target(dbschema_xhttp_pi)
+  add_dependencies(dbschema_xhttp_pi dbschema_pi_framework_table dbschema_pi_framework_mod)
+
+  add_custom_target(dbschema_xhttp_pi_clean)
+  add_dependencies(
+    dbschema_xhttp_pi dbschema_pi_framework_table_clean dbschema_pi_framework_mod_clean
+  )
 
-  endfunction()
+  add_dependencies(dbschema dbschema_pi_framework_table dbschema_pi_framework_mod)
+  add_dependencies(dbschema_clean dbschema_pi_framework_table_clean dbschema_pi_framework_mod_clean)
 endif()

+ 3 - 0
src/CMakeLists.txt

@@ -216,7 +216,10 @@ install(
 )
 
 # ----------
+# Db schema files
+include(${CMAKE_SOURCE_DIR}/cmake/dbschema.cmake)
 
+# ----------
 # Install the configuration file (kamailio.cfg) ${CFG_NAME} using a CODE block
 # to check  existence at install time instead of configure time
 # If(EXISTS ..) require full path

+ 0 - 3
src/modules/db_berkeley/CMakeLists.txt

@@ -15,6 +15,3 @@ add_dependencies(${module_name} kamdb_recover)
 include(${CMAKE_SOURCE_DIR}/cmake/db_files.cmake)
 add_kamctl_db_files(${group_name} kamctl.db_berkeley)
 add_kamdbctl_db_files(${group_name} kamdbctl.db_berkeley)
-
-include(${CMAKE_SOURCE_DIR}/cmake/dbschema.cmake)
-add_db_target("${group_name}" db_berkeley "${STYLESHEETS}/db_berkeley.xsl")

+ 0 - 25
src/modules/db_mongodb/CMakeLists.txt

@@ -9,28 +9,3 @@ pkg_check_modules(mongoc REQUIRED IMPORTED_TARGET libmongoc-1.0>=1.7)
 add_library(mongoc::mongoc ALIAS PkgConfig::mongoc)
 
 target_link_libraries(${module_name} PRIVATE mongoc::mongoc)
-
-include(${CMAKE_SOURCE_DIR}/cmake/dbschema.cmake)
-add_db_target("${group_name}" mongodb "${STYLESHEETS}/mongodb.xsl")
-
-# Create the version-create.mongo script
-# After processing the JSON files, create the version-create.mongo script
-# Usage of generate_version_create_mongo.sh:
-# 1. The first argument is the path to create the version-create.mongo script
-# 2. The second argument is the path to the directory containing the JSON files
-add_custom_command(
-  TARGET dbschema_mongodb
-  POST_BUILD
-  COMMAND
-    bash generate_version_create_mongo.sh
-    "${CMAKE_BINARY_DIR}/utils/kamctl/mongodb/kamailio/version-create.mongo"
-    "${CMAKE_BINARY_DIR}/utils/kamctl/mongodb/kamailio"
-  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/utils/kamctl
-  COMMENT "Creating version-create.mongo from JSON files"
-)
-
-install(
-  FILES ${CMAKE_BINARY_DIR}/utils/kamctl/mongodb/kamailio/version-create.mongo
-  DESTINATION ${CMAKE_INSTALL_DATADIR}/${MAIN_NAME}/mongodb/${MAIN_NAME}
-  COMPONENT ${group_name}
-)

+ 0 - 3
src/modules/db_mysql/CMakeLists.txt

@@ -15,6 +15,3 @@ target_link_libraries(${module_name} PRIVATE ${MariaDBClient_LIBRARIES})
 include(${CMAKE_SOURCE_DIR}/cmake/db_files.cmake)
 add_kamctl_db_files(${group_name} kamctl.mysql)
 add_kamdbctl_db_files(${group_name} kamdbctl.mysql)
-
-include(${CMAKE_SOURCE_DIR}/cmake/dbschema.cmake)
-add_db_target("${group_name}" mysql "${STYLESHEETS}/mysql.xsl")

+ 0 - 3
src/modules/db_oracle/CMakeLists.txt

@@ -12,6 +12,3 @@ target_link_libraries(${module_name} PRIVATE ${ORACLE_LIBRARIES})
 include(${CMAKE_SOURCE_DIR}/cmake/db_files.cmake)
 add_kamctl_db_files(${group_name} kamctl.oracle)
 add_kamdbctl_db_files(${group_name} kamdbctl.oracle kamdbfunc.oracle)
-
-include(${CMAKE_SOURCE_DIR}/cmake/dbschema.cmake)
-add_db_target("${group_name}" db_oracle "${STYLESHEETS}/oracle.xsl")

+ 0 - 3
src/modules/db_postgres/CMakeLists.txt

@@ -11,6 +11,3 @@ target_link_libraries(${module_name} PRIVATE ${PostgreSQL_LIBRARIES})
 include(${CMAKE_SOURCE_DIR}/cmake/db_files.cmake)
 add_kamctl_db_files(${group_name} kamctl.pgsql)
 add_kamdbctl_db_files(${group_name} kamdbctl.pgsql)
-
-include(${CMAKE_SOURCE_DIR}/cmake/dbschema.cmake)
-add_db_target("${group_name}" postgres "${STYLESHEETS}/postgres.xsl")

+ 0 - 3
src/modules/db_redis/CMakeLists.txt

@@ -9,6 +9,3 @@ add_library(redis::redis ALIAS PkgConfig::redis)
 # TODO: Check with Makefile for cluster stuff
 
 target_link_libraries(${module_name} PRIVATE redis::redis)
-
-include(${CMAKE_SOURCE_DIR}/cmake/dbschema.cmake)
-add_db_target("${group_name}" db_redis "${STYLESHEETS}/db_redis.xsl")

+ 0 - 3
src/modules/db_sqlite/CMakeLists.txt

@@ -9,6 +9,3 @@ target_link_libraries(${module_name} PRIVATE SQLite::SQLite3)
 include(${CMAKE_SOURCE_DIR}/cmake/db_files.cmake)
 add_kamctl_db_files(${group_name} kamctl.sqlite)
 add_kamdbctl_db_files(${group_name} kamdbctl.sqlite)
-
-include(${CMAKE_SOURCE_DIR}/cmake/dbschema.cmake)
-add_db_target("${group_name}" db_sqlite "${STYLESHEETS}/db_sqlite.xsl")

+ 0 - 3
src/modules/db_text/CMakeLists.txt

@@ -12,6 +12,3 @@ install(
   DESTINATION ${CMAKE_INSTALL_LIBDIR}/${MAIN_NAME}/kamctl/dbtextdb
   COMPONENT kamailio-core
 )
-
-include(${CMAKE_SOURCE_DIR}/cmake/dbschema.cmake)
-add_db_target("${group_name}" dbtext "${STYLESHEETS}/dbtext.xsl")

+ 1 - 16
src/modules/xhttp_pi/CMakeLists.txt

@@ -29,24 +29,9 @@ install(
   COMPONENT ${group_name}
 )
 
+# TODO: component does not exist. fix this
 add_custom_target(
   xhttp_pi-install-cfg
   COMMENT "Installing pi_framework.xml"
   COMMAND ${CMAKE_COMMAND} --install ${CMAKE_BINARY_DIR} --component xhttp_pi-cfg
 )
-
-include(${CMAKE_SOURCE_DIR}/cmake/dbschema.cmake)
-add_db_target("${group_name}" pi_framework_table "${STYLESHEETS}/pi_framework_table.xsl")
-add_db_target("${group_name}" pi_framework_mod "${STYLESHEETS}/pi_framework_mod.xsl")
-
-# Add targets that match the dbschema
-add_custom_target(dbschema_xhttp_pi)
-add_dependencies(dbschema_xhttp_pi dbschema_pi_framework_table dbschema_pi_framework_mod)
-
-add_custom_target(dbschema_xhttp_pi_clean)
-add_dependencies(
-  dbschema_xhttp_pi dbschema_pi_framework_table_clean dbschema_pi_framework_mod_clean
-)
-
-add_dependencies(dbschema dbschema_pi_framework_table dbschema_pi_framework_mod)
-add_dependencies(dbschema_clean dbschema_pi_framework_table_clean dbschema_pi_framework_mod_clean)