diff --git a/arduino-core/src/cc/arduino/Compiler.java b/arduino-core/src/cc/arduino/Compiler.java index d1aa1f2bdce..a220f784ad3 100644 --- a/arduino-core/src/cc/arduino/Compiler.java +++ b/arduino-core/src/cc/arduino/Compiler.java @@ -49,8 +49,10 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; +import java.util.Arrays; import java.util.ArrayList; import java.util.Collections; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.regex.Pattern; @@ -249,6 +251,18 @@ private void callArduinoBuilder(TargetBoard board, TargetPlatform platform, Targ addPathFlagIfPathExists(cmd, "-built-in-libraries", BaseNoGui.getContentFile("libraries")); addPathFlagIfPathExists(cmd, "-libraries", BaseNoGui.getSketchbookLibrariesFolder().folder); + // adding several additional library directories, taken from preferences.txt + // additional_library_directories=path1[;path2[;...]] + Collection additional_library_directories = splitAndTrim(PreferencesData.get("additional_library_directories"), ";"); + for (String path : additional_library_directories) { + File fpath = new File(path); + addPathFlagIfPathExists(cmd, "-libraries", fpath); + + if (!fpath.isDirectory()) { + System.err.println(I18n.format(tr("Warning: additional_library_directories: directory '{0}' not found"), path)); + } + } + String fqbn = Stream.of(aPackage.getId(), platform.getId(), board.getId(), boardOptions(board)).filter(s -> !s.isEmpty()).collect(Collectors.joining(":")); cmd.add("-fqbn=" + fqbn); @@ -623,4 +637,13 @@ private RunnerException placeException(String message, String fileName, int line } return null; } + + private Collection splitAndTrim(String text, String separator) { + if ((text == null) || (text.length() == 0)) { + return Collections.emptyList() ; + } + + Collection parts = Arrays.asList(text.split(separator)); + return parts.stream().map(String::trim).filter(part -> !part.isEmpty()).collect(Collectors.toList()); + } } diff --git a/arduino-core/src/processing/app/BaseNoGui.java b/arduino-core/src/processing/app/BaseNoGui.java index 0dfbd4ccc74..d64948b4016 100644 --- a/arduino-core/src/processing/app/BaseNoGui.java +++ b/arduino-core/src/processing/app/BaseNoGui.java @@ -33,6 +33,7 @@ import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.stream.Collectors; import cc.arduino.packages.BoardPort; @@ -672,6 +673,19 @@ static public void onBoardOrPortChange() { // Add libraries folder for the sketchbook librariesFolders.add(getSketchbookLibrariesFolder()); + // Adding several additional library directories, taken from preferences.txt + // additional_library_directories=path1[;path2[;...]] + Collection additional_library_directories = splitAndTrim(PreferencesData.get("additional_library_directories"), ";"); + for (String path : additional_library_directories) { + File fpath = new File(path); + + if (fpath.isDirectory()) { + librariesFolders.add(new UserLibraryFolder(fpath, Location.ADDITIONAL)); + } else { + System.err.println(I18n.format(tr("Warning: additional_library_directories: directory '{0}' not found"), path)); + } + } + // Scan for libraries in each library folder. // Libraries located in the latest folders on the list can override // other libraries with the same name. @@ -949,6 +963,15 @@ static public void showError(String title, String message, Throwable e) { notifier.showError(title, message, e, 1); } + static private Collection splitAndTrim(String text, String separator) { + if ((text == null) || (text.length() == 0)) { + return Collections.emptyList() ; + } + + Collection parts = Arrays.asList(text.split(separator)); + return parts.stream().map(String::trim).filter(part -> !part.isEmpty()).collect(Collectors.toList()); + } + /** * Show an error message that's actually fatal to the program. * This is an error that can't be recovered. Use showWarning() diff --git a/arduino-core/src/processing/app/packages/UserLibraryFolder.java b/arduino-core/src/processing/app/packages/UserLibraryFolder.java index 53371a21323..f181132f8e0 100644 --- a/arduino-core/src/processing/app/packages/UserLibraryFolder.java +++ b/arduino-core/src/processing/app/packages/UserLibraryFolder.java @@ -34,7 +34,7 @@ public class UserLibraryFolder { public enum Location { - SKETCHBOOK, CORE, REFERENCED_CORE, IDE_BUILTIN, + SKETCHBOOK, CORE, REFERENCED_CORE, IDE_BUILTIN, ADDITIONAL, } public File folder; diff --git a/arduino-core/src/processing/app/packages/UserLibraryPriorityComparator.java b/arduino-core/src/processing/app/packages/UserLibraryPriorityComparator.java index fe64ba1aa6e..1f6cf84c605 100644 --- a/arduino-core/src/processing/app/packages/UserLibraryPriorityComparator.java +++ b/arduino-core/src/processing/app/packages/UserLibraryPriorityComparator.java @@ -38,7 +38,8 @@ public class UserLibraryPriorityComparator implements Comparator { private final static Map priorities = new HashMap<>(); static { - priorities.put(Location.SKETCHBOOK, 4); + priorities.put(Location.SKETCHBOOK, 5); + priorities.put(Location.ADDITIONAL, 4); priorities.put(Location.CORE, 3); priorities.put(Location.REFERENCED_CORE, 2); priorities.put(Location.IDE_BUILTIN, 1);