# 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. # Helpers for configuring library targets. # Hide symbols from static archives linked into a shared library. This prevents # downstream libraries from accidentally binding to private archive symbols such # as those from libstdc++_nonshared.a. function(tvm_hide_static_linked_lib_symbols target_name) if(HIDE_PRIVATE_SYMBOLS AND CMAKE_SYSTEM_NAME MATCHES "Linux|Android|FreeBSD|NetBSD|OpenBSD" AND CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang" ) target_link_options(${target_name} PRIVATE "-Wl,--exclude-libs,ALL") endif() endfunction() ####################################################### # tvm_configure_target_library(target_name [RUNTIME_MODULE]) # # Configure a TVM library target. The target always gets a relative rpath # ($ORIGIN / @loader_path) so that sibling shared libraries in the same # directory resolve each other regardless of the install location (e.g. inside a # Python wheel). # # For shared libraries and runtime modules, hide symbols that come from linked # static archives so downstream libraries cannot accidentally bind to private # archive symbols such as those from libstdc++_nonshared.a. # # With the RUNTIME_MODULE option -- used for the optional runtime backend # libraries (tvm_runtime_cuda, tvm_runtime_vulkan, ...) -- the target is also # emitted into the build "lib" directory and installed; when building the Python # module it is additionally installed into the package "lib" directory. Targets # that manage their own output directory / install rules (tvm_compiler, # tvm_runtime, ...) omit the option and take only the rpath. # # No-op if the target does not exist. function(tvm_configure_target_library target_name) if(NOT TARGET ${target_name}) return() endif() cmake_parse_arguments(ARG "RUNTIME_MODULE" "" "" ${ARGN}) if(APPLE) set_target_properties(${target_name} PROPERTIES BUILD_RPATH "@loader_path" INSTALL_RPATH "@loader_path" ) elseif(UNIX) set_target_properties(${target_name} PROPERTIES BUILD_RPATH "\$ORIGIN" INSTALL_RPATH "\$ORIGIN" ) endif() get_target_property(TVM_TARGET_TYPE ${target_name} TYPE) if(TVM_TARGET_TYPE STREQUAL "SHARED_LIBRARY" OR TVM_TARGET_TYPE STREQUAL "MODULE_LIBRARY") tvm_hide_static_linked_lib_symbols(${target_name}) endif() if(ARG_RUNTIME_MODULE) set_target_properties(${target_name} PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" ) install(TARGETS ${target_name} DESTINATION lib${LIB_SUFFIX}) if(TVM_BUILD_PYTHON_MODULE) install(TARGETS ${target_name} DESTINATION "lib") endif() endif() endfunction()