From 174f69eebac132ac5ee609c2d7f38ddff91ffa2d Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Mon, 3 Feb 2020 18:55:50 +0100 Subject: [PATCH 1/4] Reorganized tests --- .../libraries/librariesresolver/cpp_test.go | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/arduino/libraries/librariesresolver/cpp_test.go b/arduino/libraries/librariesresolver/cpp_test.go index 2a9af1cff6d..d2f009ea8fb 100644 --- a/arduino/libraries/librariesresolver/cpp_test.go +++ b/arduino/libraries/librariesresolver/cpp_test.go @@ -30,10 +30,6 @@ var l5 = &libraries.Library{Name: "Yet Another Calculus Lib Improved", Location: var l6 = &libraries.Library{Name: "Calculus Unified Lib", Location: libraries.User} var l7 = &libraries.Library{Name: "AnotherLib", Location: libraries.User} var bundleServo = &libraries.Library{Name: "Servo", Location: libraries.IDEBuiltIn, Architectures: []string{"avr", "sam", "samd"}} -var userServo = &libraries.Library{Name: "Servo", Location: libraries.User, Architectures: []string{"avr", "sam", "samd"}} -var userServoAllArch = &libraries.Library{Name: "Servo", Location: libraries.User, Architectures: []string{"*"}} -var userServoNonavr = &libraries.Library{Name: "Servo", Location: libraries.User, Architectures: []string{"sam", "samd"}} -var userAnotherServo = &libraries.Library{Name: "AnotherServo", Location: libraries.User, Architectures: []string{"avr", "sam", "samd", "esp32"}} func runResolver(include string, arch string, libs ...*libraries.Library) *libraries.Library { libraryList := libraries.List{} @@ -44,6 +40,23 @@ func runResolver(include string, arch string, libs ...*libraries.Library) *libra } func TestArchitecturePriority(t *testing.T) { + userServo := &libraries.Library{ + Name: "Servo", + Location: libraries.User, + Architectures: []string{"avr", "sam", "samd"}} + userServoAllArch := &libraries.Library{ + Name: "Servo", + Location: libraries.User, + Architectures: []string{"*"}} + userServoNonavr := &libraries.Library{ + Name: "Servo", + Location: libraries.User, + Architectures: []string{"sam", "samd"}} + userAnotherServo := &libraries.Library{ + Name: "AnotherServo", + Location: libraries.User, + Architectures: []string{"avr", "sam", "samd", "esp32"}} + res := runResolver("Servo.h", "avr", bundleServo, userServo) require.NotNil(t, res) require.Equal(t, userServo, res, "selected library") From bb0918f1d82bb7c4b1f6b308ec620629c67bb847 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Mon, 3 Feb 2020 20:06:41 +0100 Subject: [PATCH 2/4] Fixed library.IsArchitectureIndependent method. Now it returns true for libraries that do not specify "architecture" fiels. --- arduino/libraries/libraries.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/arduino/libraries/libraries.go b/arduino/libraries/libraries.go index eb063387435..b31f546aa74 100644 --- a/arduino/libraries/libraries.go +++ b/arduino/libraries/libraries.go @@ -83,9 +83,6 @@ func (library *Library) String() string { // - the library is architecture independent // - the library doesn't specify any `architecture` field in library.properties func (library *Library) SupportsAnyArchitectureIn(archs ...string) bool { - if len(library.Architectures) == 0 { - return true - } if library.IsArchitectureIndependent() { return true } @@ -113,7 +110,7 @@ func (library *Library) IsOptimizedForArchitecture(arch string) bool { // compatible with all architectures (the `architecture` field in // library.properties contains the `*` item) func (library *Library) IsArchitectureIndependent() bool { - return library.IsOptimizedForArchitecture("*") + return library.IsOptimizedForArchitecture("*") || library.Architectures == nil || len(library.Architectures) == 0 } // SourceDir represents a source dir of a library From 4c9fb4afbc2b811299d56b982fa162ea27aaa6e6 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Mon, 3 Feb 2020 20:07:21 +0100 Subject: [PATCH 3/4] Fixed yet another even more convoluted case in bundle lib selection Fix #572 --- arduino/libraries/librariesresolver/cpp.go | 44 +++++++++++-------- .../libraries/librariesresolver/cpp_test.go | 11 +++++ 2 files changed, 37 insertions(+), 18 deletions(-) diff --git a/arduino/libraries/librariesresolver/cpp.go b/arduino/libraries/librariesresolver/cpp.go index 47e240722cf..84c03e29463 100644 --- a/arduino/libraries/librariesresolver/cpp.go +++ b/arduino/libraries/librariesresolver/cpp.go @@ -127,34 +127,42 @@ func computePriority(lib *libraries.Library, header, arch string) int { priority := 0 // Bonus for core-optimized libraries - if lib.IsOptimizedForArchitecture(arch) || lib.IsArchitectureIndependent() { - priority += 0x0100 + if lib.IsOptimizedForArchitecture(arch) { + // give a slightly better bonus for libraries that have specific optimization + // (it is more important than Location but less important than Name) + priority += 1010 + } else if lib.IsArchitectureIndependent() { + // standard bonus for architecture independent (vanilla) libraries + priority += 1000 + } else { + // the library is not architecture compatible + priority += 0 + } + + if name == header { + priority += 500 + } else if name == header+"-master" { + priority += 400 + } else if strings.HasPrefix(name, header) { + priority += 300 + } else if strings.HasSuffix(name, header) { + priority += 200 + } else if strings.Contains(name, header) { + priority += 100 } switch lib.Location { case libraries.IDEBuiltIn: - priority += 0x0000 + priority += 0 case libraries.ReferencedPlatformBuiltIn: - priority += 0x0001 + priority += 1 case libraries.PlatformBuiltIn: - priority += 0x0002 + priority += 2 case libraries.User: - priority += 0x0003 + priority += 3 default: panic(fmt.Sprintf("Invalid library location: %d", lib.Location)) } - - if name == header { - priority += 0x0050 - } else if name == header+"-master" { - priority += 0x0040 - } else if strings.HasPrefix(name, header) { - priority += 0x0030 - } else if strings.HasSuffix(name, header) { - priority += 0x0020 - } else if strings.Contains(name, header) { - priority += 0x0010 - } return priority } diff --git a/arduino/libraries/librariesresolver/cpp_test.go b/arduino/libraries/librariesresolver/cpp_test.go index d2f009ea8fb..0bea2dcbe0f 100644 --- a/arduino/libraries/librariesresolver/cpp_test.go +++ b/arduino/libraries/librariesresolver/cpp_test.go @@ -76,6 +76,17 @@ func TestArchitecturePriority(t *testing.T) { res = runResolver("Servo.h", "esp32", userServoAllArch, userAnotherServo) require.NotNil(t, res) require.Equal(t, userServoAllArch, res, "selected library") + + userSDAllArch := &libraries.Library{ + Name: "SD", + Location: libraries.User, + Architectures: []string{"*"}} + builtinSDesp := &libraries.Library{ + Name: "SD", + Location: libraries.PlatformBuiltIn, + Architectures: []string{"esp8266"}} + res = runResolver("SD.h", "esp8266", userSDAllArch, builtinSDesp) + require.Equal(t, builtinSDesp, res, "selected library") } func TestClosestMatchWithTotallyDifferentNames(t *testing.T) { From 57956a017186f4f641bf81e10ecf685995acfb78 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Tue, 4 Feb 2020 12:33:33 +0100 Subject: [PATCH 4/4] Makes linter happy... --- arduino/libraries/librariesresolver/cpp.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arduino/libraries/librariesresolver/cpp.go b/arduino/libraries/librariesresolver/cpp.go index 84c03e29463..9baf3d098c7 100644 --- a/arduino/libraries/librariesresolver/cpp.go +++ b/arduino/libraries/librariesresolver/cpp.go @@ -155,7 +155,7 @@ func computePriority(lib *libraries.Library, header, arch string) int { case libraries.IDEBuiltIn: priority += 0 case libraries.ReferencedPlatformBuiltIn: - priority += 1 + priority++ case libraries.PlatformBuiltIn: priority += 2 case libraries.User: