В моем случае вариант 3 оказался простым. В моем файле CMake для набора инструментов я просто добавил:
set(CMAKE_C_COMPILER_WORKS ON)
set(CMAKE_CXX_COMPILER_WORKS ON)
И теперь CMake не тратит впустую время на опросы функций моего компилятора.
Это работает в моем конкретном случае (прошивка встроенных систем), но было бы неплохо, как заставить CMake и -fstack-protector-strong
работать также и с не встроенными программами.
Если Вы знаете путь к классу в файлы, которые известны contextclassloader, можно передать их компилятору:
StandardJavaFileManager fileManager = compiler.getStandardFileManager(this /* diagnosticlistener */, null, null);
// get compilationunits from somewhere, for instance via fileManager.getJavaFileObjectsFromFiles(List<file> files)
List<String> options = new ArrayList<String>();
options.add("-classpath");
StringBuilder sb = new StringBuilder();
URLClassLoader urlClassLoader = (URLClassLoader) Thread.currentThread().getContextClassLoader();
for (URL url : urlClassLoader.getURLs())
sb.append(url.getFile()).append(File.pathSeparator);
options.add(sb.toString());
CompilationTask task = compiler.getTask(null, fileManager, this /* diagnosticlistener */, options, null, compilationUnits);
task.call();
Этот пример предполагает использование URLClassloader (который позволяет Вам получать путь к классу), но Вы могли вставить свой собственный путь к классу, если бы Вы хотели.
Другая опция состоит в том, чтобы использовать палату общин JCI.
Здесь вы задаете два разных вопроса.
Один из них - как скомпилировать классы, которых нет в системном пути к классам. Это легко решить, передав аргумент командной строки "-classpath" компилятору (как впервые упомянул Лейка).
Второй - как создать экземпляры ToolProvider и JavaCompiler в загрузчике классов контекста потока. На момент написания этой статьи это нерешенный вопрос: Использование javax.tools.ToolProvider из пользовательского загрузчика классов?