Skip to content

Commit 9ba7599

Browse files
committed
Allow selection of build.core and build.variant with variables substitution
1 parent c3edbd3 commit 9ba7599

File tree

3 files changed

+145
-2
lines changed

3 files changed

+145
-2
lines changed

Diff for: arduino/cores/packagemanager/package_manager.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -380,13 +380,13 @@ func (pme *Explorer) ResolveFQBN(fqbn *cores.FQBN) (
380380
}
381381

382382
func (pme *Explorer) determineReferencedPlatformRelease(boardBuildProperties *properties.Map, boardPlatformRelease *cores.PlatformRelease, fqbn *cores.FQBN) (string, *cores.PlatformRelease, string, *cores.PlatformRelease, error) {
383-
core := boardBuildProperties.Get("build.core")
383+
core := boardBuildProperties.ExpandPropsInString(boardBuildProperties.Get("build.core"))
384384
referredCore := ""
385385
if split := strings.Split(core, ":"); len(split) > 1 {
386386
referredCore, core = split[0], split[1]
387387
}
388388

389-
variant := boardBuildProperties.Get("build.variant")
389+
variant := boardBuildProperties.ExpandPropsInString(boardBuildProperties.Get("build.variant"))
390390
referredVariant := ""
391391
if split := strings.Split(variant, ":"); len(split) > 1 {
392392
referredVariant, variant = split[0], split[1]

Diff for: arduino/cores/packagemanager/package_manager_test.go

+96
Original file line numberDiff line numberDiff line change
@@ -807,6 +807,102 @@ func TestLegacyPackageConversionToPluggableDiscovery(t *testing.T) {
807807
}
808808
}
809809

810+
func TestVariantAndCoreSelection(t *testing.T) {
811+
// Pass nil, since these paths are only used for installing
812+
pmb := NewBuilder(nil, nil, nil, nil, "test")
813+
// Hardware from main packages directory
814+
pmb.LoadHardwareFromDirectory(dataDir1.Join("packages"))
815+
pm := pmb.Build()
816+
pme, release := pm.NewExplorer()
817+
defer release()
818+
819+
requireSameFile := func(f1, f2 *paths.Path) {
820+
require.True(t, f1.EquivalentTo(f2), "%s must be equivalent to %s", f1, f2)
821+
}
822+
823+
// build.core test suite
824+
t.Run("CoreWithoutSubstitutions", func(t *testing.T) {
825+
fqbn, err := cores.ParseFQBN("test2:avr:test")
826+
require.NoError(t, err)
827+
require.NotNil(t, fqbn)
828+
_, _, _, buildProps, _, err := pme.ResolveFQBN(fqbn)
829+
require.NoError(t, err)
830+
require.Equal(t, "arduino", buildProps.Get("build.core"))
831+
requireSameFile(buildProps.GetPath("build.core.path"), dataDir1.Join("packages", "test2", "hardware", "avr", "1.0.0", "cores", "arduino"))
832+
})
833+
t.Run("CoreWithSubstitutions", func(t *testing.T) {
834+
fqbn, err := cores.ParseFQBN("test2:avr:test2")
835+
require.NoError(t, err)
836+
require.NotNil(t, fqbn)
837+
_, _, _, buildProps, _, err := pme.ResolveFQBN(fqbn)
838+
require.NoError(t, err)
839+
require.Equal(t, "{my_core}", buildProps.Get("build.core"))
840+
require.Equal(t, "arduino", buildProps.Get("my_core"))
841+
requireSameFile(buildProps.GetPath("build.core.path"), dataDir1.Join("packages", "test2", "hardware", "avr", "1.0.0", "cores", "arduino"))
842+
})
843+
t.Run("CoreWithSubstitutionsAndDefaultOption", func(t *testing.T) {
844+
fqbn, err := cores.ParseFQBN("test2:avr:test3")
845+
require.NoError(t, err)
846+
require.NotNil(t, fqbn)
847+
_, _, _, buildProps, _, err := pme.ResolveFQBN(fqbn)
848+
require.NoError(t, err)
849+
require.Equal(t, "{my_core}", buildProps.Get("build.core"))
850+
require.Equal(t, "arduino", buildProps.Get("my_core"))
851+
requireSameFile(buildProps.GetPath("build.core.path"), dataDir1.Join("packages", "test2", "hardware", "avr", "1.0.0", "cores", "arduino"))
852+
})
853+
t.Run("CoreWithSubstitutionsAndNonDefaultOption", func(t *testing.T) {
854+
fqbn, err := cores.ParseFQBN("test2:avr:test3:core=referenced")
855+
require.NoError(t, err)
856+
require.NotNil(t, fqbn)
857+
_, _, _, buildProps, _, err := pme.ResolveFQBN(fqbn)
858+
require.NoError(t, err)
859+
require.Equal(t, "{my_core}", buildProps.Get("build.core"))
860+
require.Equal(t, "arduino:arduino", buildProps.Get("my_core"))
861+
requireSameFile(buildProps.GetPath("build.core.path"), dataDir1.Join("packages", "arduino", "hardware", "avr", "1.8.3", "cores", "arduino"))
862+
})
863+
864+
// build.variant test suite
865+
t.Run("VariantWithoutSubstitutions", func(t *testing.T) {
866+
fqbn, err := cores.ParseFQBN("test2:avr:test4")
867+
require.NoError(t, err)
868+
require.NotNil(t, fqbn)
869+
_, _, _, buildProps, _, err := pme.ResolveFQBN(fqbn)
870+
require.NoError(t, err)
871+
require.Equal(t, "standard", buildProps.Get("build.variant"))
872+
requireSameFile(buildProps.GetPath("build.variant.path"), dataDir1.Join("packages", "test2", "hardware", "avr", "1.0.0", "variants", "standard"))
873+
})
874+
t.Run("VariantWithSubstitutions", func(t *testing.T) {
875+
fqbn, err := cores.ParseFQBN("test2:avr:test5")
876+
require.NoError(t, err)
877+
require.NotNil(t, fqbn)
878+
_, _, _, buildProps, _, err := pme.ResolveFQBN(fqbn)
879+
require.NoError(t, err)
880+
require.Equal(t, "{my_variant}", buildProps.Get("build.variant"))
881+
require.Equal(t, "standard", buildProps.Get("my_variant"))
882+
requireSameFile(buildProps.GetPath("build.variant.path"), dataDir1.Join("packages", "test2", "hardware", "avr", "1.0.0", "variants", "standard"))
883+
})
884+
t.Run("VariantWithSubstitutionsAndDefaultOption", func(t *testing.T) {
885+
fqbn, err := cores.ParseFQBN("test2:avr:test6")
886+
require.NoError(t, err)
887+
require.NotNil(t, fqbn)
888+
_, _, _, buildProps, _, err := pme.ResolveFQBN(fqbn)
889+
require.NoError(t, err)
890+
require.Equal(t, "{my_variant}", buildProps.Get("build.variant"))
891+
require.Equal(t, "standard", buildProps.Get("my_variant"))
892+
requireSameFile(buildProps.GetPath("build.variant.path"), dataDir1.Join("packages", "test2", "hardware", "avr", "1.0.0", "variants", "standard"))
893+
})
894+
t.Run("VariantWithSubstitutionsAndNonDefaultOption", func(t *testing.T) {
895+
fqbn, err := cores.ParseFQBN("test2:avr:test6:variant=referenced")
896+
require.NoError(t, err)
897+
require.NotNil(t, fqbn)
898+
_, _, _, buildProps, _, err := pme.ResolveFQBN(fqbn)
899+
require.NoError(t, err)
900+
require.Equal(t, "{my_variant}", buildProps.Get("build.variant"))
901+
require.Equal(t, "arduino:standard", buildProps.Get("my_variant"))
902+
requireSameFile(buildProps.GetPath("build.variant.path"), dataDir1.Join("packages", "arduino", "hardware", "avr", "1.8.3", "variants", "standard"))
903+
})
904+
}
905+
810906
func TestRunPostInstall(t *testing.T) {
811907
pmb := NewBuilder(nil, nil, nil, nil, "test")
812908
pm := pmb.Build()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
menu.core=Core
2+
menu.variant=Variant
3+
4+
## Test cases for core selection
5+
6+
test.name=Test Board
7+
test.build.board=AVR_TEST
8+
test.build.core=arduino
9+
test.build.variant=standard
10+
11+
test2.name=Test Board 2
12+
test2.build.board=AVR_TEST_2
13+
test2.build.core={my_core}
14+
test2.my_core=arduino
15+
test2.build.variant=standard
16+
17+
test3.name=Test Board 2
18+
test3.build.board=AVR_TEST_2
19+
test3.build.core={my_core}
20+
test3.my_core=arduino
21+
test3.build.variant=standard
22+
test3.menu.core.default=Default
23+
test3.menu.core.referenced=Referenced
24+
test3.menu.core.referenced.my_core=arduino:arduino
25+
26+
## Test cases for variant selection
27+
28+
test4.name=Test Board
29+
test4.build.board=AVR_TEST
30+
test4.build.core=arduino
31+
test4.build.variant=standard
32+
33+
test5.name=Test Board 2
34+
test5.build.board=AVR_TEST_2
35+
test5.build.core=arduino
36+
test5.my_variant=standard
37+
test5.build.variant={my_variant}
38+
39+
test6.name=Test Board 2
40+
test6.build.board=AVR_TEST_2
41+
test5.build.core=arduino
42+
test6.my_variant=standard
43+
test6.build.variant={my_variant}
44+
test6.menu.variant.default=Default
45+
test6.menu.variant.referenced=Referenced
46+
test6.menu.variant.referenced.my_variant=arduino:standard
47+

0 commit comments

Comments
 (0)