~eliasnaur/gio-cmd

42b1cd0f6c6341a95054f63a7735fb317ff4cadf — inkeliz 1 year, 4 months ago 7b925a6
gogio: [macOS] fix signature on network-drives

Previously, gogio creates the `.app` and then generates
the signature.

Now, it will generate the `.app` on the temporary folder,
then move it. It also generates one `.zip` folder, which
will be used in the next patch.

Signed-off-by: inkeliz <inkeliz@inkeliz.com>
1 files changed, 39 insertions(+), 20 deletions(-)

M gogio/macosbuild.go
M gogio/macosbuild.go => gogio/macosbuild.go +39 -20
@@ 39,15 39,30 @@ func buildMac(tmpDir string, bi *buildInfo) error {
	}

	for _, arch := range bi.archs {
		if err := builder.buildProgram(bi, name, arch); err != nil {
		tmpDest := filepath.Join(builder.TempDir, filepath.Base(builder.DestDir))
		finalDest := builder.DestDir
		if len(bi.archs) > 1 {
			tmpDest = filepath.Join(builder.TempDir, name+"_"+arch+".app")
			finalDest = filepath.Join(builder.DestDir, name+"_"+arch+".app")
		}

		if err := builder.buildProgram(bi, tmpDest, name, arch); err != nil {
			return err
		}

		if bi.key != "" {
			if err := builder.signProgram(bi, name, arch); err != nil {
			if err := builder.signProgram(bi, tmpDest, name, arch); err != nil {
				return err
			}
		}

		if err := dittozip(tmpDest, finalDest+".zip"); err != nil {
			return err
		}

		if err := dittounzip(finalDest+".zip", finalDest); err != nil {
			return err
		}
	}

	return nil


@@ 148,25 163,20 @@ func (b *macBuilder) setInfo(buildInfo *buildInfo, name string) error {
	return nil
}

func (b *macBuilder) buildProgram(buildInfo *buildInfo, name string, arch string) error {
	dest := b.DestDir
	if len(buildInfo.archs) > 1 {
		dest = filepath.Join(filepath.Dir(b.DestDir), name+"_"+arch+".app")
	}

func (b *macBuilder) buildProgram(buildInfo *buildInfo, binDest string, name string, arch string) error {
	for _, path := range []string{"/Contents/MacOS", "/Contents/Resources"} {
		if err := os.MkdirAll(filepath.Join(dest, path), 0755); err != nil {
		if err := os.MkdirAll(filepath.Join(binDest, path), 0755); err != nil {
			return err
		}
	}

	if len(b.Icons) > 0 {
		if err := os.WriteFile(filepath.Join(dest, "/Contents/Resources/icon.icns"), b.Icons, 0755); err != nil {
		if err := os.WriteFile(filepath.Join(binDest, "/Contents/Resources/icon.icns"), b.Icons, 0755); err != nil {
			return err
		}
	}

	if err := os.WriteFile(filepath.Join(dest, "/Contents/Info.plist"), b.Manifest, 0755); err != nil {
	if err := os.WriteFile(filepath.Join(binDest, "/Contents/Info.plist"), b.Manifest, 0755); err != nil {
		return err
	}



@@ 175,7 185,7 @@ func (b *macBuilder) buildProgram(buildInfo *buildInfo, name string, arch string
		"build",
		"-ldflags="+buildInfo.ldflags,
		"-tags="+buildInfo.tags,
		"-o", filepath.Join(dest, "/Contents/MacOS/"+name),
		"-o", filepath.Join(binDest, "/Contents/MacOS/"+name),
		buildInfo.pkgPath,
	)
	cmd.Env = append(


@@ 188,18 198,13 @@ func (b *macBuilder) buildProgram(buildInfo *buildInfo, name string, arch string
	return err
}

func (b *macBuilder) signProgram(buildInfo *buildInfo, name string, arch string) error {
	dest := b.DestDir
	if len(buildInfo.archs) > 1 {
		dest = filepath.Join(filepath.Dir(b.DestDir), name+"_"+arch+".app")
	}

func (b *macBuilder) signProgram(buildInfo *buildInfo, binDest string, name string, arch string) error {
	options := filepath.Join(b.TempDir, "ent.ent")
	if err := os.WriteFile(options, b.Entitlements, 0777); err != nil {
		return err
	}

	xattr := exec.Command("xattr", "-rc", dest)
	xattr := exec.Command("xattr", "-rc", binDest)
	if _, err := runCmd(xattr); err != nil {
		return err
	}


@@ 211,8 216,22 @@ func (b *macBuilder) signProgram(buildInfo *buildInfo, name string, arch string)
		"--options", "runtime",
		"--entitlements", options,
		"--sign", buildInfo.key,
		dest,
		binDest,
	)
	_, err := runCmd(cmd)
	return err
}

func dittozip(input, output string) error {
	cmd := exec.Command("ditto", "-c", "-k", "-X", "--rsrc", input, output)

	_, err := runCmd(cmd)
	return err
}

func dittounzip(input, output string) error {
	cmd := exec.Command("ditto", "-x", "-k", "-X", "--rsrc", input, output)

	_, err := runCmd(cmd)
	return err
}