| Message ID | 20251103021848.3068540-1-Qi.Chen@windriver.com |
|---|---|
| State | New |
| Headers | show |
| Series | [meta-mingw,V2] meta-mingw: support generating Windows SDK with no symlink | expand |
ping On 11/3/25 10:18, Qi.Chen@windriver.com wrote: > From: Chen Qi <Qi.Chen@windriver.com> > > On some Windows systems, symlinks are not allowed due to IT policy. > We need to be able to generate Windows SDK without symlinks. > > To do this, a new variable, WINSDK_NO_SYMLINK, and a new bbclass, > mingw_sdk_handle_symlink.bbclass, are introduced to achieve this. > > By default, things work as before; when setting WINSDK_NO_SYMLINK > to "1", SDK will replace all symlinks with the actual contents. > > Signed-off-by: Chen Qi <Qi.Chen@windriver.com> > --- > classes/mingw_sdk_handle_symlink.bbclass | 25 +++++++++++++++++++++ > conf/machine-sdk/include/mingw32-common.inc | 3 +++ > 2 files changed, 28 insertions(+) > create mode 100644 classes/mingw_sdk_handle_symlink.bbclass > > diff --git a/classes/mingw_sdk_handle_symlink.bbclass b/classes/mingw_sdk_handle_symlink.bbclass > new file mode 100644 > index 0000000..2f6dbe6 > --- /dev/null > +++ b/classes/mingw_sdk_handle_symlink.bbclass > @@ -0,0 +1,25 @@ > +WINSDK_NO_SYMLINK ?= "0" > + > +archive_sdk:prepend:sdkmingw32 () { > + if [ "${WINSDK_NO_SYMLINK}" = "1" ]; then > + for parse_type in "file" "directory"; do > + find "${SDK_OUTPUT}/${SDKPATH}" -type l -print0 | while IFS= read -r -d '' symlink; do > + target=$(readlink -f "$symlink" || echo "NOTVALID") > + if [ "$target" = "NOTVALID" ]; then > + continue > + fi > + if [ ! -e "$target" ]; then > + continue > + elif [ -d "$target" ]; then > + if [ "$parse_type" = "directory" ]; then > + rm "$symlink" && cp -r "$target" "$symlink" > + fi > + else > + if [ "$parse_type" = "file" ]; then > + rm "$symlink" && cp "$target" "$symlink" > + fi > + fi > + done > + done > + fi > +} > diff --git a/conf/machine-sdk/include/mingw32-common.inc b/conf/machine-sdk/include/mingw32-common.inc > index 56b8052..bf3f14e 100644 > --- a/conf/machine-sdk/include/mingw32-common.inc > +++ b/conf/machine-sdk/include/mingw32-common.inc > @@ -59,3 +59,6 @@ GCCPIE:mingw32 = "" > > # wine and wineserver are required to test MinGW SDKs > HOSTTOOLS_NONFATAL += "wine wineserver" > + > +# handle symlinks > +INHERIT += "mingw_sdk_handle_symlink"
diff --git a/classes/mingw_sdk_handle_symlink.bbclass b/classes/mingw_sdk_handle_symlink.bbclass new file mode 100644 index 0000000..2f6dbe6 --- /dev/null +++ b/classes/mingw_sdk_handle_symlink.bbclass @@ -0,0 +1,25 @@ +WINSDK_NO_SYMLINK ?= "0" + +archive_sdk:prepend:sdkmingw32 () { + if [ "${WINSDK_NO_SYMLINK}" = "1" ]; then + for parse_type in "file" "directory"; do + find "${SDK_OUTPUT}/${SDKPATH}" -type l -print0 | while IFS= read -r -d '' symlink; do + target=$(readlink -f "$symlink" || echo "NOTVALID") + if [ "$target" = "NOTVALID" ]; then + continue + fi + if [ ! -e "$target" ]; then + continue + elif [ -d "$target" ]; then + if [ "$parse_type" = "directory" ]; then + rm "$symlink" && cp -r "$target" "$symlink" + fi + else + if [ "$parse_type" = "file" ]; then + rm "$symlink" && cp "$target" "$symlink" + fi + fi + done + done + fi +} diff --git a/conf/machine-sdk/include/mingw32-common.inc b/conf/machine-sdk/include/mingw32-common.inc index 56b8052..bf3f14e 100644 --- a/conf/machine-sdk/include/mingw32-common.inc +++ b/conf/machine-sdk/include/mingw32-common.inc @@ -59,3 +59,6 @@ GCCPIE:mingw32 = "" # wine and wineserver are required to test MinGW SDKs HOSTTOOLS_NONFATAL += "wine wineserver" + +# handle symlinks +INHERIT += "mingw_sdk_handle_symlink"