Add support for applying patches
This commit is contained in:
parent
cc1261b0b0
commit
2d6db97b43
@ -115,6 +115,12 @@ type FileTransfer struct {
|
|||||||
Remote string
|
Remote string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Patch struct {
|
||||||
|
Path string
|
||||||
|
Source string
|
||||||
|
Script string
|
||||||
|
}
|
||||||
|
|
||||||
// Artifact is for .out-of-tree.toml
|
// Artifact is for .out-of-tree.toml
|
||||||
type Artifact struct {
|
type Artifact struct {
|
||||||
Name string
|
Name string
|
||||||
@ -140,6 +146,8 @@ type Artifact struct {
|
|||||||
DisableKpti bool
|
DisableKpti bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Patches []Patch
|
||||||
|
|
||||||
Make struct {
|
Make struct {
|
||||||
Target string
|
Target string
|
||||||
}
|
}
|
||||||
|
3
gen.go
3
gen.go
@ -39,6 +39,9 @@ func genConfig(at config.ArtifactType) (err error) {
|
|||||||
a.Preload = append(a.Preload, config.PreloadModule{
|
a.Preload = append(a.Preload, config.PreloadModule{
|
||||||
Repo: "Repo name (e.g. https://github.com/openwall/lkrg)",
|
Repo: "Repo name (e.g. https://github.com/openwall/lkrg)",
|
||||||
})
|
})
|
||||||
|
a.Patches = append(a.Patches, config.Patch{
|
||||||
|
Path: "/path/to/profiling.patch",
|
||||||
|
})
|
||||||
|
|
||||||
buf, err := toml.Marshal(&a)
|
buf, err := toml.Marshal(&a)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
58
pew.go
58
pew.go
@ -157,6 +157,59 @@ func dockerRun(timeout time.Duration, container, workdir, command string) (
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func sh(workdir, cmd string) (output string, err error) {
|
||||||
|
command := exec.Command("sh", "-c", "cd "+workdir+" && "+cmd)
|
||||||
|
raw, err := command.CombinedOutput()
|
||||||
|
output = string(raw)
|
||||||
|
if err != nil {
|
||||||
|
e := fmt.Sprintf("%v %v output: %v", cmd, err, output)
|
||||||
|
err = errors.New(e)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func applyPatches(src string, ka config.Artifact) (err error) {
|
||||||
|
for i, patch := range ka.Patches {
|
||||||
|
name := fmt.Sprintf("patch_%02d", i)
|
||||||
|
|
||||||
|
path := src + "/" + name + ".diff"
|
||||||
|
if patch.Source != "" && patch.Path != "" {
|
||||||
|
err = errors.New("path and source are mutually exclusive")
|
||||||
|
return
|
||||||
|
} else if patch.Source != "" {
|
||||||
|
err = os.WriteFile(path, []byte(patch.Source), 0644)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else if patch.Path != "" {
|
||||||
|
err = copy.Copy(patch.Path, path)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if patch.Source != "" || patch.Path != "" {
|
||||||
|
_, err = sh(src, "patch < "+path)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if patch.Script != "" {
|
||||||
|
script := src + "/" + name + ".sh"
|
||||||
|
err = os.WriteFile(script, []byte(patch.Script), 0755)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, err = sh(src, script)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func build(tmp string, ka config.Artifact, ki config.KernelInfo,
|
func build(tmp string, ka config.Artifact, ki config.KernelInfo,
|
||||||
dockerTimeout time.Duration) (outPath, output string, err error) {
|
dockerTimeout time.Duration) (outPath, output string, err error) {
|
||||||
|
|
||||||
@ -169,6 +222,11 @@ func build(tmp string, ka config.Artifact, ki config.KernelInfo,
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = applyPatches(tmpSourcePath, ka)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
outPath = tmpSourcePath + "/" + target
|
outPath = tmpSourcePath + "/" + target
|
||||||
if ka.Type == config.KernelModule {
|
if ka.Type == config.KernelModule {
|
||||||
outPath += ".ko"
|
outPath += ".ko"
|
||||||
|
Loading…
Reference in New Issue
Block a user