aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Willemsen <dwillemsen@google.com>2018-11-15 19:15:02 -0800
committerDan Willemsen <dwillemsen@google.com>2018-12-03 15:55:15 -0800
commit263dde779e4e1b04f7b2507162b9d893763e3129 (patch)
tree66b029d846e1e3b17cb111ed244fc8897060968f
parent314d8c142cc135bde537d8849c3644ee753fcb9c (diff)
downloadbuild_soong-263dde779e4e1b04f7b2507162b9d893763e3129.tar.gz
build_soong-263dde779e4e1b04f7b2507162b9d893763e3129.tar.bz2
build_soong-263dde779e4e1b04f7b2507162b9d893763e3129.zip
Fix par file zip offsets
The zip file format does support scripts/programs prefixed to the archive, though many of the offsets are supposed to start from the beginning of the file. Some tools (python and zipinfo) are able to read zip files with arbitrary prefixes, but others (libziparchive and zipdetails) fail. So pass the file to prefix onto the zip file into merge_zips so that we can set the offsets from the real start of the file. Test: m sepolicy_tests (runs the embedded python interpreter) Test: zipinfo out/host/linux-x86/bin/sepolicy_tests Test: zipdetails out/host/linux-x86/bin/sepolicy_tests Change-Id: If73d4c2465581f7de5aa47959284ecf2059df091
-rw-r--r--cmd/merge_zips/merge_zips.go18
-rw-r--r--python/builder.go28
2 files changed, 29 insertions, 17 deletions
diff --git a/cmd/merge_zips/merge_zips.go b/cmd/merge_zips/merge_zips.go
index 8e71a978..c21da44b 100644
--- a/cmd/merge_zips/merge_zips.go
+++ b/cmd/merge_zips/merge_zips.go
@@ -19,6 +19,7 @@ import (
"flag"
"fmt"
"hash/crc32"
+ "io"
"io/ioutil"
"log"
"os"
@@ -66,6 +67,7 @@ var (
manifest = flag.String("m", "", "manifest file to insert in jar")
pyMain = flag.String("pm", "", "__main__.py file to insert in par")
entrypoint = flag.String("e", "", "par entrypoint file to insert in par")
+ prefix = flag.String("prefix", "", "A file to prefix to the zip file")
ignoreDuplicates = flag.Bool("ignore-duplicates", false, "take each entry from the first zip it exists in and don't warn")
)
@@ -77,7 +79,7 @@ func init() {
func main() {
flag.Usage = func() {
- fmt.Fprintln(os.Stderr, "usage: merge_zips [-jpsD] [-m manifest] [-e entrypoint] [-pm __main__.py] output [inputs...]")
+ fmt.Fprintln(os.Stderr, "usage: merge_zips [-jpsD] [-m manifest] [--prefix script] [-e entrypoint] [-pm __main__.py] output [inputs...]")
flag.PrintDefaults()
}
@@ -99,6 +101,19 @@ func main() {
log.Fatal(err)
}
defer output.Close()
+
+ var offset int64
+ if *prefix != "" {
+ prefixFile, err := os.Open(*prefix)
+ if err != nil {
+ log.Fatal(err)
+ }
+ offset, err = io.Copy(output, prefixFile)
+ if err != nil {
+ log.Fatal(err)
+ }
+ }
+
writer := zip.NewWriter(output)
defer func() {
err := writer.Close()
@@ -106,6 +121,7 @@ func main() {
log.Fatal(err)
}
}()
+ writer.SetOffset(offset)
// make readers
readers := []namedZipReader{}
diff --git a/python/builder.go b/python/builder.go
index 11a792a4..7d4589cc 100644
--- a/python/builder.go
+++ b/python/builder.go
@@ -45,20 +45,21 @@ var (
hostPar = pctx.AndroidStaticRule("hostPar",
blueprint.RuleParams{
Command: `sed -e 's/%interpreter%/$interp/g' -e 's/%main%/$main/g' $template > $stub && ` +
- `$mergeParCmd -p -pm $stub $mergedZip $srcsZips && echo '#!/usr/bin/env python' | cat - $mergedZip > $out && ` +
- `chmod +x $out && (rm -f $stub; rm -f $mergedZip)`,
+ `echo "#!/usr/bin/env python" >${out}.prefix &&` +
+ `$mergeParCmd -p --prefix ${out}.prefix -pm $stub $out $srcsZips && ` +
+ `chmod +x $out && (rm -f $stub; rm -f ${out}.prefix)`,
CommandDeps: []string{"$mergeParCmd"},
},
- "interp", "main", "template", "stub", "mergedZip", "srcsZips")
+ "interp", "main", "template", "stub", "srcsZips")
embeddedPar = pctx.AndroidStaticRule("embeddedPar",
blueprint.RuleParams{
Command: `echo '$main' > $entryPoint &&` +
- `$mergeParCmd -p -e $entryPoint $mergedZip $srcsZips && cat $launcher | cat - $mergedZip > $out && ` +
- `chmod +x $out && (rm -f $entryPoint; rm -f $mergedZip)`,
+ `$mergeParCmd -p --prefix $launcher -e $entryPoint $out $srcsZips && ` +
+ `chmod +x $out && (rm -f $entryPoint)`,
CommandDeps: []string{"$mergeParCmd"},
},
- "main", "entryPoint", "mergedZip", "srcsZips", "launcher")
+ "main", "entryPoint", "srcsZips", "launcher")
)
func init() {
@@ -73,9 +74,6 @@ func registerBuildActionForParFile(ctx android.ModuleContext, embeddedLauncher b
launcherPath android.OptionalPath, interpreter, main, binName string,
srcsZips android.Paths) android.Path {
- // .intermediate output path for merged zip file.
- mergedZip := android.PathForModuleOut(ctx, binName+".mergedzip")
-
// .intermediate output path for bin executable.
binFile := android.PathForModuleOut(ctx, binName)
@@ -96,12 +94,11 @@ func registerBuildActionForParFile(ctx android.ModuleContext, embeddedLauncher b
Output: binFile,
Implicits: implicits,
Args: map[string]string{
- "interp": strings.Replace(interpreter, "/", `\/`, -1),
- "main": strings.Replace(main, "/", `\/`, -1),
- "template": template.String(),
- "stub": stub,
- "mergedZip": mergedZip.String(),
- "srcsZips": strings.Join(srcsZips.Strings(), " "),
+ "interp": strings.Replace(interpreter, "/", `\/`, -1),
+ "main": strings.Replace(main, "/", `\/`, -1),
+ "template": template.String(),
+ "stub": stub,
+ "srcsZips": strings.Join(srcsZips.Strings(), " "),
},
})
} else if launcherPath.Valid() {
@@ -119,7 +116,6 @@ func registerBuildActionForParFile(ctx android.ModuleContext, embeddedLauncher b
Args: map[string]string{
"main": main,
"entryPoint": entryPoint,
- "mergedZip": mergedZip.String(),
"srcsZips": strings.Join(srcsZips.Strings(), " "),
"launcher": launcherPath.String(),
},