# # Copyright (c) Marcus Holland-Moritz # # This file is part of dwarfs. # # dwarfs is free software: you can redistribute it and/or modify it under the # terms of the GNU General Public License as published by the Free Software # Foundation, either version 3 of the License, or (at your option) any later # version. # # dwarfs is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR # A PARTICULAR PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along with # dwarfs. If not, see . # cmake_minimum_required(VERSION 3.28.0) function(add_cpp2_thrift_library idlfile) set(_options FROZEN METADATA CONSTANTS NO_LIBRARY) set(_oneValueArgs OUTPUT_PATH TARGET) set(_multiValueArgs) cmake_parse_arguments(_THRIFT "${_options}" "${_oneValueArgs}" "${_multiValueArgs}" ${ARGN}) string(REGEX REPLACE ".*/([^/]+)\\.thrift" "\\1" _THRIFTNAME ${idlfile}) if(NOT _THRIFT_NO_LIBRARY AND NOT _THRIFT_TARGET) message(FATAL_ERROR "add_cpp2_thrift_library: TARGET must be specified") endif() if(_THRIFT_FROZEN) list(APPEND _OPTS "frozen") endif() if(_THRIFT_METADATA) list(APPEND _OPTS "metadata") endif() if(_THRIFT_CONSTANTS) list(APPEND _OPTS "constants") endif() if(_THRIFT_NO_LIBRARY) list(APPEND _OPTS "nolib") endif() set(_OPTSTR "") if(_OPTS) string(JOIN ", " _OPTSTR ${_OPTS}) set(_OPTSTR " (${_OPTSTR})") endif() if(DWARFS_GIT_BUILD) set(_THRIFT_GENERATED_DIR ${CMAKE_CURRENT_BINARY_DIR}) else() set(_THRIFT_GENERATED_DIR ${CMAKE_CURRENT_SOURCE_DIR}) endif() list(APPEND _THRIFT_SRC ${_THRIFT_GENERATED_DIR}/thrift/${_THRIFT_OUTPUT_PATH}/gen-cpp2/${_THRIFTNAME}_clients.h ${_THRIFT_GENERATED_DIR}/thrift/${_THRIFT_OUTPUT_PATH}/gen-cpp2/${_THRIFTNAME}_data.cpp ${_THRIFT_GENERATED_DIR}/thrift/${_THRIFT_OUTPUT_PATH}/gen-cpp2/${_THRIFTNAME}_data.h ${_THRIFT_GENERATED_DIR}/thrift/${_THRIFT_OUTPUT_PATH}/gen-cpp2/${_THRIFTNAME}_for_each_field.h ${_THRIFT_GENERATED_DIR}/thrift/${_THRIFT_OUTPUT_PATH}/gen-cpp2/${_THRIFTNAME}_handlers.h ${_THRIFT_GENERATED_DIR}/thrift/${_THRIFT_OUTPUT_PATH}/gen-cpp2/${_THRIFTNAME}_types.cpp ${_THRIFT_GENERATED_DIR}/thrift/${_THRIFT_OUTPUT_PATH}/gen-cpp2/${_THRIFTNAME}_types.h ${_THRIFT_GENERATED_DIR}/thrift/${_THRIFT_OUTPUT_PATH}/gen-cpp2/${_THRIFTNAME}_types.tcc ${_THRIFT_GENERATED_DIR}/thrift/${_THRIFT_OUTPUT_PATH}/gen-cpp2/${_THRIFTNAME}_types_custom_protocol.h ${_THRIFT_GENERATED_DIR}/thrift/${_THRIFT_OUTPUT_PATH}/gen-cpp2/${_THRIFTNAME}_types_fwd.h ${_THRIFT_GENERATED_DIR}/thrift/${_THRIFT_OUTPUT_PATH}/gen-cpp2/${_THRIFTNAME}_visit_by_thrift_field_metadata.h ${_THRIFT_GENERATED_DIR}/thrift/${_THRIFT_OUTPUT_PATH}/gen-cpp2/${_THRIFTNAME}_visit_union.h ${_THRIFT_GENERATED_DIR}/thrift/${_THRIFT_OUTPUT_PATH}/gen-cpp2/${_THRIFTNAME}_visitation.h ) list(APPEND _THRIFT_CONSTANTS_SRC ${_THRIFT_GENERATED_DIR}/thrift/${_THRIFT_OUTPUT_PATH}/gen-cpp2/${_THRIFTNAME}_constants.cpp ${_THRIFT_GENERATED_DIR}/thrift/${_THRIFT_OUTPUT_PATH}/gen-cpp2/${_THRIFTNAME}_constants.h ) list(APPEND _THRIFT_METADATA_SRC ${_THRIFT_GENERATED_DIR}/thrift/${_THRIFT_OUTPUT_PATH}/gen-cpp2/${_THRIFTNAME}_metadata.cpp ${_THRIFT_GENERATED_DIR}/thrift/${_THRIFT_OUTPUT_PATH}/gen-cpp2/${_THRIFTNAME}_metadata.h ) set(_THRIFT_GEN mstch_cpp2) if(_THRIFT_FROZEN) list(APPEND _THRIFT_SRC ${_THRIFT_GENERATED_DIR}/thrift/${_THRIFT_OUTPUT_PATH}/gen-cpp2/${_THRIFTNAME}_layouts.cpp ${_THRIFT_GENERATED_DIR}/thrift/${_THRIFT_OUTPUT_PATH}/gen-cpp2/${_THRIFTNAME}_layouts.h ) set(_THRIFT_GEN ${_THRIFT_GEN}:frozen2) endif() list(APPEND _THRIFT_GEN_SRC ${_THRIFT_SRC} ${_THRIFT_CONSTANTS_SRC} ${_THRIFT_METADATA_SRC}) list(APPEND _THRIFT_LIB_SRC ${_THRIFT_SRC}) if(_THRIFT_CONSTANTS) list(APPEND _THRIFT_LIB_SRC ${_THRIFT_CONSTANTS_SRC}) endif() if(_THRIFT_METADATA) list(APPEND _THRIFT_LIB_SRC ${_THRIFT_METADATA_SRC}) endif() message(STATUS "Adding thrift library [${_THRIFTNAME}] from ${idlfile}${_OPTSTR}") if(DWARFS_GIT_BUILD) add_custom_command( OUTPUT thrift/${_THRIFT_OUTPUT_PATH}/_keep_${_THRIFTNAME} COMMAND ${CMAKE_COMMAND} -E make_directory thrift/${_THRIFT_OUTPUT_PATH} COMMAND ${CMAKE_COMMAND} -E touch thrift/${_THRIFT_OUTPUT_PATH}/_keep_${_THRIFTNAME} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) add_custom_command( OUTPUT ${_THRIFT_GEN_SRC} COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/${idlfile} ${CMAKE_CURRENT_BINARY_DIR}/thrift/${_THRIFT_OUTPUT_PATH}/${_THRIFTNAME}.thrift COMMAND ${CMAKE_CURRENT_BINARY_DIR}/bin/thrift1 -I ${CMAKE_CURRENT_SOURCE_DIR}/fbthrift -o ${CMAKE_CURRENT_BINARY_DIR}/thrift/${_THRIFT_OUTPUT_PATH} --gen ${_THRIFT_GEN} ${_THRIFTNAME}.thrift COMMENT "Running thrift compiler on ${_THRIFTNAME}.thrift [${_THRIFT_GEN}]" DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/bin/thrift1 ${CMAKE_CURRENT_BINARY_DIR}/thrift/${_THRIFT_OUTPUT_PATH}/_keep_${_THRIFTNAME} ${idlfile} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/thrift/${_THRIFT_OUTPUT_PATH} ) endif() if(NOT _THRIFT_NO_LIBRARY) add_library(${_THRIFT_TARGET} OBJECT ${_THRIFT_LIB_SRC}) target_include_directories(${_THRIFT_TARGET} PUBLIC $ ) target_link_libraries(${_THRIFT_TARGET} PUBLIC dwarfs_thrift_lite) if(NOT WIN32) target_compile_options(${_THRIFT_TARGET} PRIVATE -Wno-deprecated-declarations) endif() set_property(TARGET ${_THRIFT_TARGET} PROPERTY CXX_STANDARD 20) endif() endfunction()