224 lines
11 KiB
CMake
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()
|