@@ -13,9 +13,6 @@ import (
13
13
"go.jetpack.io/devbox/planner/plansdk"
14
14
)
15
15
16
- // Source and reference: https://github.com/oxalica/rust-overlay
17
- const RustOxalicaOverlay = "https://github.com/oxalica/rust-overlay/archive/stable.tar.gz"
18
-
19
16
// `cargo new` generates a file with uppercase Cargo.toml
20
17
const cargoToml = "Cargo.toml"
21
18
@@ -32,23 +29,10 @@ func (p *Planner) IsRelevant(srcDir string) bool {
32
29
return p .cargoTomlPath (srcDir ) != ""
33
30
}
34
31
35
- func (p * Planner ) GetShellPlan (srcDir string ) * plansdk.ShellPlan {
36
- plan := & plansdk.ShellPlan {
37
- NixOverlays : []string {RustOxalicaOverlay },
38
- }
39
- manifest , err := p .cargoManifest (srcDir )
40
- if err != nil {
41
- return plan
32
+ func (p * Planner ) GetShellPlan (_srcDir string ) * plansdk.ShellPlan {
33
+ return & plansdk.ShellPlan {
34
+ DevPackages : []string {"rustup" },
42
35
}
43
- rustVersion , err := p .rustOxalicaVersion (manifest )
44
- if err != nil {
45
- return plan
46
- }
47
-
48
- rustPkgDev := fmt .Sprintf ("rust-bin.stable.%s.default" , rustVersion )
49
- plan .DevPackages = []string {rustPkgDev , "gcc" }
50
-
51
- return plan
52
36
}
53
37
54
38
func (p * Planner ) GetBuildPlan (srcDir string ) * plansdk.BuildPlan {
@@ -68,43 +52,46 @@ func (p *Planner) getBuildPlan(srcDir string) (*plansdk.BuildPlan, error) {
68
52
if err != nil {
69
53
return nil , err
70
54
}
71
- rustVersion , err := p .rustOxalicaVersion (manifest )
55
+ rustupVersion , err := p .rustupVersion (manifest )
72
56
if err != nil {
73
57
return nil , errors .WithStack (err )
74
58
}
75
59
76
- rustPkgDev := fmt . Sprintf ( "rust-bin.stable.%s.default" , rustVersion )
60
+ envSetup := p . envsetupCommands ( rustupVersion )
77
61
78
62
return & plansdk.BuildPlan {
79
- NixOverlays : []string {RustOxalicaOverlay },
80
63
// 'gcc' added as a linker for libc (C toolchain)
81
64
// 1. https://softwareengineering.stackexchange.com/a/332254
82
65
// 2. https://stackoverflow.com/a/56166959
83
- DevPackages : []string {rustPkgDev , "gcc" },
84
- RuntimePackages : []string {"glibc" },
66
+ DevPackages : []string {"rustup" , "gcc" },
67
+ RuntimePackages : []string {"rustup" , "gcc" },
68
+
85
69
InstallStage : & plansdk.Stage {
86
70
InputFiles : []string {"." },
87
- Command : " cargo fetch" ,
71
+ Command : fmt . Sprintf ( "%s && cargo fetch", envSetup ) ,
88
72
},
89
73
BuildStage : & plansdk.Stage {
90
74
InputFiles : []string {"." },
91
- Command : " cargo build --release --offline" ,
75
+ Command : fmt . Sprintf ( "%s && cargo build --release --offline", envSetup ) ,
92
76
},
93
77
StartStage : & plansdk.Stage {
94
- InputFiles : []string {fmt . Sprintf ( "target/release/%s" , manifest . PackageField . Name ) },
95
- Command : fmt .Sprintf ("./%s " , manifest . PackageField . Name ),
78
+ InputFiles : []string {"." },
79
+ Command : fmt .Sprintf ("%s && cargo run --release --offline " , envSetup ),
96
80
},
97
81
}, nil
98
82
}
99
83
100
- // Follows the Oxalica convention where it needs to be either:
101
- // 1. latest
84
+ // Follows the Rustup convention where it needs to be either:
85
+ // 1. stable
102
86
// 2. "<version>", including the quotation marks. Example: "1.62.0"
103
87
//
104
- // This result is spliced into (for example) "rust-bin.stable.<result>.default"
105
- func (p * Planner ) rustOxalicaVersion (manifest * cargoManifest ) (string , error ) {
88
+ // TODO: add support for beta, nightly, and [stable|beta|nightly]-<archive-date>
89
+ // <channel> = stable|beta|nightly|<major.minor>|<major.minor.patch>
90
+ // Channel names can be optionally appended with an archive date, as in nightly-2014-12-18
91
+ // https://rust-lang.github.io/rustup/concepts/toolchains.html
92
+ func (p * Planner ) rustupVersion (manifest * cargoManifest ) (string , error ) {
106
93
if manifest .PackageField .RustVersion == "" {
107
- return "latest " , nil
94
+ return "stable " , nil
108
95
}
109
96
110
97
rustVersion , err := plansdk .NewVersion (manifest .PackageField .RustVersion )
@@ -148,3 +135,26 @@ func (p *Planner) cargoTomlPath(srcDir string) string {
148
135
}
149
136
return ""
150
137
}
138
+
139
+ // envsetupCommands are bash commands that ensure the rustup toolchain is setup so
140
+ // it always works. We tradeoff robustness for performance in this implementation,
141
+ // which is a polite way of saying that it is slow.
142
+ func (p * Planner ) envsetupCommands (rustupVersion string ) string {
143
+
144
+ // RUSTUP_HOME sets the root rustup folder, which is used for storing installed toolchains
145
+ // and configuration options. CARGO_HOME contains cache files used by cargo.
146
+ //
147
+ // Note that you will need to ensure these environment variables are always set and
148
+ // that CARGO_HOME/bin is in the $PATH environment variable when using the toolchain.
149
+ // source: https://rust-lang.github.io/rustup/installation/index.html
150
+ cargoHome := "./.devbox/rust/cargo"
151
+ cargoSetup := fmt .Sprintf ("mkdir -p %s && export CARGO_HOME=%s && export PATH=$PATH:$CARGO_HOME" , cargoHome ,
152
+ cargoHome )
153
+
154
+ rustupHome := "./.devbox/rust/rustup/"
155
+ rustupSetup := fmt .Sprintf ("mkdir -p %s && export RUSTUP_HOME=%s && rustup default %s" , rustupHome , rustupHome ,
156
+ rustupVersion )
157
+ envSetup := fmt .Sprintf ("%s && %s" , cargoSetup , rustupSetup )
158
+
159
+ return envSetup
160
+ }
0 commit comments