CMakeLists.txt 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. cmake_minimum_required(VERSION 3.18)
  2. project(torchvision)
  3. set(CMAKE_CXX_STANDARD 17)
  4. file(STRINGS version.txt TORCHVISION_VERSION)
  5. option(WITH_CUDA "Enable CUDA support" OFF)
  6. option(WITH_MPS "Enable MPS support" OFF)
  7. option(WITH_PNG "Enable features requiring LibPNG." ON)
  8. option(WITH_JPEG "Enable features requiring LibJPEG." ON)
  9. option(USE_PYTHON "Link to Python when building" OFF)
  10. if(WITH_CUDA)
  11. enable_language(CUDA)
  12. add_definitions(-D__CUDA_NO_HALF_OPERATORS__)
  13. add_definitions(-DWITH_CUDA)
  14. set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} --expt-relaxed-constexpr")
  15. endif()
  16. if(WITH_MPS)
  17. enable_language(OBJC OBJCXX)
  18. add_definitions(-DWITH_MPS)
  19. endif()
  20. find_package(Torch REQUIRED)
  21. if (WITH_PNG)
  22. add_definitions(-DPNG_FOUND)
  23. find_package(PNG REQUIRED)
  24. endif()
  25. if (WITH_JPEG)
  26. add_definitions(-DJPEG_FOUND)
  27. find_package(JPEG REQUIRED)
  28. endif()
  29. if (USE_PYTHON)
  30. add_definitions(-DUSE_PYTHON)
  31. find_package(Python3 REQUIRED COMPONENTS Development)
  32. endif()
  33. function(CUDA_CONVERT_FLAGS EXISTING_TARGET)
  34. get_property(old_flags TARGET ${EXISTING_TARGET} PROPERTY INTERFACE_COMPILE_OPTIONS)
  35. if(NOT "${old_flags}" STREQUAL "")
  36. string(REPLACE ";" "," CUDA_flags "${old_flags}")
  37. set_property(TARGET ${EXISTING_TARGET} PROPERTY INTERFACE_COMPILE_OPTIONS
  38. "$<$<BUILD_INTERFACE:$<COMPILE_LANGUAGE:CXX>>:${old_flags}>$<$<BUILD_INTERFACE:$<COMPILE_LANGUAGE:CUDA>>:-Xcompiler=${CUDA_flags}>"
  39. )
  40. endif()
  41. endfunction()
  42. if(MSVC)
  43. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4819")
  44. if(WITH_CUDA)
  45. set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -Xcompiler=/wd4819")
  46. foreach(diag cc_clobber_ignored integer_sign_change useless_using_declaration
  47. set_but_not_used field_without_dll_interface
  48. base_class_has_different_dll_interface
  49. dll_interface_conflict_none_assumed
  50. dll_interface_conflict_dllexport_assumed
  51. implicit_return_from_non_void_function
  52. unsigned_compare_with_zero
  53. declared_but_not_referenced
  54. bad_friend_decl)
  55. string(APPEND CMAKE_CUDA_FLAGS " -Xcudafe --diag_suppress=${diag}")
  56. endforeach()
  57. CUDA_CONVERT_FLAGS(torch_cpu)
  58. if(TARGET torch_cuda)
  59. CUDA_CONVERT_FLAGS(torch_cuda)
  60. endif()
  61. if(TARGET torch_cuda_cu)
  62. CUDA_CONVERT_FLAGS(torch_cuda_cu)
  63. endif()
  64. if(TARGET torch_cuda_cpp)
  65. CUDA_CONVERT_FLAGS(torch_cuda_cpp)
  66. endif()
  67. endif()
  68. endif()
  69. include(GNUInstallDirs)
  70. include(CMakePackageConfigHelpers)
  71. set(TVCPP torchvision/csrc)
  72. list(APPEND ALLOW_LISTED ${TVCPP} ${TVCPP}/io/image ${TVCPP}/io/image/cpu ${TVCPP}/models ${TVCPP}/ops
  73. ${TVCPP}/ops/autograd ${TVCPP}/ops/cpu ${TVCPP}/io/image/cuda)
  74. if(WITH_CUDA)
  75. list(APPEND ALLOW_LISTED ${TVCPP}/ops/cuda ${TVCPP}/ops/autocast)
  76. endif()
  77. if(WITH_MPS)
  78. list(APPEND ALLOW_LISTED ${TVCPP}/ops/mps)
  79. endif()
  80. FOREACH(DIR ${ALLOW_LISTED})
  81. file(GLOB ALL_SOURCES ${ALL_SOURCES} ${DIR}/*.*)
  82. ENDFOREACH()
  83. add_library(${PROJECT_NAME} SHARED ${ALL_SOURCES})
  84. target_link_libraries(${PROJECT_NAME} PRIVATE ${TORCH_LIBRARIES})
  85. if (WITH_PNG)
  86. target_link_libraries(${PROJECT_NAME} PRIVATE ${PNG_LIBRARY})
  87. endif()
  88. if (WITH_JPEG)
  89. target_link_libraries(${PROJECT_NAME} PRIVATE ${JPEG_LIBRARIES})
  90. endif()
  91. if (USE_PYTHON)
  92. target_link_libraries(${PROJECT_NAME} PRIVATE Python3::Python)
  93. endif()
  94. set_target_properties(${PROJECT_NAME} PROPERTIES
  95. EXPORT_NAME TorchVision
  96. INSTALL_RPATH ${TORCH_INSTALL_PREFIX}/lib)
  97. include_directories(torchvision/csrc)
  98. if (WITH_PNG)
  99. include_directories(${PNG_INCLUDE_DIRS})
  100. endif()
  101. if (WITH_JPEG)
  102. include_directories(${JPEG_INCLUDE_DIRS})
  103. endif()
  104. set(TORCHVISION_CMAKECONFIG_INSTALL_DIR "share/cmake/TorchVision" CACHE STRING "install path for TorchVisionConfig.cmake")
  105. configure_package_config_file(cmake/TorchVisionConfig.cmake.in
  106. "${CMAKE_CURRENT_BINARY_DIR}/TorchVisionConfig.cmake"
  107. INSTALL_DESTINATION ${TORCHVISION_CMAKECONFIG_INSTALL_DIR})
  108. write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/TorchVisionConfigVersion.cmake
  109. VERSION ${TORCHVISION_VERSION}
  110. COMPATIBILITY AnyNewerVersion)
  111. install(FILES ${CMAKE_CURRENT_BINARY_DIR}/TorchVisionConfig.cmake
  112. ${CMAKE_CURRENT_BINARY_DIR}/TorchVisionConfigVersion.cmake
  113. DESTINATION ${TORCHVISION_CMAKECONFIG_INSTALL_DIR})
  114. install(TARGETS ${PROJECT_NAME}
  115. EXPORT TorchVisionTargets
  116. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  117. )
  118. install(EXPORT TorchVisionTargets
  119. NAMESPACE TorchVision::
  120. DESTINATION ${TORCHVISION_CMAKECONFIG_INSTALL_DIR})
  121. FOREACH(INPUT_DIR ${ALLOW_LISTED})
  122. string(REPLACE "${TVCPP}" "${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}" OUTPUT_DIR ${INPUT_DIR})
  123. file(GLOB INPUT_FILES ${INPUT_DIR}/*.*)
  124. install(FILES ${INPUT_FILES} DESTINATION ${OUTPUT_DIR})
  125. ENDFOREACH()