directory.cmake 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #[[
  2. 文件名: directory.cmake
  3. 设置安装路径的程序
  4. ]]
  5. include_guard(GLOBAL) # 防止二次导入
  6. function(wi_set_install_dir_quiet)
  7. if (NOT CMAKE_SIZEOF_VOID_P) # 如果还未设定CMAKE_SIZEOF_VOID_P, 则现在设定该值
  8. try_run(run_re com_re ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/_void_p_test.c)
  9. if (com_re) # 编译正常
  10. set(CMAKE_SIZEOF_VOID_P ${run_re} CACHE INTERNAL ”“ FORCE)
  11. endif()
  12. endif()
  13. cmake_parse_arguments(i "" "NAMES" "" ${ARGN})
  14. if (i_NAMES)
  15. set(_names ${i_NAMES})
  16. else()
  17. set(_names ${PROJECT_NAME})
  18. endif()
  19. include(GNUInstallDirs)
  20. set(_lib ${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}) # 静态库的输出路径/动态库(或者动态库的导入文件)的输出路径
  21. set(_bin ${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}) # 可执行文件(以及.dll)的输出路径
  22. # 不能直接访问 PARENT_SCOPE 的参数, 因此设置_lib
  23. file(MAKE_DIRECTORY ${_lib})
  24. file(MAKE_DIRECTORY ${_bin})
  25. set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${_lib} PARENT_SCOPE)
  26. set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${_lib} PARENT_SCOPE)
  27. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${_bin} PARENT_SCOPE)
  28. if(WIN32 OR CYGWIN) # cygwin和windows使用相同的文件结构
  29. set(DEF_INSTALL_CMAKEDIR cmake)
  30. set(DEF_INSTALL_INCLUDEDIR ${CMAKE_INSTALL_INCLUDEDIR})
  31. set(DEF_INSTALL_RESOURCEDIR ${CMAKE_INSTALL_DATAROOTDIR}) # 关联文件
  32. else()
  33. # unix类系统(Unix, Linux, MacOS, Cygwin等)把cmake文件安装到指定的系统的cmake文件夹中
  34. set(DEF_INSTALL_CMAKEDIR ${CMAKE_INSTALL_DATAROOTDIR}/cmake/${_names})
  35. set(DEF_INSTALL_INCLUDEDIR ${CMAKE_INSTALL_INCLUDEDIR}/${_names})
  36. set(DEF_INSTALL_RESOURCEDIR ${CMAKE_INSTALL_DATAROOTDIR}/${_names}) # 关联文件 CMAKE_INSTALL_DATAROOTDIR指: share
  37. endif()
  38. # 设定安装的目录
  39. set(INSTALL_BINDIR ${CMAKE_INSTALL_BINDIR} CACHE PATH "Installation directory for executables")
  40. set(INSTALL_LIBDIR ${CMAKE_INSTALL_LIBDIR} CACHE PATH "Installation directory for libraries")
  41. set(INSTALL_CMAKEDIR ${DEF_INSTALL_CMAKEDIR} CACHE PATH "Installation directory for CMake files")
  42. set(INSTALL_INCLUDEDIR ${DEF_INSTALL_INCLUDEDIR} CACHE PATH "Installation directory for header files")
  43. set(INSTALL_RESOURCEDIR ${DEF_INSTALL_RESOURCEDIR} CACHE PATH "Installation directory for resource files") # 关联文件
  44. unset(DEF_INSTALL_CMAKEDIR)
  45. unset(DEF_INSTALL_INCLUDEDIR)
  46. unset(DEF_INSTALL_RESOURCEDIR)
  47. endfunction()
  48. function(wi_set_install_dir)
  49. set(_argn ${ARGN})
  50. wi_set_install_dir_quiet(${_argn})
  51. set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} PARENT_SCOPE) # 静态库的输出路径
  52. set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} PARENT_SCOPE) # 动态库(或者动态库的导入文件)的输出路径
  53. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} PARENT_SCOPE) # 可执行文件(以及.dll)的输出路径
  54. # 报告构建路径
  55. foreach(p ARCHIVE LIBRARY RUNTIME)
  56. message(STATUS "Build ${p} at ${CMAKE_${p}_OUTPUT_DIRECTORY}")
  57. endforeach()
  58. # 报告安装路径
  59. foreach(p LIB BIN INCLUDE RESOURCE CMAKE)
  60. message(STATUS "Install ${p} at ${CMAKE_INSTALL_PREFIX}/${INSTALL_${p}DIR}")
  61. endforeach()
  62. endfunction()