| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| # |
| # ============================================================================= |
| # GenerateThriftSources.cmake |
| # |
| # Generates C++ stubs from the iotdb-protocol Thrift files using the thrift |
| # compiler that FetchThrift just built. |
| # |
| # Inputs (resolved relative to the workspace root): |
| # iotdb-protocol/thrift-commons/src/main/thrift/common.thrift |
| # iotdb-protocol/thrift-datanode/src/main/thrift/client.thrift |
| # |
| # Outputs: |
| # ${THRIFT_GEN_CPP_DIR}/*.{h,cpp} - generated C++ sources |
| # THRIFT_GENERATED_SRCS - list of *.cpp files for linking |
| # THRIFT_GENERATED_HDRS - list of *.h files (informational) |
| # ============================================================================= |
| |
| if(NOT THRIFT_EXECUTABLE) |
| message(FATAL_ERROR "[GenThrift] THRIFT_EXECUTABLE not set - did FetchThrift run first?") |
| endif() |
| |
| # Anchor the source-of-truth .thrift files via the workspace root. The CMake |
| # project lives at <repo>/iotdb-client/client-cpp/, so the workspace root is |
| # two levels up. |
| get_filename_component(_workspace_root "${CMAKE_CURRENT_SOURCE_DIR}/../.." ABSOLUTE) |
| |
| set(_common_thrift "${_workspace_root}/iotdb-protocol/thrift-commons/src/main/thrift/common.thrift") |
| set(_client_thrift "${_workspace_root}/iotdb-protocol/thrift-datanode/src/main/thrift/client.thrift") |
| |
| foreach(_f IN ITEMS "${_common_thrift}" "${_client_thrift}") |
| if(NOT EXISTS "${_f}") |
| message(FATAL_ERROR "[GenThrift] missing thrift input: ${_f}") |
| endif() |
| endforeach() |
| |
| # Mirror the bash reference script: stage both .thrift files into a flat |
| # working directory so `include "common.thrift"` resolves without -I args. |
| set(_thrift_proto_dir "${CMAKE_BINARY_DIR}/thrift-protocols") |
| file(MAKE_DIRECTORY "${_thrift_proto_dir}") |
| configure_file("${_common_thrift}" "${_thrift_proto_dir}/common.thrift" COPYONLY) |
| configure_file("${_client_thrift}" "${_thrift_proto_dir}/client.thrift" COPYONLY) |
| |
| set(THRIFT_GEN_CPP_DIR "${CMAKE_BINARY_DIR}/gen-cpp" CACHE PATH "" FORCE) |
| file(MAKE_DIRECTORY "${THRIFT_GEN_CPP_DIR}") |
| |
| # A stamp file lets us re-run thrift only when one of the inputs changes |
| # (handled by add_custom_command at build time) while also making sure we |
| # run once at configure time so the initial file(GLOB) finds something. |
| set(_thrift_stamp "${THRIFT_GEN_CPP_DIR}/.generated-stamp") |
| |
| set(_thrift_inputs |
| "${_thrift_proto_dir}/common.thrift" |
| "${_thrift_proto_dir}/client.thrift") |
| |
| set(_run_thrift FALSE) |
| if(NOT EXISTS "${_thrift_stamp}") |
| set(_run_thrift TRUE) |
| else() |
| foreach(_in IN LISTS _thrift_inputs) |
| if("${_in}" IS_NEWER_THAN "${_thrift_stamp}") |
| set(_run_thrift TRUE) |
| break() |
| endif() |
| endforeach() |
| endif() |
| |
| if(_run_thrift) |
| message(STATUS "[GenThrift] running ${THRIFT_EXECUTABLE} on common.thrift / client.thrift") |
| foreach(_in IN LISTS _thrift_inputs) |
| execute_process( |
| COMMAND "${THRIFT_EXECUTABLE}" -r --gen cpp:no_skeleton -out "${THRIFT_GEN_CPP_DIR}" "${_in}" |
| WORKING_DIRECTORY "${_thrift_proto_dir}" |
| RESULT_VARIABLE _rc) |
| if(NOT _rc EQUAL 0) |
| message(FATAL_ERROR "[GenThrift] thrift compile failed for ${_in} (rc=${_rc})") |
| endif() |
| endforeach() |
| # Defensive: remove any accidentally produced server skeleton. |
| file(GLOB _skeletons "${THRIFT_GEN_CPP_DIR}/*_server.skeleton.cpp") |
| if(_skeletons) |
| file(REMOVE ${_skeletons}) |
| endif() |
| file(TOUCH "${_thrift_stamp}") |
| endif() |
| |
| # Build-time regeneration: whenever the workspace .thrift files change, rerun |
| # the thrift compiler. The OUTPUT is the stamp; downstream targets that |
| # depend on iotdb_thrift_codegen will get the rebuild for free. |
| add_custom_command( |
| OUTPUT "${_thrift_stamp}" |
| COMMAND ${CMAKE_COMMAND} -E copy_if_different "${_common_thrift}" "${_thrift_proto_dir}/common.thrift" |
| COMMAND ${CMAKE_COMMAND} -E copy_if_different "${_client_thrift}" "${_thrift_proto_dir}/client.thrift" |
| COMMAND "${THRIFT_EXECUTABLE}" -r --gen cpp:no_skeleton -out "${THRIFT_GEN_CPP_DIR}" "${_thrift_proto_dir}/common.thrift" |
| COMMAND "${THRIFT_EXECUTABLE}" -r --gen cpp:no_skeleton -out "${THRIFT_GEN_CPP_DIR}" "${_thrift_proto_dir}/client.thrift" |
| COMMAND ${CMAKE_COMMAND} -E touch "${_thrift_stamp}" |
| DEPENDS "${_common_thrift}" "${_client_thrift}" iotdb_thrift_external |
| WORKING_DIRECTORY "${_thrift_proto_dir}" |
| COMMENT "Regenerating thrift C++ stubs" |
| VERBATIM) |
| |
| add_custom_target(iotdb_thrift_codegen DEPENDS "${_thrift_stamp}") |
| |
| # Glob results with CONFIGURE_DEPENDS so re-cmake picks up newly produced files. |
| file(GLOB THRIFT_GENERATED_SRCS CONFIGURE_DEPENDS "${THRIFT_GEN_CPP_DIR}/*.cpp") |
| file(GLOB THRIFT_GENERATED_HDRS CONFIGURE_DEPENDS "${THRIFT_GEN_CPP_DIR}/*.h") |
| |
| list(FILTER THRIFT_GENERATED_SRCS EXCLUDE REGEX ".*_server\\.skeleton\\.cpp$") |
| |
| message(STATUS "[GenThrift] generated ${THRIFT_GEN_CPP_DIR} with " |
| "$<LIST_LENGTH:THRIFT_GENERATED_SRCS> cpp files") |