|
20 | 20 | # [STAGE_LIB_DIR <override>] # Override RV_STAGE_LIB_DIR (e.g., for OpenSSL/Linux) |
21 | 21 | # [EXTRA_LIB_DIRS <dir1>...] # Additional lib dirs to copy to |
22 | 22 | # [FILES <file1> [file2...]] # Individual files to copy_if_different to STAGE_LIB_DIR (alternative to LIB_DIR) |
23 | | -# [TARGET_LIBS <t1> [t2...]] # Imported targets to stage via $<TARGET_FILE:...> generatos (requires USE_FLAG_FILE). |
24 | | -# # Resolves actual library paths at build time — handles any naming convention. |
| 23 | +# [TARGET_LIBS <t1> [t2...]] # Imported targets to stage via $<TARGET_FILE:...> generators. |
| 24 | +# # At configure time, resolves IMPORTED_LOCATION to derive output filenames |
| 25 | +# # for proper incremental tracking (re-stages if files are deleted). |
| 26 | +# # Falls back to USE_FLAG_FILE if location cannot be resolved. |
25 | 27 | # # On Windows: DLL→STAGE_BIN_DIR, import lib→STAGE_LIB_DIR. |
26 | 28 | # [DEPENDS <dep1> [dep2...]] # Dependencies (default: ${TARGET}) |
27 | 29 | # [PRE_COMMANDS COMMAND <cmd1> [COMMAND <cmd2>...]] # Commands to run before copy; each must be prefixed with COMMAND keyword |
@@ -71,13 +73,6 @@ FUNCTION(RV_STAGE_DEPENDENCY_LIBS) |
71 | 73 | ENDIF() |
72 | 74 | ENDIF() |
73 | 75 |
|
74 | | - # Validate TARGET_LIBS requires USE_FLAG_FILE (generators can't be used in OUTPUTS) |
75 | | - IF(_ARG_TARGET_LIBS |
76 | | - AND NOT _ARG_USE_FLAG_FILE |
77 | | - ) |
78 | | - MESSAGE(FATAL_ERROR "RV_STAGE_DEPENDENCY_LIBS: TARGET_LIBS requires USE_FLAG_FILE (generator expressions cannot be used in OUTPUTS)") |
79 | | - ENDIF() |
80 | | - |
81 | 76 | # Default LIB_DIR to caller's _lib_dir if not explicitly passed |
82 | 77 | IF(NOT _ARG_LIB_DIR |
83 | 78 | AND NOT _ARG_FILES |
@@ -111,6 +106,68 @@ FUNCTION(RV_STAGE_DEPENDENCY_LIBS) |
111 | 106 | ) |
112 | 107 | ENDIF() |
113 | 108 |
|
| 109 | + # When TARGET_LIBS is used without explicit USE_FLAG_FILE or OUTPUTS, resolve IMPORTED_LOCATION at configure time to derive output filenames for proper |
| 110 | + # incremental tracking. This way Ninja detects deleted staged files and re-runs the staging command automatically. |
| 111 | + IF(_ARG_TARGET_LIBS |
| 112 | + AND NOT _ARG_USE_FLAG_FILE |
| 113 | + AND NOT _ARG_OUTPUTS |
| 114 | + ) |
| 115 | + SET(_rsdl_resolved_outputs) |
| 116 | + SET(_rsdl_failed |
| 117 | + FALSE |
| 118 | + ) |
| 119 | + STRING(TOUPPER "${CMAKE_BUILD_TYPE}" _rsdl_config_upper) |
| 120 | + |
| 121 | + FOREACH( |
| 122 | + _rsdl_tgt |
| 123 | + ${_ARG_TARGET_LIBS} |
| 124 | + ) |
| 125 | + RV_RESOLVE_IMPORTED_LOCATION(${_rsdl_tgt} _rsdl_loc) |
| 126 | + |
| 127 | + IF(_rsdl_loc) |
| 128 | + GET_FILENAME_COMPONENT(_rsdl_fname "${_rsdl_loc}" NAME) |
| 129 | + IF(RV_TARGET_WINDOWS) |
| 130 | + LIST(APPEND _rsdl_resolved_outputs "${RV_STAGE_BIN_DIR}/${_rsdl_fname}") |
| 131 | + SET(_rsdl_implib |
| 132 | + "" |
| 133 | + ) |
| 134 | + FOREACH( |
| 135 | + _rsdl_prop |
| 136 | + IMPORTED_IMPLIB IMPORTED_IMPLIB_${_rsdl_config_upper} IMPORTED_IMPLIB_RELEASE IMPORTED_IMPLIB_NOCONFIG |
| 137 | + ) |
| 138 | + IF(NOT _rsdl_implib) |
| 139 | + GET_TARGET_PROPERTY(_rsdl_implib ${_rsdl_tgt} ${_rsdl_prop}) |
| 140 | + ENDIF() |
| 141 | + ENDFOREACH() |
| 142 | + IF(_rsdl_implib) |
| 143 | + GET_FILENAME_COMPONENT(_rsdl_impfname "${_rsdl_implib}" NAME) |
| 144 | + LIST(APPEND _rsdl_resolved_outputs "${_ARG_STAGE_LIB_DIR}/${_rsdl_impfname}") |
| 145 | + ENDIF() |
| 146 | + ELSE() |
| 147 | + LIST(APPEND _rsdl_resolved_outputs "${_ARG_STAGE_LIB_DIR}/${_rsdl_fname}") |
| 148 | + ENDIF() |
| 149 | + ELSE() |
| 150 | + SET(_rsdl_failed |
| 151 | + TRUE |
| 152 | + ) |
| 153 | + MESSAGE(AUTHOR_WARNING "RV_STAGE_DEPENDENCY_LIBS: Cannot resolve IMPORTED_LOCATION for ${_rsdl_tgt}; falling back to flag file") |
| 154 | + BREAK() |
| 155 | + ENDIF() |
| 156 | + ENDFOREACH() |
| 157 | + |
| 158 | + IF(NOT _rsdl_failed |
| 159 | + AND _rsdl_resolved_outputs |
| 160 | + ) |
| 161 | + SET(_ARG_OUTPUTS |
| 162 | + ${_rsdl_resolved_outputs} |
| 163 | + ) |
| 164 | + ELSE() |
| 165 | + SET(_ARG_USE_FLAG_FILE |
| 166 | + TRUE |
| 167 | + ) |
| 168 | + ENDIF() |
| 169 | + ENDIF() |
| 170 | + |
114 | 171 | # Build the command list |
115 | 172 | SET(_commands) |
116 | 173 |
|
|
0 commit comments