]>
Commit | Line | Data |
---|---|---|
1e59de90 TL |
1 | #[===[.md: |
2 | # vcpkg_install_gn | |
3 | ||
4 | Installs a GN project | |
5 | ||
6 | ## Usage: | |
7 | ```cmake | |
8 | vcpkg_install_gn( | |
9 | SOURCE_PATH <SOURCE_PATH> | |
10 | [TARGETS <target>...] | |
11 | ) | |
12 | ``` | |
13 | ||
14 | ## Parameters: | |
15 | ### SOURCE_PATH | |
16 | The path to the source directory | |
17 | ||
18 | ### TARGETS | |
19 | Only install the specified targets. | |
20 | ||
21 | Note: includes must be handled separately | |
22 | #]===] | |
23 | ||
24 | function(vcpkg_install_gn) | |
25 | # parse parameters such that semicolons in options arguments to COMMAND don't get erased | |
26 | cmake_parse_arguments(PARSE_ARGV 0 _vig "" "SOURCE_PATH" "TARGETS") | |
27 | ||
28 | if(NOT DEFINED _vig_SOURCE_PATH) | |
29 | message(FATAL_ERROR "SOURCE_PATH must be specified.") | |
30 | endif() | |
31 | ||
32 | vcpkg_build_ninja(TARGETS ${_vig_TARGETS}) | |
33 | ||
34 | vcpkg_find_acquire_program(GN) | |
35 | ||
36 | function(gn_get_target_type OUT_VAR BUILD_DIR TARGET) | |
37 | execute_process( | |
38 | COMMAND ${GN} desc "${BUILD_DIR}" "${TARGET}" | |
39 | WORKING_DIRECTORY "${_vig_SOURCE_PATH}" | |
40 | OUTPUT_VARIABLE OUTPUT_ | |
41 | OUTPUT_STRIP_TRAILING_WHITESPACE | |
42 | ) | |
43 | string(REGEX MATCH "type: ([A-Za-z0-9_]+)" OUTPUT_ "${OUTPUT_}") | |
44 | set(${OUT_VAR} ${CMAKE_MATCH_1} PARENT_SCOPE) | |
45 | endfunction() | |
46 | ||
47 | function(gn_desc OUT_VAR BUILD_DIR TARGET WHAT_TO_DISPLAY) | |
48 | execute_process( | |
49 | COMMAND ${GN} desc "${BUILD_DIR}" "${TARGET}" "${WHAT_TO_DISPLAY}" | |
50 | WORKING_DIRECTORY "${_vig_SOURCE_PATH}" | |
51 | OUTPUT_VARIABLE OUTPUT_ | |
52 | OUTPUT_STRIP_TRAILING_WHITESPACE | |
53 | ) | |
54 | string(REGEX REPLACE "\n|(\r\n)" ";" OUTPUT_ "${OUTPUT_}") | |
55 | set(${OUT_VAR} ${OUTPUT_} PARENT_SCOPE) | |
56 | endfunction() | |
57 | ||
58 | function(install_ BUILD_DIR INSTALL_DIR) | |
59 | if(_vig_TARGETS) | |
60 | foreach(TARGET ${_vig_TARGETS}) | |
61 | # GN targets must start with a // | |
62 | gn_desc(OUTPUTS "${BUILD_DIR}" "//${TARGET}" outputs) | |
63 | gn_get_target_type(TARGET_TYPE "${BUILD_DIR}" "//${TARGET}") | |
64 | foreach(OUTPUT ${OUTPUTS}) | |
65 | if(NOT EXISTS "${OUTPUT}") | |
66 | if(OUTPUT MATCHES "^//") | |
67 | # relative path (e.g. //out/Release/target.lib) | |
68 | string(REGEX REPLACE "^//" "${_vig_SOURCE_PATH}/" OUTPUT "${OUTPUT}") | |
69 | elseif(OUTPUT MATCHES "^/" AND CMAKE_HOST_WIN32) | |
70 | # absolute path (e.g. /C:/path/to/target.lib) | |
71 | string(REGEX REPLACE "^/" "" OUTPUT "${OUTPUT}") | |
72 | endif() | |
73 | endif() | |
74 | ||
75 | if(NOT EXISTS "${OUTPUT}") | |
76 | message(STATUS "Output for target, ${TARGET} doesn't exist: ${OUTPUT}.") | |
77 | continue() | |
78 | endif() | |
79 | ||
80 | if(TARGET_TYPE STREQUAL "executable") | |
81 | file(INSTALL "${OUTPUT}" DESTINATION "${INSTALL_DIR}/tools") | |
82 | elseif("${OUTPUT}" MATCHES "(\\.dll|\\.pdb)$") | |
83 | file(INSTALL "${OUTPUT}" DESTINATION "${INSTALL_DIR}/bin") | |
84 | else() | |
85 | file(INSTALL "${OUTPUT}" DESTINATION "${INSTALL_DIR}/lib") | |
86 | endif() | |
87 | endforeach() | |
88 | endforeach() | |
89 | endif() | |
90 | endfunction() | |
91 | ||
92 | if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug") | |
93 | install_("${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg" "${CURRENT_PACKAGES_DIR}/debug") | |
94 | endif() | |
95 | ||
96 | if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release") | |
97 | install_("${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel" "${CURRENT_PACKAGES_DIR}") | |
98 | endif() | |
99 | ||
100 | endfunction() |