]> git.saurik.com Git - apt.git/blob - CMake/Misc.cmake
Do not (re)start "apt-daily.system"
[apt.git] / CMake / Misc.cmake
1 include(CheckCXXCompilerFlag)
2
3 # Flatten our header structure
4 function(flatify target headers)
5 foreach(header ${headers})
6 get_filename_component(tgt ${header} NAME)
7 configure_file(${header} ${target}/${tgt} COPYONLY)
8 endforeach(header ${headers})
9 endfunction()
10
11
12 function(add_optional_compile_options flags)
13 foreach(flag ${flags})
14 check_cxx_compiler_flag(-${flag} have-compiler-flag:-${flag})
15 if (have-compiler-flag:-${flag})
16 add_compile_options("-${flag}")
17 endif()
18 endforeach()
19 endfunction()
20
21 # Substitute vendor references in a file
22 function(add_vendor_file)
23 set(options)
24 set(oneValueArgs OUTPUT INPUT MODE)
25 set(multiValueArgs VARIABLES)
26 cmake_parse_arguments(AVF "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
27
28 set(in ${CMAKE_CURRENT_SOURCE_DIR}/${AVF_INPUT})
29 set(out ${CMAKE_CURRENT_BINARY_DIR}/${AVF_OUTPUT})
30
31 add_custom_command(
32 OUTPUT ${out}
33 COMMAND ${CMAKE_COMMAND} -DPROJECT_SOURCE_DIR=${PROJECT_SOURCE_DIR}
34 "-DVARS=${AVF_VARIABLES}"
35 -DCURRENT_VENDOR=${CURRENT_VENDOR}
36 -DIN=${in}
37 -DOUT=${out}
38 -P ${PROJECT_SOURCE_DIR}/CMake/vendor_substitute.cmake
39 COMMAND chmod ${AVF_MODE} ${out}
40 DEPENDS ${in}
41 ${PROJECT_SOURCE_DIR}/doc/apt-verbatim.ent
42 ${PROJECT_SOURCE_DIR}/vendor/${CURRENT_VENDOR}/apt-vendor.ent
43 ${PROJECT_SOURCE_DIR}/vendor/getinfo
44 ${PROJECT_SOURCE_DIR}/CMake/vendor_substitute.cmake
45 VERBATIM
46 )
47
48 # Woud like to use ${AVF_OUTPUT} as target name, but then ninja gets
49 # cycles.
50 add_custom_target(vendor-${AVF_OUTPUT} ALL DEPENDS ${out})
51 endfunction()
52
53 # Add symbolic links to a file
54 function(add_slaves destination master)
55 set(slaves "")
56 foreach(slave ${ARGN})
57 add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${slave}
58 COMMAND ${CMAKE_COMMAND} -E create_symlink ${master} ${CMAKE_CURRENT_BINARY_DIR}/${slave})
59 list(APPEND slaves ${CMAKE_CURRENT_BINARY_DIR}/${slave})
60 endforeach()
61
62 STRING(REPLACE "/" "-" master "${master}")
63 add_custom_target(${master}-slaves ALL DEPENDS ${slaves})
64 install(FILES ${slaves} DESTINATION ${destination})
65 endfunction()
66
67 # Generates a simple version script versioning everything with current SOVERSION
68 function(add_version_script target)
69 get_target_property(soversion ${target} SOVERSION)
70 set(script "${CMAKE_CURRENT_BINARY_DIR}/${target}.versionscript")
71 string(REPLACE "-" "" name "${target}_${soversion}")
72 string(TOUPPER "${name}" name)
73 add_custom_command(OUTPUT "${script}"
74 COMMAND echo "${name} {global: *; };" > "${script}"
75 VERBATIM )
76 add_custom_target(${target}-versionscript DEPENDS "${script}")
77 target_link_libraries(${target} PRIVATE -Wl,-version-script="${script}")
78 add_dependencies(${target} ${target}-versionscript)
79 endfunction()
80
81 function(path_join out path1 path2)
82 string(SUBSTRING ${path2} 0 1 init_char)
83 if ("${init_char}" STREQUAL "/")
84 set(${out} "${path2}" PARENT_SCOPE)
85 else()
86 set(${out} "${path1}/${path2}" PARENT_SCOPE)
87 endif()
88 endfunction()
89
90 # install_empty_directories(path ...)
91 #
92 # Creates empty directories in the install destination dir. Paths may be
93 # absolute or relative; in the latter case, the value of CMAKE_INSTALL_PREFIX
94 # is prepended.
95 function(install_empty_directories)
96 foreach(path ${ARGN})
97 path_join(full_path "${CMAKE_INSTALL_PREFIX}" "${path}")
98 INSTALL(CODE "MESSAGE(STATUS \"Creating directory: \$ENV{DESTDIR}${full_path}\")"
99 CODE "FILE(MAKE_DIRECTORY \$ENV{DESTDIR}${full_path})")
100 endforeach()
101 endfunction()