From 4debb6235af74fed7bdd1eb2781c9b436ee42d9f Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Thu, 3 Mar 2016 18:36:43 +0100 Subject: [PATCH 1/2] Handle priority inversion for promoted bundled libraries Fixes arduino/Arduino#4064 Signed-off-by: Martino Facchin --- .../builder/includes_to_include_folders.go | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/arduino.cc/builder/includes_to_include_folders.go b/src/arduino.cc/builder/includes_to_include_folders.go index 1c52d8a2..c4ea1ab4 100644 --- a/src/arduino.cc/builder/includes_to_include_folders.go +++ b/src/arduino.cc/builder/includes_to_include_folders.go @@ -140,7 +140,7 @@ func resolveLibrary(header string, headerToLibraries map[string][]*types.Library var library *types.Library for _, platform := range platforms { - if platform != nil && library == nil { + if platform != nil { library = findBestLibraryWithHeader(header, librariesCompatibleWithPlatform(libraries, platform)) } } @@ -218,21 +218,34 @@ func findLibraryIn(libraries []*types.Library, library *types.Library) *types.Li return nil } -func libraryCompatibleWithPlatform(library *types.Library, platform *types.Platform) bool { +func libraryCompatibleWithPlatform(library *types.Library, platform *types.Platform) (bool, bool) { if len(library.Archs) == 0 { - return true + return true, true + } + if utils.SliceContains(library.Archs, constants.LIBRARY_ALL_ARCHS) { + return true, true } + return utils.SliceContains(library.Archs, platform.PlatformId), false +} + +func libraryCompatibleWithAllPlatforms(library *types.Library) bool { if utils.SliceContains(library.Archs, constants.LIBRARY_ALL_ARCHS) { return true } - return utils.SliceContains(library.Archs, platform.PlatformId) + return false } func librariesCompatibleWithPlatform(libraries []*types.Library, platform *types.Platform) []*types.Library { var compatibleLibraries []*types.Library for _, library := range libraries { - if libraryCompatibleWithPlatform(library, platform) { - compatibleLibraries = append(compatibleLibraries, library) + compatible, generic := libraryCompatibleWithPlatform(library, platform) + if compatible { + if !generic && len(compatibleLibraries) != 0 && libraryCompatibleWithAllPlatforms(compatibleLibraries[0]) { + //priority inversion + compatibleLibraries = append([]*types.Library{library}, compatibleLibraries...) + } else { + compatibleLibraries = append(compatibleLibraries, library) + } } } From d3b4fb102d5f373842a75c76739d0d9ec8a603db Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Mon, 7 Mar 2016 12:08:27 +0100 Subject: [PATCH 2/2] Handle promotion based on architecture for all libraries solves https://github.com/arduino/ArduinoCore-samd/issues/80, which was caused by USBHost library not having a corresponding .h, thus bypassing the findBestLibraryWithHeader check --- .../builder/includes_to_include_folders.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/arduino.cc/builder/includes_to_include_folders.go b/src/arduino.cc/builder/includes_to_include_folders.go index c4ea1ab4..9760fb64 100644 --- a/src/arduino.cc/builder/includes_to_include_folders.go +++ b/src/arduino.cc/builder/includes_to_include_folders.go @@ -141,7 +141,7 @@ func resolveLibrary(header string, headerToLibraries map[string][]*types.Library for _, platform := range platforms { if platform != nil { - library = findBestLibraryWithHeader(header, librariesCompatibleWithPlatform(libraries, platform)) + library = findBestLibraryWithHeader(header, librariesCompatibleWithPlatform(libraries, platform, true)) } } @@ -150,6 +150,12 @@ func resolveLibrary(header string, headerToLibraries map[string][]*types.Library } if library == nil { + // reorder libraries to promote fully compatible ones + for _, platform := range platforms { + if platform != nil { + libraries = append(librariesCompatibleWithPlatform(libraries, platform, false), libraries...) + } + } library = libraries[0] } @@ -235,12 +241,12 @@ func libraryCompatibleWithAllPlatforms(library *types.Library) bool { return false } -func librariesCompatibleWithPlatform(libraries []*types.Library, platform *types.Platform) []*types.Library { +func librariesCompatibleWithPlatform(libraries []*types.Library, platform *types.Platform, reorder bool) []*types.Library { var compatibleLibraries []*types.Library for _, library := range libraries { compatible, generic := libraryCompatibleWithPlatform(library, platform) if compatible { - if !generic && len(compatibleLibraries) != 0 && libraryCompatibleWithAllPlatforms(compatibleLibraries[0]) { + if !generic && len(compatibleLibraries) != 0 && libraryCompatibleWithAllPlatforms(compatibleLibraries[0]) && reorder == true { //priority inversion compatibleLibraries = append([]*types.Library{library}, compatibleLibraries...) } else {