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>
This commit is contained in:
inkeliz
2023-07-11 19:41:47 +01:00
parent 7b925a6c25
commit 42b1cd0f6c
+39 -20
View File
@@ -39,15 +39,30 @@ func buildMac(tmpDir string, bi *buildInfo) error {
} }
for _, arch := range bi.archs { 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 return err
} }
if bi.key != "" { if bi.key != "" {
if err := builder.signProgram(bi, name, arch); err != nil { if err := builder.signProgram(bi, tmpDest, name, arch); err != nil {
return err return err
} }
} }
if err := dittozip(tmpDest, finalDest+".zip"); err != nil {
return err
}
if err := dittounzip(finalDest+".zip", finalDest); err != nil {
return err
}
} }
return nil return nil
@@ -148,25 +163,20 @@ func (b *macBuilder) setInfo(buildInfo *buildInfo, name string) error {
return nil return nil
} }
func (b *macBuilder) buildProgram(buildInfo *buildInfo, name string, arch string) error { func (b *macBuilder) buildProgram(buildInfo *buildInfo, binDest string, name string, arch string) error {
dest := b.DestDir
if len(buildInfo.archs) > 1 {
dest = filepath.Join(filepath.Dir(b.DestDir), name+"_"+arch+".app")
}
for _, path := range []string{"/Contents/MacOS", "/Contents/Resources"} { 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 return err
} }
} }
if len(b.Icons) > 0 { 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 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 return err
} }
@@ -175,7 +185,7 @@ func (b *macBuilder) buildProgram(buildInfo *buildInfo, name string, arch string
"build", "build",
"-ldflags="+buildInfo.ldflags, "-ldflags="+buildInfo.ldflags,
"-tags="+buildInfo.tags, "-tags="+buildInfo.tags,
"-o", filepath.Join(dest, "/Contents/MacOS/"+name), "-o", filepath.Join(binDest, "/Contents/MacOS/"+name),
buildInfo.pkgPath, buildInfo.pkgPath,
) )
cmd.Env = append( cmd.Env = append(
@@ -188,18 +198,13 @@ func (b *macBuilder) buildProgram(buildInfo *buildInfo, name string, arch string
return err return err
} }
func (b *macBuilder) signProgram(buildInfo *buildInfo, name string, arch string) error { func (b *macBuilder) signProgram(buildInfo *buildInfo, binDest string, name string, arch string) error {
dest := b.DestDir
if len(buildInfo.archs) > 1 {
dest = filepath.Join(filepath.Dir(b.DestDir), name+"_"+arch+".app")
}
options := filepath.Join(b.TempDir, "ent.ent") options := filepath.Join(b.TempDir, "ent.ent")
if err := os.WriteFile(options, b.Entitlements, 0777); err != nil { if err := os.WriteFile(options, b.Entitlements, 0777); err != nil {
return err return err
} }
xattr := exec.Command("xattr", "-rc", dest) xattr := exec.Command("xattr", "-rc", binDest)
if _, err := runCmd(xattr); err != nil { if _, err := runCmd(xattr); err != nil {
return err return err
} }
@@ -211,8 +216,22 @@ func (b *macBuilder) signProgram(buildInfo *buildInfo, name string, arch string)
"--options", "runtime", "--options", "runtime",
"--entitlements", options, "--entitlements", options,
"--sign", buildInfo.key, "--sign", buildInfo.key,
dest, binDest,
) )
_, err := runCmd(cmd) _, err := runCmd(cmd)
return err 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
}