Files
2026-07-13 12:40:42 +08:00

480 lines
17 KiB
CMake

include(${PROJECT_SOURCE_DIR}/cmake/architecture.cmake)
paddle_normalize_target_arch(CINN_HOST_ARCH)
set(CINN_X86_CXX_FLAGS "")
if(CINN_HOST_ARCH STREQUAL "x86_64")
set(CINN_X86_CXX_FLAGS " -mavx -mfma")
endif()
set(CMAKE_CXX_FLAGS
"${CMAKE_CXX_FLAGS} -fPIC${CINN_X86_CXX_FLAGS} -Wno-write-strings -Wno-psabi"
)
set(PADDLE_RESOURCE_URL
"http://paddle-inference-dist.bj.bcebos.com"
CACHE STRING "inference download url")
function(cinn_cc_library TARGET_NAME)
set(options STATIC static SHARED shared)
set(oneValueArgs "")
set(multiValueArgs SRCS DEPS)
cmake_parse_arguments(cinn_cc_library "${options}" "${oneValueArgs}"
"${multiValueArgs}" ${ARGN})
if(cinn_cc_library_SRCS)
if(cinn_cc_library_SHARED OR cinn_cc_library_shared) # build *.so
add_library(${TARGET_NAME} SHARED ${cinn_cc_library_SRCS})
else()
add_library(${TARGET_NAME} STATIC ${cinn_cc_library_SRCS})
endif()
if(cinn_cc_library_DEPS)
target_link_libraries(${TARGET_NAME} ${cinn_cc_library_DEPS})
add_dependencies(${TARGET_NAME} ${cinn_cc_library_DEPS})
endif()
# cpplint code style
foreach(source_file ${cinn_cc_library_SRCS})
string(REGEX REPLACE "\\.[^.]*$" "" source ${source_file})
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${source}.h)
list(APPEND cinn_cc_library_HEADERS
${CMAKE_CURRENT_SOURCE_DIR}/${source}.h)
endif()
endforeach()
else()
if(cinn_cc_library_DEPS)
cinn_merge_static_libs(${TARGET_NAME} ${cinn_cc_library_DEPS})
else()
message(
FATAL_ERROR
"Please specify source files or libraries in cinn_cc_library(${TARGET_NAME} ...)."
)
endif()
endif()
if((NOT ("${TARGET_NAME}" STREQUAL "cinn_gtest_main"))
AND (NOT ("${TARGET_NAME}" STREQUAL "utils"))
AND (NOT ("${TARGET_NAME}" STREQUAL "lib")))
target_link_libraries(${TARGET_NAME} Threads::Threads)
endif(
(NOT ("${TARGET_NAME}" STREQUAL "cinn_gtest_main"))
AND (NOT ("${TARGET_NAME}" STREQUAL "utils"))
AND (NOT ("${TARGET_NAME}" STREQUAL "lib")))
endfunction()
list(APPEND CMAKE_CTEST_ARGUMENTS)
function(remove_gflags TARGET_NAME)
get_target_property(TARGET_LIBRARIES ${TARGET_NAME} LINK_LIBRARIES)
list(REMOVE_ITEM TARGET_LIBRARIES glog)
list(REMOVE_ITEM TARGET_LIBRARIES gflags)
set_property(TARGET ${TARGET_NAME} PROPERTY LINK_LIBRARIES
${TARGET_LIBRARIES})
endfunction()
function(cinn_cc_test TARGET_NAME)
if(WITH_TESTING)
set(options SERIAL)
set(oneValueArgs "")
set(multiValueArgs SRCS DEPS ARGS)
cmake_parse_arguments(cinn_cc_test "${options}" "${oneValueArgs}"
"${multiValueArgs}" ${ARGN})
add_executable(${TARGET_NAME} ${cinn_cc_test_SRCS})
get_property(os_dependency_modules GLOBAL PROPERTY OS_DEPENDENCY_MODULES)
target_link_libraries(${TARGET_NAME} ${os_dependency_modules}
paddle_gtest_main gtest glog ${cinn_cc_test_DEPS})
if(WITH_SHARED_PHI)
target_link_libraries(${TARGET_NAME} -Wl,--as-needed phi_core phi_gpu
-Wl,--no-as-needed)
endif()
add_dependencies(${TARGET_NAME} paddle_gtest_main gtest glog
${cinn_cc_test_DEPS})
add_test(
NAME ${TARGET_NAME}
COMMAND ${TARGET_NAME} "${cinn_cc_test_ARGS}"
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
if(${cinn_cc_test_SERIAL})
set_property(TEST ${TARGET_NAME} PROPERTY RUN_SERIAL 1)
endif()
# No unit test should exceed 10 minutes.
set_tests_properties(${TARGET_NAME} PROPERTIES TIMEOUT 6000)
remove_gflags(${TARGET_NAME})
endif()
endfunction()
function(cinn_nv_library TARGET_NAME)
if(WITH_GPU)
set(options STATIC static SHARED shared)
set(oneValueArgs "")
set(multiValueArgs SRCS DEPS)
cmake_parse_arguments(cinn_nv_library "${options}" "${oneValueArgs}"
"${multiValueArgs}" ${ARGN})
if(cinn_nv_library_SRCS)
if(cinn_nv_library_SHARED OR cinn_nv_library_shared) # build *.so
cuda_add_library(${TARGET_NAME} SHARED ${cinn_nv_library_SRCS})
else()
cuda_add_library(${TARGET_NAME} STATIC ${cinn_nv_library_SRCS})
endif()
if(cinn_nv_library_DEPS)
add_dependencies(${TARGET_NAME} ${cinn_nv_library_DEPS})
target_link_libraries(${TARGET_NAME} ${cinn_nv_library_DEPS})
endif()
# cpplint code style
foreach(source_file ${cinn_nv_library_SRCS})
string(REGEX REPLACE "\\.[^.]*$" "" source ${source_file})
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${source}.h)
list(APPEND cinn_nv_library_HEADERS
${CMAKE_CURRENT_SOURCE_DIR}/${source}.h)
endif()
endforeach()
else()
if(cinn_nv_library_DEPS)
cinn_merge_static_libs(${TARGET_NAME} ${cinn_nv_library_DEPS})
else()
message(FATAL
"Please specify source file or library in cinn_nv_library.")
endif()
endif()
target_link_libraries(${TARGET_NAME} Threads::Threads)
endif()
endfunction()
function(cinn_nv_binary TARGET_NAME)
if(WITH_GPU)
set(options "")
set(oneValueArgs "")
set(multiValueArgs SRCS DEPS)
cmake_parse_arguments(cinn_nv_binary "${options}" "${oneValueArgs}"
"${multiValueArgs}" ${ARGN})
add_executable(${TARGET_NAME} ${cinn_nv_binary_SRCS})
if(cinn_nv_binary_DEPS)
target_link_libraries(${TARGET_NAME} ${cinn_nv_binary_DEPS})
add_dependencies(${TARGET_NAME} ${cinn_nv_binary_DEPS})
common_link(${TARGET_NAME})
endif()
endif()
endfunction()
function(cinn_nv_test TARGET_NAME)
if(WITH_GPU AND WITH_TESTING)
set(options SERIAL)
set(oneValueArgs "")
set(multiValueArgs SRCS DEPS ARGS)
cmake_parse_arguments(cinn_nv_test "${options}" "${oneValueArgs}"
"${multiValueArgs}" ${ARGN})
# Attention:
# 1. cuda_add_executable is deprecated after cmake v3.10, use add_executable for CUDA please.
# 2. cuda_add_executable does not support ccache.
# Reference: https://cmake.org/cmake/help/v3.10/module/FindCUDA.html
add_executable(${TARGET_NAME} ${cinn_nv_test_SRCS})
get_property(os_dependency_modules GLOBAL PROPERTY OS_DEPENDENCY_MODULES)
target_link_libraries(
${TARGET_NAME}
${cinn_nv_test_DEPS}
paddle_gtest_main
gtest
${os_dependency_modules}
${CUDNN_LIBRARY}
${CUBLAS_LIBRARIES}
${CUDA_LIBRARIES})
if(WITH_SHARED_PHI)
target_link_libraries(${TARGET_NAME} -Wl,--as-needed phi_core phi_gpu
-Wl,--no-as-needed)
endif()
add_dependencies(${TARGET_NAME} ${cinn_nv_test_DEPS} paddle_gtest_main
gtest)
common_link(${TARGET_NAME})
add_test(
NAME ${TARGET_NAME}
COMMAND ${TARGET_NAME} "${cinn_nv_test_ARGS}"
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
if(cinn_nv_test_SERIAL)
set_property(TEST ${TARGET_NAME} PROPERTY RUN_SERIAL 1)
endif()
target_link_libraries(
${TARGET_NAME} Threads::Threads ${CUDA_NVRTC_LIB} ${CUDA_LIBRARIES}
${CUDA_cudart_static_LIBRARY}
${CUDA_TOOLKIT_ROOT_DIR}/lib64/stubs/libcuda.so)
if(NVTX_FOUND)
target_link_libraries(${TARGET_NAME} ${CUDA_NVTX_LIB})
endif()
remove_gflags(${TARGET_NAME})
endif()
endfunction()
# Add dependency that TARGET will depend on test result of DEP, this function executes the DEP during make.
function(add_run_test_dependency TARGET_NAME DEP_NAME)
if(WITH_TESTING)
set(custom_target_name ${TARGET_NAME}_TEST_OUTPUT_DEPENDENCY_ON_${DEP_NAME})
add_custom_target(
${custom_target_name}
COMMAND
cd ${CMAKE_CURRENT_BINARY_DIR} && ./${DEP_NAME}
--cinn_x86_builtin_code_root=${CMAKE_SOURCE_DIR}/paddle/cinn/backends
COMMAND cd ${CMAKE_BINARY_DIR}
DEPENDS ${DEP_NAME})
add_dependencies(${TARGET_NAME} ${DEP_NAME} ${custom_target_name})
endif()
endfunction()
# find all third_party modules is used for paddle static library
# for reduce the dependency when building the inference libs.
set_property(GLOBAL PROPERTY FLUID_THIRD_PARTY)
function(find_fluid_thirdparties TARGET_NAME)
get_filename_component(__target_path ${TARGET_NAME} ABSOLUTE)
string(REGEX REPLACE "^${PADDLE_SOURCE_DIR}/" "" __target_path
${__target_path})
string(FIND "${__target_path}" "third_party" pos)
if(pos GREATER 1)
get_property(fluid_ GLOBAL PROPERTY FLUID_THIRD_PARTY)
set(fluid_third_partys ${fluid_third_partys} ${TARGET_NAME})
set_property(GLOBAL PROPERTY FLUID_THIRD_PARTY "${fluid_third_partys}")
endif()
endfunction()
function(cinn_merge_static_libs TARGET_NAME)
set(libs ${ARGN})
list(REMOVE_DUPLICATES libs)
# Get all propagation dependencies from the merged libraries
foreach(lib ${libs})
list(APPEND libs_deps ${${lib}_LIB_DEPENDS})
endforeach()
if(libs_deps)
list(REMOVE_DUPLICATES libs_deps)
endif()
# To produce a library we need at least one source file.
# It is created by add_custom_command below and will helps
# also help to track dependencies.
set(target_SRCS ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}_dummy.c)
if(APPLE) # Use OSX's libtool to merge archives
# Make the generated dummy source file depended on all static input
# libs. If input lib changes, the source file is touched
# which causes the desired effect (relink).
add_custom_command(
OUTPUT ${target_SRCS}
COMMAND ${CMAKE_COMMAND} -E touch ${target_SRCS}
DEPENDS ${libs})
# Generate dummy static lib
file(WRITE ${target_SRCS}
"const char *dummy_${TARGET_NAME} = \"${target_SRCS}\";")
add_library(${TARGET_NAME} STATIC ${target_SRCS})
target_link_libraries(${TARGET_NAME} ${libs_deps})
foreach(lib ${libs})
# Get the file names of the libraries to be merged
set(libfiles ${libfiles} $<TARGET_FILE:${lib}>)
endforeach()
add_custom_command(
TARGET ${TARGET_NAME}
POST_BUILD
COMMAND rm "${CMAKE_CURRENT_BINARY_DIR}/lib${TARGET_NAME}.a"
COMMAND /usr/bin/libtool -static -o
"${CMAKE_CURRENT_BINARY_DIR}/lib${TARGET_NAME}.a" ${libfiles})
endif()
if(LINUX
)# general UNIX: use "ar" to extract objects and re-add to a common lib
set(target_DIR ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}.dir)
foreach(lib ${libs})
set(objlistfile ${target_DIR}/${lib}.objlist
)# list of objects in the input library
set(objdir ${target_DIR}/${lib}.objdir)
add_custom_command(
OUTPUT ${objdir}
COMMAND ${CMAKE_COMMAND} -E make_directory ${objdir}
DEPENDS ${lib})
add_custom_command(
OUTPUT ${objlistfile}
COMMAND ${CMAKE_AR} -x "$<TARGET_FILE:${lib}>"
COMMAND ${CMAKE_AR} -t "$<TARGET_FILE:${lib}>" > ${objlistfile}
DEPENDS ${lib} ${objdir}
WORKING_DIRECTORY ${objdir})
list(APPEND target_OBJS "${objlistfile}")
endforeach()
# Make the generated dummy source file depended on all static input
# libs. If input lib changes, the source file is touched
# which causes the desired effect (relink).
add_custom_command(
OUTPUT ${target_SRCS}
COMMAND ${CMAKE_COMMAND} -E touch ${target_SRCS}
DEPENDS ${libs} ${target_OBJS})
# Generate dummy static lib
file(WRITE ${target_SRCS}
"const char *dummy_${TARGET_NAME} = \"${target_SRCS}\";")
add_library(${TARGET_NAME} STATIC ${target_SRCS})
target_link_libraries(${TARGET_NAME} ${libs_deps})
# Get the file name of the generated library
set(target_LIBNAME "$<TARGET_FILE:${TARGET_NAME}>")
add_custom_command(
TARGET ${TARGET_NAME}
POST_BUILD
COMMAND ${CMAKE_AR} crs ${target_LIBNAME} `find ${target_DIR} -name '*.o'`
COMMAND ${CMAKE_RANLIB} ${target_LIBNAME}
WORKING_DIRECTORY ${target_DIR})
endif()
if(WIN32)
# windows do not support gcc/nvcc combined compiling. Use msvc lib.exe to merge libs.
# Make the generated dummy source file depended on all static input
# libs. If input lib changes, the source file is touched
# which causes the desired effect (relink).
add_custom_command(
OUTPUT ${target_SRCS}
COMMAND ${CMAKE_COMMAND} -E touch ${target_SRCS}
DEPENDS ${libs})
# Generate dummy static lib
file(WRITE ${target_SRCS}
"const char *dummy_${TARGET_NAME} = \"${target_SRCS}\";")
add_library(${TARGET_NAME} STATIC ${target_SRCS})
target_link_libraries(${TARGET_NAME} ${libs_deps})
foreach(lib ${libs})
# Get the file names of the libraries to be merged
set(libfiles ${libfiles} $<TARGET_FILE:${lib}>)
endforeach()
# msvc will put library in directory of "/Release/xxxlib" by default
# COMMAND cmake -E remove "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}/${TARGET_NAME}.lib"
add_custom_command(
TARGET ${TARGET_NAME}
POST_BUILD
COMMAND cmake -E make_directory
"${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}"
COMMAND
lib
/OUT:${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}/lib${TARGET_NAME}.lib
${libfiles})
endif()
endfunction()
# Modification of standard 'protobuf_generate_cpp()' with protobuf-lite support
# Usage:
# paddle_protobuf_generate_cpp(<proto_srcs> <proto_hdrs> <proto_files>)
function(paddle_protobuf_generate_cpp SRCS HDRS)
if(NOT ARGN)
message(
SEND_ERROR
"Error: paddle_protobuf_generate_cpp() called without any proto files")
return()
endif()
set(${SRCS})
set(${HDRS})
foreach(FIL ${ARGN})
get_filename_component(ABS_FIL ${FIL} ABSOLUTE)
get_filename_component(FIL_WE ${FIL} NAME_WE)
set(_protobuf_protoc_src "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.cc")
set(_protobuf_protoc_hdr "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.h")
list(APPEND ${SRCS} "${_protobuf_protoc_src}")
list(APPEND ${HDRS} "${_protobuf_protoc_hdr}")
add_custom_command(
OUTPUT "${_protobuf_protoc_src}" "${_protobuf_protoc_hdr}"
COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}"
COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} -I${CMAKE_SOURCE_DIR} --cpp_out
"${CMAKE_BINARY_DIR}" ${ABS_FIL}
DEPENDS ${ABS_FIL} protoc
COMMENT "Running C++ protocol buffer compiler on ${FIL}"
VERBATIM)
endforeach()
set_source_files_properties(${${SRCS}} ${${HDRS}} PROPERTIES GENERATED TRUE)
set(${SRCS}
${${SRCS}}
PARENT_SCOPE)
set(${HDRS}
${${HDRS}}
PARENT_SCOPE)
endfunction()
function(cinn_proto_library TARGET_NAME)
set(oneValueArgs "")
set(multiValueArgs SRCS DEPS)
cmake_parse_arguments(cinn_proto_library "${options}" "${oneValueArgs}"
"${multiValueArgs}" ${ARGN})
set(proto_srcs)
set(proto_hdrs)
paddle_protobuf_generate_cpp(proto_srcs proto_hdrs ${cinn_proto_library_SRCS})
cinn_cc_library(${TARGET_NAME} SRCS ${proto_srcs} DEPS
${cinn_proto_library_DEPS} protobuf)
set("${TARGET_NAME}_HDRS"
${proto_hdrs}
PARENT_SCOPE)
set("${TARGET_NAME}_SRCS"
${proto_srcs}
PARENT_SCOPE)
endfunction()
function(common_link TARGET_NAME)
if(WITH_PROFILER)
target_link_libraries(${TARGET_NAME} gperftools::profiler)
endif()
if(WITH_JEMALLOC)
target_link_libraries(${TARGET_NAME} jemalloc::jemalloc)
endif()
endfunction()
# This method is borrowed from Paddle-Lite.
function(download_and_uncompress INSTALL_DIR URL FILENAME)
message(STATUS "Download inference test stuff from ${URL}/${FILENAME}")
string(REGEX REPLACE "[-%.]" "_" FILENAME_EX ${FILENAME})
set(EXTERNAL_PROJECT_NAME "extern_lite_download_${FILENAME_EX}")
set(UNPACK_DIR "${INSTALL_DIR}/src/${EXTERNAL_PROJECT_NAME}")
ExternalProject_Add(
${EXTERNAL_PROJECT_NAME}
${EXTERNAL_PROJECT_LOG_ARGS}
PREFIX ${INSTALL_DIR}
DOWNLOAD_COMMAND
/bin/sh -c
"[ -f '${FILENAME}' ] && echo 'skip download' || wget --no-check-certificate -q -O '${FILENAME}' '${URL}/${FILENAME}'"
&& ${CMAKE_COMMAND} -E tar xzf ${FILENAME}
DOWNLOAD_DIR ${INSTALL_DIR}
DOWNLOAD_NO_PROGRESS 1
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
UPDATE_COMMAND ""
INSTALL_COMMAND "")
endfunction()
function(gather_srcs SRC_GROUP)
set(options)
set(oneValueArgs)
set(multiValueArgs "SRCS")
cmake_parse_arguments(prefix "" "" "${multiValueArgs}" ${ARGN})
foreach(cpp ${prefix_SRCS})
set(${SRC_GROUP}
"${${SRC_GROUP}};${CMAKE_CURRENT_SOURCE_DIR}/${cpp}"
CACHE INTERNAL "")
endforeach()
endfunction()
function(core_gather_headers)
file(
GLOB includes
LIST_DIRECTORIES false
RELATIVE ${CMAKE_SOURCE_DIR}
*.h)
foreach(header ${includes})
set(core_includes
"${core_includes};${header}"
CACHE INTERNAL "")
endforeach()
endfunction()