Files
wehub-resource-sync c8a779b1bb
Docker Image CI / build-ubuntu2004 (push) Waiting to run
chore: import upstream snapshot with attribution
2026-07-13 13:36:55 +08:00

224 lines
11 KiB
CMake

#
# SPDX-FileCopyrightText: Copyright (c) 1993-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
#
# Licensed 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.
#
include(ExternalProject)
# Downloads and builds a given protobuf version, generating a protobuf target
# with the include dir and binaries imported
macro(configure_protobuf VERSION)
set(protobufPackage "protobuf-cpp-${VERSION}.tar.gz")
set(Protobuf_PKG_URL "https://github.com/google/protobuf/releases/download/v${VERSION}/${protobufPackage}")
set(Protobuf_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR})
set(Protobuf_TARGET third_party.protobuf)
set(PROTOBUF_CFLAGS "-Dgoogle=google_trtrepack")
set(PROTOBUF_CXXFLAGS "-Dgoogle=google_trtrepack")
ExternalProject_Add(${Protobuf_TARGET}
PREFIX ${Protobuf_TARGET}
URL ${Protobuf_PKG_URL}
UPDATE_COMMAND ""
CONFIGURE_COMMAND ${CMAKE_COMMAND} ${Protobuf_INSTALL_DIR}/${Protobuf_TARGET}/src/${Protobuf_TARGET}/cmake
-G${CMAKE_GENERATOR}
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
-DCMAKE_C_COMPILER:FILEPATH=/usr/bin/gcc
-DCMAKE_CXX_COMPILER:FILEPATH=/usr/bin/g++
-DCMAKE_C_FLAGS=${PROTOBUF_CFLAGS}
-DCMAKE_CXX_FLAGS=${PROTOBUF_CXXFLAGS}
-DCMAKE_INSTALL_PREFIX=${Protobuf_INSTALL_DIR}/${Protobuf_TARGET}
-Dprotobuf_BUILD_TESTS=OFF
-Dprotobuf_MSVC_STATIC_RUNTIME=OFF # For Windows
SOURCE_SUBDIR cmake
BINARY_DIR ${Protobuf_INSTALL_DIR}/${Protobuf_TARGET}/src/${Protobuf_TARGET}
)
set(Protobuf_BIN_DIR "${CMAKE_BINARY_DIR}/${Protobuf_TARGET}/bin")
find_file (CENTOS_FOUND centos-release PATHS /etc)
find_file (ROCKY_FOUND rocky-release PATHS /etc)
if (CENTOS_FOUND OR ROCKY_FOUND)
set(Protobuf_LIB_DIR "${CMAKE_BINARY_DIR}/${Protobuf_TARGET}/lib64")
else (CENTOS_FOUND OR ROCKY_FOUND)
set(Protobuf_LIB_DIR "${CMAKE_BINARY_DIR}/${Protobuf_TARGET}/lib")
endif (CENTOS_FOUND OR ROCKY_FOUND)
set(Protobuf_INCLUDE_DIR "${CMAKE_BINARY_DIR}/${Protobuf_TARGET}/include")
set(Protobuf_INCLUDE_DIRS "${CMAKE_BINARY_DIR}/${Protobuf_TARGET}/include")
set(Protobuf_PROTOC_EXECUTABLE "${Protobuf_BIN_DIR}/protoc")
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
set(Protobuf_LIBRARY "${Protobuf_LIB_DIR}/libprotobufd.${STATIC_LIB_EXT}")
set(Protobuf_PROTOC_LIBRARY "${Protobuf_LIB_DIR}/libprotocd.${STATIC_LIB_EXT}")
set(Protobuf_LITE_LIBRARY "${Protobuf_LIB_DIR}/libprotobuf-lited.${STATIC_LIB_EXT}")
else()
set(Protobuf_LIBRARY "${Protobuf_LIB_DIR}/libprotobuf.${STATIC_LIB_EXT}")
set(Protobuf_PROTOC_LIBRARY "${Protobuf_LIB_DIR}/libprotoc.${STATIC_LIB_EXT}")
set(Protobuf_LITE_LIBRARY "${Protobuf_LIB_DIR}/libprotobuf-lite.${STATIC_LIB_EXT}")
endif()
set(protolibType STATIC)
if(CMAKE_CROSSCOMPILING)
message(STATUS "Setting up another Protobuf build for cross compilation targeting ${CMAKE_SYSTEM_PROCESSOR}-${CMAKE_SYSTEM_NAME}")
# In case of cross-compilation for QNX requires additional CXX flags
if(${CMAKE_SYSTEM_NAME} STREQUAL "QNX")
message("Conigure compilation flags for qnx")
set(PROTOBUF_CXXFLAGS "${CMAKE_CXX_FLAGS} ${PROTOBUF_CXXFLAGS}")
set(PROTOBUF_CFLAGS "${CMAKE_C_FLAGS} ${PROTOBUF_CFLAGS}")
endif()
ExternalProject_Add(${Protobuf_TARGET}_${CMAKE_SYSTEM_PROCESSOR}
PREFIX ${Protobuf_TARGET}_${CMAKE_SYSTEM_PROCESSOR}
URL ${Protobuf_PKG_URL}
UPDATE_COMMAND ""
CONFIGURE_COMMAND ${CMAKE_COMMAND} ${Protobuf_INSTALL_DIR}/${Protobuf_TARGET}_${CMAKE_SYSTEM_PROCESSOR}/src/${Protobuf_TARGET}_${CMAKE_SYSTEM_PROCESSOR}/cmake
-G${CMAKE_GENERATOR}
-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
-DCMAKE_C_COMPILER:FILEPATH=${CMAKE_C_COMPILER}
-DCMAKE_CXX_COMPILER:FILEPATH=${CMAKE_CXX_COMPILER}
-DCMAKE_C_FLAGS=${PROTOBUF_CFLAGS}
-DCMAKE_CXX_FLAGS=${PROTOBUF_CXXFLAGS}
-DCMAKE_INSTALL_PREFIX=${Protobuf_INSTALL_DIR}/${Protobuf_TARGET}_${CMAKE_SYSTEM_PROCESSOR}
-Dprotobuf_BUILD_TESTS=OFF
SOURCE_SUBDIR cmake
BINARY_DIR ${Protobuf_INSTALL_DIR}/${Protobuf_TARGET}_${CMAKE_SYSTEM_PROCESSOR}/src/${Protobuf_TARGET}_${CMAKE_SYSTEM_PROCESSOR}/
)
set(Protobuf_LIB_DIR "${CMAKE_BINARY_DIR}/${Protobuf_TARGET}_${CMAKE_SYSTEM_PROCESSOR}/lib")
set(Protobuf_INCLUDE_DIR "${CMAKE_BINARY_DIR}/${Protobuf_TARGET}/include")
set(Protobuf_INCLUDE_DIRS "${CMAKE_BINARY_DIR}/${Protobuf_TARGET}/include")
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
set(Protobuf_LIBRARY "${Protobuf_LIB_DIR}/libprotobufd.a")
set(Protobuf_PROTOC_LIBRARY "${Protobuf_LIB_DIR}/libprotocd.a")
set(Protobuf_LITE_LIBRARY "${Protobuf_LIB_DIR}/libprotobuf-lited.a")
else()
set(Protobuf_LIBRARY "${Protobuf_LIB_DIR}/libprotobuf.a")
set(Protobuf_PROTOC_LIBRARY "${Protobuf_LIB_DIR}/libprotoc.a")
set(Protobuf_LITE_LIBRARY "${Protobuf_LIB_DIR}/libprotobuf-lite.a")
endif()
set(Protobuf_INSTALL_DIR "${CMAKE_BINARY_DIR}/${Protobuf_TARGET}")
set(protolibType STATIC)
endif()
add_library(protobuf::libprotobuf ${protolibType} IMPORTED)
set_target_properties(protobuf::libprotobuf PROPERTIES
IMPORTED_LOCATION "${Protobuf_LIBRARY}"
)
add_library(protobuf::libprotobuf-lite ${protolibType} IMPORTED)
set_target_properties(protobuf::libprotobuf-lite PROPERTIES
IMPORTED_LOCATION "${Protobuf_LITE_LIBRARY}"
)
if ((${CMAKE_SYSTEM_NAME} STREQUAL "Linux") AND NOT(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64"))
add_dependencies(protobuf::libprotobuf ${Protobuf_TARGET}_${CMAKE_SYSTEM_PROCESSOR})
add_dependencies(protobuf::libprotobuf-lite ${Protobuf_TARGET}_${CMAKE_SYSTEM_PROCESSOR})
else ()
add_dependencies(protobuf::libprotobuf ${Protobuf_TARGET}_${CMAKE_SYSTEM_PROCESSOR})
add_dependencies(protobuf::libprotobuf-lite ${Protobuf_TARGET})
endif()
add_library(protobuf::libprotoc ${protolibType} IMPORTED)
add_dependencies(protobuf::libprotoc ${Protobuf_TARGET})
set_target_properties(protobuf::libprotoc PROPERTIES
IMPORTED_LOCATION "${Protobuf_PROTOC_LIBRARY}"
)
add_executable(protobuf::protoc IMPORTED)
add_dependencies(protobuf::protoc ${Protobuf_TARGET})
set_target_properties(protobuf::protoc PROPERTIES
IMPORTED_LOCATION "${Protobuf_PROTOC_EXECUTABLE}"
)
add_library(Protobuf INTERFACE)
target_include_directories(Protobuf INTERFACE "${Protobuf_INCLUDE_DIR}")
target_link_libraries(Protobuf INTERFACE protobuf::libprotobuf)
message(STATUS "Using libprotobuf ${Protobuf_LIBRARY}")
endmacro()
macro(configure_protobuf_internal VERSION)
#Assuming building on a x86_64 Linux Box so use local protoc even for cross compiliation
set(Protobuf_BIN_DIR "${Protobuf_DIR}/../x86_64/${VERSION}/bin")
set(Protobuf_LIB_DIR "${Protobuf_DIR}/${VERSION}/lib")
set(Protobuf_PROTOC_EXECUTABLE "${Protobuf_BIN_DIR}/protoc")
set(Protobuf_LIBRARY "${Protobuf_LIB_DIR}/libprotobuf.a")
set(Protobuf_PROTOC_LIBRARY "${Protobuf_LIB_DIR}/libprotoc.a")
set(Protobuf_LITE_LIBRARY "${Protobuf_LIB_DIR}/libprotobuf-lite.a")
set(Protobuf_INCLUDE_DIR "${Protobuf_DIR}/${VERSION}/include")
set(Protobuf_INCLUDE_DIRS "${Protobuf_DIR}/${VERSION}/include")
set(Protobuf_INSTALL_DIR "${Protobuf_DIR}/${VERSION}")
set(protolibType STATIC)
add_library(protobuf::libprotobuf ${protolibType} IMPORTED)
add_dependencies(protobuf::libprotobuf ${Protobuf_DIR})
set_target_properties(protobuf::libprotobuf PROPERTIES
IMPORTED_LOCATION "${Protobuf_LIBRARY}"
)
add_library(protobuf::libprotobuf-lite ${protolibType} IMPORTED)
add_dependencies(protobuf::libprotobuf-lite ${Protobuf_DIR})
set_target_properties(protobuf::libprotobuf-lite PROPERTIES
IMPORTED_LOCATION "${Protobuf_LITE_LIBRARY}"
)
add_library(protobuf::libprotoc ${protolibType} IMPORTED)
add_dependencies(protobuf::libprotoc ${Protobuf_DIR})
set_target_properties(protobuf::libprotoc PROPERTIES
IMPORTED_LOCATION "${Protobuf_PROTOC_LIBRARY}"
)
add_executable(protobuf::protoc IMPORTED)
add_dependencies(protobuf::protoc ${Protobuf_DIR})
set_target_properties(protobuf::protoc PROPERTIES
IMPORTED_LOCATION "${Protobuf_PROTOC_EXECUTABLE}"
)
add_library(Protobuf INTERFACE)
target_include_directories(Protobuf INTERFACE "${Protobuf_INCLUDE_DIR}")
target_link_libraries(Protobuf INTERFACE protobuf::libprotobuf)
message(STATUS "Using libprotobuf ${Protobuf_LIBRARY}")
endmacro()
function(protobuf_generate_cpp SRCS HDRS)
set(PROTOS ${ARGN})
foreach(proto ${PROTOS})
get_filename_component(PROTO_NAME "${proto}" NAME_WE)
get_filename_component(PROTO_DIR "${proto}" DIRECTORY)
set(PROTO_HEADER "${PROTO_NAME}.pb.h")
set(PROTO_SRC "${PROTO_NAME}.pb.cc")
message(STATUS "Protobuf ${proto} -> ${PROTO_DIR}/${PROTO_SRC} ${PROTO_DIR}/${PROTO_HEADER}")
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${PROTO_DIR})
message(STATUS ${CMAKE_CURRENT_BINARY_DIR})
add_custom_command(
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${PROTO_DIR}/${PROTO_SRC}"
"${CMAKE_CURRENT_BINARY_DIR}/${PROTO_DIR}/${PROTO_HEADER}"
COMMAND ${Protobuf_PROTOC_EXECUTABLE}
ARGS --cpp_out ${CMAKE_CURRENT_BINARY_DIR}/${PROTO_DIR} -I${CMAKE_CURRENT_SOURCE_DIR}/${PROTO_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${proto}
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${proto}" protobuf::libprotobuf Protobuf protobuf::protoc
COMMENT "${proto} -> ${PROTO_DIR}/${PROTO_SRC} ${PROTO_DIR}/${PROTO_HEADER}"
)
list(APPEND SOURCES "${CMAKE_CURRENT_BINARY_DIR}/${PROTO_DIR}/${PROTO_SRC}")
list(APPEND HEADERS "${CMAKE_CURRENT_BINARY_DIR}/${PROTO_DIR}/${PROTO_HEADER}")
endforeach()
set(${SRCS} ${SOURCES} PARENT_SCOPE)
set(${HDRS} ${HEADERS} PARENT_SCOPE)
endfunction()