RBuild Files
Файлы RBuild
Предупреждение: В ReactOS RBuild больше не используется. Лучше обратитесь к руководству по CMake. В этом обзоре речь пойдёт о создании с нуля файла .rbuild. Для получения общей информации о возможностях, доступных при создании файлов RBuild, перейдите по ссылке Файлы RBuild.
Если у вас имеется программа, которую вы хотите скомпилировать в ReactOS, вам потребуется её исходный код. Кроме того, необходимо будет создать для него конфигурационный файл rbuild. В этом примере мы предположим, что программа называется Foo. Описание опций будет вестись в том порядке, в котором они должны следовать в файле .rbuild.
Файлы .rbuild представляет собой документ XML, поэтому он должен начинаться с тега xml и ссылки на DTD. Путь к DTD зависит от расположения у вас дерева исходного кода. Например:
<?xml version="1.0"?> <!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
Далее, вы задаёте тип нового модуля (исполняемого файла). Имеются следующие варианты:
- win32cui (консольное приложение)
- win32gui (приложение Windows)
- win32ocx (нестандартные элементы управления OLE)
- win32dll (динамически подключаемые библиотеки)
- objectlibrary (статически подключаемые библиотеки)
- exportdriver (драйверы, экспортирующие общие символы)
- kernelmodedriver (драйвер .sys)
Есть ещё параметр, который вы можете добавить, это unicode="true/false". Также, если вы компилируете драйвер, то вы должны указать точку входа: entrypoint="DriverEntry@8".
<module name="foo" type="win32gui" installname="foo.exe" allowwarnings="true">
Следующая строка потребуется, только если вам будет необходимо экспортировать функции. Это чаще всего используется в DLL, в этом случае ваш файл должен находиться в папке вроде /dll/*/foo. Драйверы иногда тоже экспортируют функции.
<importlibrary definition="foo.def" />
Следующая строка потребуется только в том случае, если вам необходим нестандартный заголовок, который размещён в другой директории, а не в директории вашего кода. В ином случае, добавлять его в файл не нужно.
<include base="namedir">actualdir</include>
Как вариант, вы можете добавить что-то вроде #include "namedir/foo.h".
Этот оператор равнозначен #define в вашем исходном коде. Использование его делает возможным использование вашего заголовка для всех файлов.
<define name="_WIN32_WINNT">0x0501</define>
Следующий оператор используется для обозначения необходимости использования скомпилированных заголовков. Он указывает компилятору на необходимость прекомпиляции указанного заголовка и всех его включений.
<pch>precomp.h</pch>
В следующем операторе задается поддиректория, в которой вы будите производить какие-либо действия. После того, как вы закончили ввод конфигурационной информации, вы должны закрыть его. Вы увидите один из примеров его использования ниже.
<directory name="stuff"> (некоторые дополнительные параметры настройки) </directory>
Если вы хотите использовать флаги конфигурации ROS, то используйте следующие строки для выбора условий.
<if property="CONFIGFLAG" value="setting"> (некоторые дополнительные параметры настройки) </if>
В следующем операторе указываются зависимости вашего модуля от других модулей, так что компилятор всегда знает о необходимости перекомпиляции вашего модуля в случае внесения изменений в других модулях.
<dependency>wineheaders</dependency>
Далее указываются используемые вами библиотеки. Если вы используете более чем одну библиотеку, описание производится в несколько строк.
<library>user32</library> <library>shell32</library>
Для этого вам необходимо знать, какие библиотеки потребуются вашей программе. Если вы не знаете, то вы можете попробовать скомпилировать программу и посмотреть, на отсутствие каких функций жалуется GCC, и выяснить, где они находятся.
Если вы хотите задать особые флаги компоновщика, используйте оператор, подобный приведённому ниже:
<linkerflag>-nostdlib</linkerflag>
Если вы хотите соединить несколько файлов вместе, и скомпилировать их как один файл, добавьте в <file> следующее:
<compilationunit name = allfoo.c>
Далее следует список компилируемых файлов.
<file>main.c</file> <file>functions.c</file>
Если выше вы использовали <compliationunit>, то вы должны закрыть его.
</compliationunit>
Вы можете закончить определение модуля так.
</module>
Как только вы закончили создание файла rbuild, вы должны перейти на уровень вверх и добавить к находящемуся там фалу rbuild следующее:
<directory name = "foo"> <x:include href="foo/foo.rbuild"> </directory>
Теперь вы можете скомпилировать новый модуль командой "make foo".
Ниже приведён более обширный пример.
<?xml version="1.0"?> <!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd"> <module name="foo" type="win32gui" installname="foo.exe"> <library>user32</library> <file>foo.c</file> </module>
Примечания
- Использование обратной косой черты в Linux прервёт процесс сборки. Всегда используйте прямую(/) косую черту. mingw поймёт, что вы имеете ввиду.
- Кроме того, используйте табуляцию (tab) для отступа от края.