Misc.cmake 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. include(CheckCXXCompilerFlag)
  2. # Flatten our header structure
  3. function(flatify target headers)
  4. foreach(header ${headers})
  5. get_filename_component(tgt ${header} NAME)
  6. configure_file(${header} ${target}/${tgt} @ONLY)
  7. endforeach(header ${headers})
  8. endfunction()
  9. function(add_optional_compile_options flags)
  10. foreach(flag ${flags})
  11. check_cxx_compiler_flag(-${flag} have-compiler-flag:-${flag})
  12. if (have-compiler-flag:-${flag})
  13. add_compile_options("-${flag}")
  14. endif()
  15. endforeach()
  16. endfunction()
  17. # Substitute vendor references in a file
  18. function(add_vendor_file)
  19. set(options)
  20. set(oneValueArgs OUTPUT INPUT MODE)
  21. set(multiValueArgs VARIABLES)
  22. cmake_parse_arguments(AVF "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
  23. set(in ${CMAKE_CURRENT_SOURCE_DIR}/${AVF_INPUT})
  24. set(out ${CMAKE_CURRENT_BINARY_DIR}/${AVF_OUTPUT})
  25. add_custom_command(
  26. OUTPUT ${out}
  27. COMMAND ${CMAKE_COMMAND} -DPROJECT_SOURCE_DIR=${PROJECT_SOURCE_DIR}
  28. "-DVARS=${AVF_VARIABLES}"
  29. -DCURRENT_VENDOR=${CURRENT_VENDOR}
  30. -DIN=${in}
  31. -DOUT=${out}
  32. -P ${PROJECT_SOURCE_DIR}/CMake/vendor_substitute.cmake
  33. COMMAND chmod ${AVF_MODE} ${out}
  34. DEPENDS ${in}
  35. ${PROJECT_SOURCE_DIR}/doc/apt-verbatim.ent
  36. ${PROJECT_SOURCE_DIR}/vendor/${CURRENT_VENDOR}/apt-vendor.ent
  37. ${PROJECT_SOURCE_DIR}/vendor/getinfo
  38. ${PROJECT_SOURCE_DIR}/CMake/vendor_substitute.cmake
  39. VERBATIM
  40. )
  41. # Woud like to use ${AVF_OUTPUT} as target name, but then ninja gets
  42. # cycles.
  43. add_custom_target(vendor-${AVF_OUTPUT} ALL DEPENDS ${out})
  44. endfunction()
  45. # Add symbolic links to a file
  46. function(add_slaves destination master)
  47. set(slaves "")
  48. foreach(slave ${ARGN})
  49. add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${slave}
  50. COMMAND ${CMAKE_COMMAND} -E create_symlink ${master} ${CMAKE_CURRENT_BINARY_DIR}/${slave})
  51. list(APPEND slaves ${CMAKE_CURRENT_BINARY_DIR}/${slave})
  52. endforeach()
  53. STRING(REPLACE "/" "-" master "${master}")
  54. add_custom_target(${master}-slaves ALL DEPENDS ${slaves})
  55. install(FILES ${slaves} DESTINATION ${destination})
  56. endfunction()
  57. # Generates a simple version script versioning everything with current SOVERSION
  58. function(add_version_script target)
  59. get_target_property(soversion ${target} SOVERSION)
  60. set(script "${CMAKE_CURRENT_BINARY_DIR}/${target}.versionscript")
  61. string(REPLACE "-" "" name "${target}_${soversion}")
  62. string(TOUPPER "${name}" name)
  63. add_custom_command(OUTPUT "${script}"
  64. COMMAND echo "${name} {global: *; };" > "${script}"
  65. VERBATIM )
  66. add_custom_target(${target}-versionscript DEPENDS "${script}")
  67. target_link_libraries(${target} PRIVATE -Wl,-version-script="${script}")
  68. add_dependencies(${target} ${target}-versionscript)
  69. endfunction()
  70. function(path_join out path1 path2)
  71. string(SUBSTRING ${path2} 0 1 init_char)
  72. if ("${init_char}" STREQUAL "/")
  73. set(${out} "${path2}" PARENT_SCOPE)
  74. else()
  75. set(${out} "${path1}/${path2}" PARENT_SCOPE)
  76. endif()
  77. endfunction()