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 diff --git a/arduino/libraries/librariesresolver/cpp.go b/arduino/libraries/librariesresolver/cpp.go index 47e240722cf..9baf3d098c7 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++ 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 2a9af1cff6d..0bea2dcbe0f 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") @@ -63,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) {
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: