2015-10-30 2 views
1

В моем проекте на основе CMake у меня есть некоторые XML-файлы, которые используются для генерации кода (с использованием типичного шаблона add_custom_target).Создание/исправление XML-файла с переменной CMake

Этот XML-файл включает в себя другие файлы следующим образом:

<?xml version="1.0" encoding="utf-8"?> 
    <definition 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:noNamespaceSchemaLocation="../../../MyComponent/schema.xsd"> 
    <include href="../../../MyComponent/another.xml" /> 
</definition> 

Теперь я хочу, чтобы ../../../MyComponent зависит от переменной CMake. То, что определенно будет работать, - это написать генератор, который принимает шаблон XML и заменяет пути содержимым переменной CMake, используя здесь также шаблон add_custom_command & add_custom_target.

Есть ли решение, которое использовало бы простые механизмы CMake и/или XML для исправления или создания правильного пути?

+0

Если вам не нужен этот XML вне среды сборки CMake, вы можете добавить синтаксис '$ {...}' в свой XML-файл и использовать ['configure_file()'] (https: // cmake.org/cmake/help/v3.3/command/configure_file.html) для создания «настроенной» версии, например ваш двоичный выходной каталог. – Florian

+0

Это очень хороший совет, спасибо! Я не знал эту команду CMake. Не стесняйтесь формулировать это как ответ, который я бы выбрал в качестве ответа. –

ответ

2

Повернувшись мой комментарий в ответ

Я использовал следующую технику, например, генерировать пользовательский проект, устанавливающий XML-файлы для CMake сгенерированных окружений VS (см., например, this запись в блоге Джим Батлер).

В вашем случае я хотел бы сделать:

some.xml.in

<?xml version="1.0" encoding="utf-8"?> 
    <definition 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:noNamespaceSchemaLocation="${_my_xml_root_path}/schema.xsd"> 
    <include href="${_my_xml_root_path}/another.xml" /> 
</definition> 

И в вашем CMakeLists.txt что-то вроде (в зависимости от пути, который вы хотите, чтобы ввести):

get_filename_component(_my_xml_root_path "../../../MyComponent" ABSOLUTE) 
set(_some_xml_path "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/some.xml") 
configure_file("some.xml.in" "${_some_xml_path}") 

Затем вы можете использовать ${_some_xml_path} позже, чтобы указать в качестве входного файла какой-либо другой шаг сборки.

Смежные вопросы