mirror of
https://github.com/zebrajr/pytorch.git
synced 2025-12-06 12:20:52 +01:00
* Caffe2 module update: move observers as well as binaries. * Add threads linkage * Add Threads dependency to public interface
99 lines
4.5 KiB
CMake
99 lines
4.5 KiB
CMake
macro(caffe2_interface_library SRC DST)
|
|
# Add an interface library definition that is dependent on the source.
|
|
add_library(${DST} INTERFACE)
|
|
add_dependencies(${DST} ${SRC})
|
|
# Depending on the nature of the source library as well as the compiler,
|
|
# determine the needed compilation flags.
|
|
get_target_property(__src_target_type ${SRC} TYPE)
|
|
# Depending on the type of the source library, we will set up the
|
|
# link command for the specific SRC library.
|
|
if (${__src_target_type} STREQUAL "STATIC_LIBRARY")
|
|
# In the case of static library, we will need to add whole-static flags.
|
|
if(APPLE)
|
|
target_link_libraries(
|
|
${DST} INTERFACE -Wl,-force_load,$<TARGET_FILE:${SRC}>)
|
|
elseif(MSVC)
|
|
# In MSVC, we will add whole archive in default.
|
|
target_link_libraries(
|
|
${DST} INTERFACE -WHOLEARCHIVE:$<TARGET_FILE:${SRC}>)
|
|
else()
|
|
# Assume everything else is like gcc
|
|
target_link_libraries(
|
|
${DST} INTERFACE
|
|
"-Wl,--whole-archive $<TARGET_FILE:${SRC}> -Wl,--no-whole-archive")
|
|
endif()
|
|
# Link all interface link libraries of the src target as well.
|
|
# For static library, we need to explicitly depend on all the libraries
|
|
# that are the dependent library of the source library. Note that we cannot
|
|
# use the populated INTERFACE_LINK_LIBRARIES property, because if one of the
|
|
# dependent library is not a target, cmake creates a $<LINK_ONLY:src> wrapper
|
|
# and then one is not able to find target "src". For more discussions, check
|
|
# https://gitlab.kitware.com/cmake/cmake/issues/15415
|
|
# https://cmake.org/pipermail/cmake-developers/2013-May/019019.html
|
|
# Specifically the following quote
|
|
#
|
|
# """
|
|
# For STATIC libraries we can define that the PUBLIC/PRIVATE/INTERFACE keys
|
|
# are ignored for linking and that it always populates both LINK_LIBRARIES
|
|
# LINK_INTERFACE_LIBRARIES. Note that for STATIC libraries the
|
|
# LINK_LIBRARIES property will not be used for anything except build-order
|
|
# dependencies.
|
|
# """
|
|
target_link_libraries(${DST} INTERFACE
|
|
$<TARGET_PROPERTY:${SRC},LINK_LIBRARIES>)
|
|
elseif(${__src_target_type} STREQUAL "SHARED_LIBRARY")
|
|
if("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
|
|
target_link_libraries(
|
|
${DST} INTERFACE -Wl,--no-as-needed ${SRC} -Wl,--as-needed)
|
|
else()
|
|
target_link_libraries(${DST} INTERFACE ${SRC})
|
|
endif()
|
|
# Link all interface link libraries of the src target as well.
|
|
# For shared libraries, we can simply depend on the INTERFACE_LINK_LIBRARIES
|
|
# property of the target.
|
|
target_link_libraries(${DST} INTERFACE
|
|
$<TARGET_PROPERTY:${SRC},INTERFACE_LINK_LIBRARIES>)
|
|
else()
|
|
message(FATAL_ERROR
|
|
"You made a CMake build file error: target " ${SRC}
|
|
" must be of type either STATIC_LIBRARY or SHARED_LIBRARY. However, "
|
|
"I got " ${__src_target_type} ".")
|
|
endif()
|
|
# For all other interface properties, manually inherit from the source target.
|
|
set_target_properties(${DST} PROPERTIES
|
|
INTERFACE_COMPILE_DEFINITIONS
|
|
$<TARGET_PROPERTY:${SRC},INTERFACE_COMPILE_DEFINITIONS>
|
|
INTERFACE_COMPILE_OPTIONS
|
|
$<TARGET_PROPERTY:${SRC},INTERFACE_COMPILE_OPTIONS>
|
|
INTERFACE_INCLUDE_DIRECTORIES
|
|
$<TARGET_PROPERTY:${SRC},INTERFACE_INCLUDE_DIRECTORIES>
|
|
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES
|
|
$<TARGET_PROPERTY:${SRC},INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>)
|
|
endmacro()
|
|
|
|
|
|
##############################################################################
|
|
# Creating a Caffe2 binary target with sources specified with relative path.
|
|
# Usage:
|
|
# caffe2_binary_target(target_name_or_src <src1> [<src2>] [<src3>] ...)
|
|
# If only target_name_or_src is specified, this target is build with one single
|
|
# source file and the target name is autogen from the filename. Otherwise, the
|
|
# target name is given by the first argument and the rest are the source files
|
|
# to build the target.
|
|
function(caffe2_binary_target target_name_or_src)
|
|
if (${ARGN})
|
|
set(__target ${target_name_or_src})
|
|
prepend(__srcs "${CMAKE_CURRENT_SOURCE_DIR}/" "${ARGN}")
|
|
else()
|
|
get_filename_component(__target ${target_name_or_src} NAME_WE)
|
|
prepend(__srcs "${CMAKE_CURRENT_SOURCE_DIR}/" "${target_name_or_src}")
|
|
endif()
|
|
add_executable(${__target} ${__srcs})
|
|
target_link_libraries(${__target} ${Caffe2_MAIN_LIBS})
|
|
# If we have Caffe2_MODULES defined, we will also link with the modules.
|
|
if (DEFINED Caffe2_MODULES)
|
|
target_link_libraries(${__target} ${Caffe2_MODULES})
|
|
endif()
|
|
install(TARGETS ${__target} DESTINATION bin)
|
|
endfunction()
|