Как мне убедиться, что имя каталога указано в OMake?
У меня есть довольно сложный набор файлов OMake, предназначенных для кросс-компиляции на конкретной платформе. Мой источник на C++.
Я строю из Windows, и мне нужно передать компилятору каталоги, в именах которых есть пробелы. Способ, которым строка include, которая вставляется в командную строку для компиляции файлов, создается строкой:
public.PREFIXED_INCLUDES = $`(addprefix $(INCLUDES_OPT), $(set $(absname $(INCLUDES))))
В какой-то другой момент в файлах OMake у меня есть строка вроде:
INCLUDES += $(dir "$(LIBRARY_LOCATION)/Path with spaces/include")
В середине командной строки это расширяется до:
-IC:\Library location with spaces\Path with spaces\include
Я хочу, чтобы это расширилось до:
-I"C:\Library location with spaces\Path with spaces\include"
Я не хочу ничего менять, кроме строки "INCLUDES += ...", если это возможно, хотя изменение чего-то еще в этом файле тоже подойдет. Я не хочу делать что-то вроде изменения определения PREFIXED_INCLUDES, так как это в наборе файлов OMake, которые являются частью SDK, которые могут измениться подо мной. Это возможно? Если так, как я могу это сделать? Если нет, каким образом я могу убедиться, что включаемые в них пробелы заключаются в кавычки путем изменения небольшого кода make-файла (возможно, одной строки)?
2 ответа
Стандартная функция библиотеки quote
добавляет экранированные кавычки вокруг своего аргумента, поэтому он должен делать работу:
INCLUDES += $(quote $(dir "$(LIBRARY_LOCATION)/Path with spaces/include"))
При необходимости см. quote
в руководстве Omake.
В случае, если у кого-то еще возникла такая же проблема, я подумала, что поделюсь решением, с которым я в конечном итоге пошла, никогда не придумывая, как заключить в кавычки. Вместо того, чтобы заключать в кавычки имя с пробелами, я в конечном итоге преобразовал путь в короткую (8.3) версию. Я сделал это с помощью простого файла JScript с именем shorten.js и однострочной функцией OMake.
Сценарий:
// Get Access to the file system.
var FileSystemObject = WScript.CreateObject("Scripting.FileSystemObject");
// Get the short path.
var shortPath = FileSystemObject.GetFolder(WScript.Arguments(0)).ShortPath;
// Output short path.
WScript.StdOut.Write(shortPath);
Функция:
ShortDirectoryPath(longPath) =
return $(dir $(shell cscript /Nologo $(dir ./tools/shorten.js) "$(absname $(longPath))"))
Так что теперь я просто использую следующую строку для include:
INCLUDES += $(ShortDirectoryPath $(dir "$(LIBRARY_LOCATION)/Path with spaces/include"))