diff mbox series

[meta-mingw,V2] meta-mingw: support generating Windows SDK with no symlink

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

Commit Message

ChenQi Nov. 3, 2025, 2:18 a.m. UTC
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

Comments

ChenQi Nov. 10, 2025, 3:32 a.m. UTC | #1
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 mbox series

Patch

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"