Как мне убедиться, что имя каталога указано в 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"))
Другие вопросы по тегам