From 880a4e0b409fa552d16e7d6b1cef6fd9e9e86c0a Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Wed, 20 Mar 2024 19:08:47 +1100 Subject: [PATCH] Remove xattr via obj-c --- v2/internal/xattr/xattr.go | 34 +++++++++++++++++++++ v2/pkg/commands/bindings/bindings.go | 11 +++---- v2/pkg/commands/bindings/bindings_darwin.go | 9 ++++++ v2/pkg/commands/build/build.go | 7 +++++ v2/pkg/commands/build/build_darwin.go | 9 ++++++ 5 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 v2/internal/xattr/xattr.go create mode 100644 v2/pkg/commands/bindings/bindings_darwin.go create mode 100644 v2/pkg/commands/build/build_darwin.go diff --git a/v2/internal/xattr/xattr.go b/v2/internal/xattr/xattr.go new file mode 100644 index 000000000..9b3e3fe00 --- /dev/null +++ b/v2/internal/xattr/xattr.go @@ -0,0 +1,34 @@ +package xattr + +/* +#cgo CFLAGS: -x objective-c +#cgo LDFLAGS: -framework Foundation +#import +#include +#include + +void removeXattrFrom(const char *path) { + ssize_t xattrNamesSize = listxattr(path, NULL, 0, XATTR_NOFOLLOW); + if (xattrNamesSize <= 0) return; + + char *xattrNames = (char *)malloc(xattrNamesSize); + xattrNamesSize = listxattr(path, xattrNames, xattrNamesSize, XATTR_NOFOLLOW); + + ssize_t pos = 0; + while (pos < xattrNamesSize) { + char *name = xattrNames + pos; + removexattr(path, name, XATTR_NOFOLLOW); + pos += strlen(name) + 1; + } + + free(xattrNames); +} +*/ +import "C" +import "unsafe" + +func RemoveXAttr(filepath string) { + cpath := C.CString(filepath) + defer C.free(unsafe.Pointer(cpath)) + C.removeXattrFrom(cpath) +} diff --git a/v2/pkg/commands/bindings/bindings.go b/v2/pkg/commands/bindings/bindings.go index 23d4d635c..5fb39f9b4 100644 --- a/v2/pkg/commands/bindings/bindings.go +++ b/v2/pkg/commands/bindings/bindings.go @@ -13,6 +13,8 @@ import ( "github.com/wailsapp/wails/v2/pkg/commands/buildtags" ) +var fixupXattrs func(string) + // Options for generating bindings type Options struct { Filename string @@ -58,12 +60,9 @@ func GenerateBindings(options Options) (string, error) { return stdout, fmt.Errorf("%s\n%s\n%s", stdout, stderr, err) } - if runtime.GOOS == "darwin" { - // Remove quarantine attribute - stdout, stderr, err = shell.RunCommand(workingDirectory, "xattr", "-rc", filename) - if err != nil { - return stdout, fmt.Errorf("%s\n%s\n%s", stdout, stderr, err) - } + // Fix up xattrs if required + if fixupXattrs != nil { + fixupXattrs(filename) } defer func() { diff --git a/v2/pkg/commands/bindings/bindings_darwin.go b/v2/pkg/commands/bindings/bindings_darwin.go new file mode 100644 index 000000000..59b3859b4 --- /dev/null +++ b/v2/pkg/commands/bindings/bindings_darwin.go @@ -0,0 +1,9 @@ +//go:build darwin + +package bindings + +import "github.com/wailsapp/wails/v2/internal/xattr" + +func init() { + fixupXattrs = xattr.RemoveXAttr +} diff --git a/v2/pkg/commands/build/build.go b/v2/pkg/commands/build/build.go index 5bc3051a4..9cb1e5a7b 100644 --- a/v2/pkg/commands/build/build.go +++ b/v2/pkg/commands/build/build.go @@ -22,6 +22,8 @@ import ( "github.com/wailsapp/wails/v2/pkg/clilogger" ) +var fixupXattrs func(string) + // Mode is the type used to indicate the build modes type Mode int @@ -327,6 +329,11 @@ func execBuildApplication(builder Builder, options *Options) (string, error) { if _, err := os.Stat(options.CompiledBinary); os.IsNotExist(err) { return "", fmt.Errorf("compiled binary does not exist at path: %s", options.CompiledBinary) } + if fixupXattrs != nil { + os.Chdir(options.BinDirectory) + fixupXattrs(options.CompiledBinary) + os.Chdir(options.ProjectData.Path) + } stdout, stderr, err := shell.RunCommand(options.BinDirectory, "xattr", "-rc", options.CompiledBinary) if err != nil { return "", fmt.Errorf("%s - %s", err.Error(), stderr) diff --git a/v2/pkg/commands/build/build_darwin.go b/v2/pkg/commands/build/build_darwin.go new file mode 100644 index 000000000..417656044 --- /dev/null +++ b/v2/pkg/commands/build/build_darwin.go @@ -0,0 +1,9 @@ +//go:build darwin + +package build + +import "github.com/wailsapp/wails/v2/internal/xattr" + +func init() { + fixupXattrs = xattr.RemoveXAttr +}