Development/Tutorials/CMake (ru): Difference between revisions

From KDE TechBase
No edit summary
 
(11 intermediate revisions by 6 users not shown)
Line 1: Line 1:
{{Template:I18n/Language Navigation Bar|Development/Tutorials/CMake}}
 


== Введение ==
== Введение ==
Line 31: Line 31:


Разархивируйте и скомпилируйте CMake:
Разархивируйте и скомпилируйте CMake:
<code>
<syntaxhighlight lang="text">
$ mkdir cmake-build
$ mkdir cmake-build
$ cd cmake-build
$ cd cmake-build
Line 37: Line 37:
$ make
$ make
$ make install
$ make install
</code>
</syntaxhighlight>


По умолчанию CMake будет установлен в /usr/local, поэтому убедитесь, что путь /usr/local/bin есть в переменной окружения PATH. To change the installation prefix (e.g. to /usr in debian), add the '--prefix=PATH' option to the bootstrap command.
По умолчанию CMake будет установлен в /usr/local, поэтому убедитесь, что путь /usr/local/bin есть в переменной окружения PATH. Чтобы изменить путь для установки (например сделать /usr для debian), добавьте '--prefix=PATH' к команде bootstrap.


Пожалуйста, следуйте инструкциям на [http://cmake.org/HTML/Download.html#cvs here], если вы хотите использовать текущую разрабатываемую версию.
Следуйте [http://cmake.org/HTML/Download.html#cvs этим] инструкциям, если хотите использовать текущую разрабатываемую версию.


==== Windows ====
==== Windows ====
Line 50: Line 50:
По умолчанию CMake будет установлен в C:\Program Files\CMake 2.4, поэтому убедитесь, что  <installpath>\bin находиться в вашей переменной окружения.   
По умолчанию CMake будет установлен в C:\Program Files\CMake 2.4, поэтому убедитесь, что  <installpath>\bin находиться в вашей переменной окружения.   


Пожалуйста, следуйте инструкциям на [http://cmake.org/HTML/Download.html#cvs here], если вы хотите использовать текущую разрабатываемую версию.
Пожалуйста, следуйте инструкциям, которые находятся [http://cmake.org/HTML/Download.html#cvs здесь], если вы хотите использовать текущую разрабатываемую версию.


=== Запуск CMake ===
=== Запуск CMake ===
CMake генерирует файлы описывающие правила сборки в формате системного инструментария.


==== Linux, BSD, и другие Unix системы ====
==== Linux, BSD, и другие Unix системы ====
 
Если у вас kdelibs/ в папке ~/src/kdelibs/, вам необходимо сделать следующее:
Вы запускайте так, что он генерирует файлы сборки для вашей системы. Внутренние и внешние сборки поддерживаются CMake, но на данный момент внутренние сборки не допускаются реализацией KDE .
<syntaxhighlight lang="text">
 
$ ls ~/src/kdelibs/
Таким образом, если у вас есть kdelibs/ in ~/src/kdelibs/, вам необходимо сделать следующее:
<code>
$ ls
kdelibs/
$ mkdir kdelibs-build
$ mkdir kdelibs-build
$ cd kdelibs-build
$ cd kdelibs-build
$ cmake ../kdelibs
$ cmake ../kdelibs
</code>
</syntaxhighlight>
Этот код сгенерирует Makefiles для сборки kdelibs/ в kdelibs-build/.
Этот код сгенерирует файлы Makefile для сборки kdelibs/ в kdelibs-build/.


==== Windows ====
==== Windows ====
Вы запускайте так, что он генерирует файлы сборки для вашей системы. Внутренние и внешние сборки поддерживаются CMake, но на данный момент внутренние сборки не допускаются реализацией KDE .
Если у вас kdelibs\ in c:\src\kdelibs\, вам необходимо сделать следующее:
 
<syntaxhighlight lang="text">
Таким образом, если у вас есть kdelibs\ in c:\src\kdelibs\, вам необходимо сделать следующее:
<code>
c:\daten\kde4> cd kdelibs\win
c:\daten\kde4> cd kdelibs\win
c:\daten\kde4> cmake
c:\daten\kde4> cmake
Line 81: Line 76:
c:\daten\kde4> cd kdelibs-build
c:\daten\kde4> cd kdelibs-build
c:\daten\kde4\kdelibs-build> cmake ..\kdelibs
c:\daten\kde4\kdelibs-build> cmake ..\kdelibs
</code>
</syntaxhighlight>


Этот код сгенерирует Makefiles для сборки kdelibs\ в kdelibs-build\. Смотрите [[KDE On Windows]] чтобы  получить более подробную информацию о компиляции KDE на Windows.
Этот код сгенерирует файлы Makefile для сборки kdelibs\ в kdelibs-build\. Также см.[Projects/KDE_on_Windows|KDE в Windows]].


==== Файлы проекта KDevelop  ====
==== Файлы проекта KDevelop  ====
Если вы предпочитайте файлы проекта для KDevelop (который базируется на Makefiles сопровождаемый некоторыми дополнительными файлами для KDevelop), запустите их следующим образом:
Если вы предпочитайте файлы проекта KDevelop (файлы Makefile и некоторые дополнительные файлы для KDevelop):
<code>
<syntaxhighlight lang="text">
$ cmake ../kdelibs -GKDevelop3
$ cmake ../kdelibs -GKDevelop3
</code>
</syntaxhighlight>
Используйте 'cmake -h', чтобы найти какие генераторы CMake поддерживают другие опции.
Используйте 'cmake -h', чтобы узнать, какие генераторы CMake поддерживаются.


==== CMake и Qt4 ====
==== CMake и Qt4 ====
Line 96: Line 91:


==== Более подробная информация ====
==== Более подробная информация ====
Когда CMake завершает работу, он создает файл "CMakeCache.txt".  Этот файл содержит все установки CMake которые были определены в вашей системе. Если вы хотите запустить CMake с другим генератором или вы хотите, чтобы CMake определил всё заново, удалите этот файл.
Когда CMake завершает работу, он создает файл CMakeCache.txt.  Этот файл содержит все данные собранные о вашей системе. Если вы хотите запустить CMake с другим генератором или хотите, чтобы CMake определил всё заново, удалите этот файл.


Если CMake не находит что-либо, но вы знайте, что это что-то у вас установлено, вы можете вручную сказать CMake, где это следует искать. CMake использует переменные для хранения этой информации. Эти переменные могут кешироваться в уже упомянутом "CMakeCache.txt".У вас есть три способа задать эти переменные вручную:
Если CMake не находит что-либо, но вы знайте, что это что-то у вас установлено, можно вручную сказать CMake, где это следует искать. CMake использует переменные для хранения этой информации. Эти переменные могут кешироваться в уже упомянутом CMakeCache.txt. Есть три способа задать эти переменные вручную:
* Сказать CMake с помощью командной строки, чтобы он скоректировал значение: cmake ../kdelibs -D <имя_переменной>=<значение>
* Сказать CMake с помощью командной строки, чтобы он скоректировал значение: cmake ../kdelibs -D <имя_переменной>=<значение>
* использовать ccmake, который предоставляет интерфейс на базе библиотеки curses для изменения значений переменных CMake (запустив: ccmake ../kdelibs)
* использовать ccmake, который предоставляет интерфейс на базе библиотеки curses для изменения значений переменных CMake (запустив: ccmake ../kdelibs)
* редактировать файл CMakeCache.txt напрямую (не рекомендуется)
* редактировать файл CMakeCache.txt напрямую (не рекомендуется)


Вам следует запустить "ccmake ../kdelibs" по крайней мере один раз, чтобы получить представление, какие переменные использует  CMake. Нажмите "T", чтобы увидеть также «продвинутые» переменные. Так, если CMake не находит что-либо, запустите ccmake и установите это вручную.
Вам следует запустить ccmake ../kdelibs по крайней мере один раз, чтобы получить представление, какие переменные использует  CMake. Нажмите T, чтобы увидеть также «продвинутые» переменные. Так, если CMake не находит что-либо, запустите ccmake и установите это вручную.


==== Аргументы командной строки ====
==== Аргументы командной строки ====
Line 109: Line 104:
Вы можете установить некоторые параметры через аргументы командной строки:
Вы можете установить некоторые параметры через аргументы командной строки:
* '''CMAKE_INSTALL_PREFIX''': cmake ../kdelibs -DCMAKE_INSTALL_PREFIX=/opt/kde4 это  тоже самое, что ./configure --prefix=/opt/kde4
* '''CMAKE_INSTALL_PREFIX''': cmake ../kdelibs -DCMAKE_INSTALL_PREFIX=/opt/kde4 это  тоже самое, что ./configure --prefix=/opt/kde4
* '''CMAKE_BUILD_TYPE''': определяет, какой тип сборки вы хотите. Вы можете выбрать между "debugfull", "debug", "profile", "relwithdebinfo" и "release". По умолчанию этот параметр "relwithdebinfo" (-O2 -g). Посмотрите FindKDE4Internal.cmake для более подробной информации.
* '''CMAKE_BUILD_TYPE''': определяет, какой тип сборки: debugfull, debug, profile, relwithdebinfo и release. По умолчанию этот параметр равен relwithdebinfo (-O2 -g). Посмотрите FindKDE4Internal.cmake для более подробной информации.
* '''KDE4_BUILD_TESTS=ON''': создает Makefiles with build test programs and also provides 'test' targets
* '''KDE4_BUILD_TESTS=ON''': создает файлы Makefile включающие инструкции по сборке тестов, создаёт цели 'test'
* '''KDE4_TEST_OUTPUT=xml''': Unit tests using the QTestLib framework will create xml formatted logfiles.
* '''KDE4_TEST_OUTPUT=xml''': Unit tests using the QTestLib framework will create xml formatted logfiles.
* '''KDE4_DISABLE_MULTIMEDIA=ON''': Build KDE without any multimedia (audio and video) support.
* '''KDE4_DISABLE_MULTIMEDIA=ON''': Компилирует KDE без какой-либо мультимедиа (аудио, видео) поддержки.
* '''RPATH_STYLE''': This is not available anymore. By default everything will be built with RPATH set correctly. If you don't want RPATH at all, set CMAKE_SKIP_RPATH to TRUE.
* '''RPATH_STYLE''': Этот параметр больше недоступен. By default everything will be built with RPATH set correctly. If you don't want RPATH at all, set CMAKE_SKIP_RPATH to TRUE.
* '''WITH_FOO''': there are several options, e.g. WITH_CUPS or WITH_Jasper. If you disable them, cmake will not even try to find this package. If it is enabled, cmake will try to find it. If it fails with this, you can still adjust it manually as described above.
* '''BUILD_чёто=OFF''': отключает сборку подпапки 'чёто'.
* '''WITH_чёто''': есть несколько опций типа WITH_CUPS или WITH_Jasper. Если вы отключите их, cmake даже не будет искать этот пакет в системе. Если опция включена, cmake будет искать установочный пакет. Если у cmake не получится его найти, вы по-прежнему можете настроить cmake вручную как было описано выше.


=== Переменные окружения ===
=== Переменные окружения ===
Если у вас есть заголовочные файлы и библиотеки, установленные в нестандартные директории, которые cmake не может найти (например fink на Mac OSX установлена в /sw), тогда вам необходимо установить следующие переменные окружения (несмотря на похожие соглашения о наименовании, они не будут работать как аргументы командной строки cmake):
Если у вас есть заголовочные файлы и библиотеки, установленные в нестандартные директории, которые cmake не может найти (например fink на Mac OSX установлена в /sw), тогда вам необходимо установить следующие переменные окружения (несмотря на похожие соглашения о наименовании, они не будут работать как аргументы командной строки cmake):
* '''CMAKE_INCLUDE_PATH''', eg. export CMAKE_INCLUDE_PATH=/sw/include
* '''CMAKE_INCLUDE_PATH''', например export CMAKE_INCLUDE_PATH=/sw/include
* '''CMAKE_LIBRARY_PATH''', eg. export CMAKE_LIBRARY_PATH=/sw/lib
* '''CMAKE_LIBRARY_PATH''', например export CMAKE_LIBRARY_PATH=/sw/lib


Более подробную информацию о переменных окружения смотрите на [http://www.cmake.org/Wiki/CMake_Useful_Variables this cmake.org wiki page]
Более подробную информацию о переменных окружения смотрите на [http://www.cmake.org/Wiki/CMake_Useful_Variables this cmake.org wiki page]


=== Идём дальше ===
=== Идём дальше ===
Если cmake завершается с сообщением "Generating done", тогда ошибок не обнаружено, но если он завершается с сообщением "Configuring done", тогда обнаружены ошибки и вам необходимо их исправить. Когда cmake завершиться успешно, запуститься ваша  система сборки (например make, KDevelop, XCode или MSVC) и соберет ваше приложение.
Если cmake завершается с сообщением "Generating done", тогда ошибок не обнаружено, но если он завершается с сообщением "Configuring done", тогда обнаружены ошибки и вам необходимо их исправить. Когда cmake завершится успешно, запустится ваша  система сборки (например make, KDevelop, XCode или MSVC) и соберет ваше приложение.


Если cmake завершился неудачно, вы увидите что-то вроде этого:
Если cmake завершился неудачно, вы увидите что-то вроде этого:
<code>
<syntaxhighlight lang="text">
CMake Error: This project requires some variables to be set,
CMake Error: This project requires some variables to be set,
and cmake can not find them.
and cmake can not find them.
Please set the following variables:
Please set the following variables:
X11_XTest_LIB (ADVANCED)
X11_XTest_LIB (ADVANCED)
</code>
</syntaxhighlight>
then you may have a missing library (or other dependency). To find
Это означает, что у вас не найдена требуемая библиотека (или другая зависимость). Для того, чтобы понять, какая библиотека не найдена, найдите в каталоге cmake/modules переменную, которую сmake не может найти. Например
out which library, search in the cmake/modules directory for
<syntaxhighlight lang="text">
the variable that cmake can't find. In the example above, it is
<code>
FIND_LIBRARY(X11_XTest_LIB Xtst ${X11_LIB_SEARCH_PATH})
FIND_LIBRARY(X11_XTest_LIB Xtst ${X11_LIB_SEARCH_PATH})
</code>
</syntaxhighlight>


В данном случае не найдена библиотека Xtst. Вам необходимо найти её (возможно установив libXtst-devel) и перезапустить cmake.
В данном случае не найдена библиотека Xtst. Вам необходимо найти её (возможно установив libXtst-devel) и перезапустить cmake.
Line 145: Line 139:


Здесь самый простой пример CMakeLists.txt
Здесь самый простой пример CMakeLists.txt
<code>
<syntaxhighlight lang="text">
add_executable(hello main.cpp)
add_executable(hello main.cpp)
</code>
</syntaxhighlight>
Этот файл создает выполняемый код, который называется "hello" (или "hello.exe" в Windows) из файла исходного текста main.cpp. Вы можете смешивать файлы C и C++ так как вам хочется. Вы можете иметь много исполняемых файлов и библиотек в одном CMakeLists.txt.  Один и тот же файл исходного текст может быть использован для нескольких целей или может быть скомпилирован для каждой цели отдельно. Возможно, самая главная часть языка cmake — это переменные:
Этот файл создает выполняемый код, который называется "hello" (или "hello.exe" в Windows) из файла исходного текста main.cpp. Вы можете смешивать файлы C и C++ так как вам хочется. Вы можете иметь много исполняемых файлов и библиотек в одном CMakeLists.txt.  Один и тот же файл исходного текст может быть использован для нескольких целей или может быть скомпилирован для каждой цели отдельно. Возможно, самая главная часть языка cmake — это переменные:
<code>
<syntaxhighlight lang="text">
SET( MY_SOURCES main.cpp widget.cpp)
SET( MY_SOURCES main.cpp widget.cpp)
MESSAGE(STATUS "my sources: ${MY_SOURCES}")
MESSAGE(STATUS "my sources: ${MY_SOURCES}")
</code>
</syntaxhighlight>
Используйте команду SET(), чтобы установить значение переменной. Если вы составляйте список более чем из одной строки, переменная может быть списком.  Список — это список строк, разделенных точкой с запятой. Если вы установили только один элемент, вам необходимо только значение. Для получение значения переменной используйте ${VAR}.
Используйте команду SET(), чтобы установить значение переменной. Если вы составляйте список более чем из одной строки, переменная может быть списком.  Список — это список строк, разделенных точкой с запятой. Если вы установили только один элемент, вам необходимо только значение. Для получение значения переменной используйте ${VAR}.
Вы можете совершать операции над списком, используя FOREACH():
Вы можете совершать операции над списком, используя FOREACH():
<code>
<syntaxhighlight lang="text">
FOREACH(next_ITEM ${MY_SOURCES})
FOREACH(next_ITEM ${MY_SOURCES})
   MESSAGE(STATUS "next item: ${next_ITEM}")
   MESSAGE(STATUS "next item: ${next_ITEM}")
ENDFOREACH(next_ITEM ${MY_SOURCES})
ENDFOREACH(next_ITEM ${MY_SOURCES})
</code>
</syntaxhighlight>
Команды CMake не чувствительны к регистру. Имена переменных и параметров чувствительны к регистру.
Команды CMake не чувствительны к регистру. Имена переменных и параметров чувствительны к регистру.


Вы можете тестировать различные условия:
Вы можете проверять различные условия:
<code>
<syntaxhighlight lang="text">
IF (UNIX)
IF (UNIX)
   MESSAGE(STATUS "This is UNIX (including OS X and CygWin)")
   MESSAGE(STATUS "This is UNIX (including OS X and CygWin)")
Line 172: Line 166:
   SET(MY_SRCS ${MY_SRCS} winextra.cpp)
   SET(MY_SRCS ${MY_SRCS} winextra.cpp)
ENDIF (MSVC)
ENDIF (MSVC)
</code>
</syntaxhighlight>
 


In the cmake Wiki there is also a [http://www.cmake.org/Wiki/HowToBuildKDE4Software  tutorial] on using cmake to build KDE 4 software. It is recommended reading.
In the cmake Wiki there is also a [http://www.cmake.org/Wiki/HowToBuildKDE4Software  tutorial] on using cmake to build KDE 4 software. It is recommended reading.
Line 180: Line 173:


Здесь приведен файл  CmakeList, который собрирает маленький проект KDE 4:
Здесь приведен файл  CmakeList, который собрирает маленький проект KDE 4:
<code>
<syntaxhighlight lang="text">
PROJECT(kde4project)
PROJECT(kde4project)
FIND_PACKAGE(KDE4 REQUIRED)
FIND_PACKAGE(KDE4 REQUIRED)
Line 190: Line 183:


TARGET_LINK_LIBRARIES(kde4project ${KDE4_KDEUI_LIBS} ${KDE4_KPARTS_LIBS} )
TARGET_LINK_LIBRARIES(kde4project ${KDE4_KDEUI_LIBS} ${KDE4_KPARTS_LIBS} )
</code>
</syntaxhighlight>


Переменные, макросы и другую полезную информацию, относящуюся к KD можно найти на странице [[Development/KDE and CMake Together]].
Переменные, макросы и другую полезную информацию, относящуюся к KD можно найти на странице [[Development/CMake/Addons for KDE]].


== Расширение CMake ==
== Расширение CMake ==
CMake может быть расширен использованием скритов cmake. CMake поставляется с некоторым количеством скриптов; в UNIX они по умолчанию устанавливаются в /usr/local/share/CMake/Modules/. Библиотеки KDE также устанавливаются с набором модулей cmake в share/apps/cmake/modules/. The files located there will be preferred over the ones in the system global cmake module path.  
CMake может быть расширен использованием скриптов cmake. CMake поставляется с некоторым количеством скриптов; в UNIX они по умолчанию устанавливаются в /usr/local/share/CMake/Modules/. Библиотеки KDE также устанавливаются с набором модулей cmake в share/apps/cmake/modules/. The files located there will be preferred over the ones in the system global cmake module path.  
For detecting software packages there are FindFOO.cmake files, see [http://www.cmake.org/Wiki/CMake_HowToFindInstalledSoftware here] for more information.
Для определения программных пакетов существуют файлы FindFOO.cmake. Более подробно об этом смотрите [http://www.cmake.org/Wiki/CMake_HowToFindInstalledSoftware здесь].
Вы также можете писать макросы в CMake. Они достаточно мощные, чтобы делать всё что вам нужно для сборки приложения, но они не предназначены для того, чтобы использоваться как язык программирования общего назначения.
Вы также можете писать макросы в CMake. Они достаточно мощные, чтобы делать всё что вам нужно для сборки приложения, но они не предназначены для того, чтобы использоваться как язык программирования общего назначения.


== Преобразование приложений KDE на базе autotools в приложения KDE на базе CMake ==
== Преобразование приложений KDE на базе autotools в приложения KDE на базе CMake ==
В kdesdk/cmake/ вы можете найти скрипт am2cmake . Это скрипт на языке Ruby, поэтому необходимо чтобы Ruby был установлен. Запустите am2cmake в корневой директории дерева исходных кодов:
В kdesdk/cmake/ вы можете найти скрипт am2cmake . Это скрипт на языке Ruby, поэтому необходимо чтобы Ruby был установлен. Запустите am2cmake в корневой директории дерева исходных кодов:
<code>
<syntaxhighlight lang="text">
$ cd src/mykooltool/
$ cd src/mykooltool/
$ am2cmake --kde4
$ am2cmake --kde4
</code>
</syntaxhighlight>
Не забудьте переключатель "--kde4", в противном случае вы не получите файлов, подходящих для сборки приложений для KDE 4. Преобразованные файлы могут работать сразу,  но сложные проекты требует некоторого дополнительного редактирования.
Не забудьте переключатель --kde4, в противном случае вы не получите файлов, подходящих для сборки приложений для KDE 4. Преобразованные файлы могут работать сразу,  но сложные проекты требует некоторого дополнительного редактирования.


Вы можете также:
Вы можете также:
Line 211: Line 204:
* добавить дополнительные библиотеки, используя TARGET_LINK_LIBRARIES()
* добавить дополнительные библиотеки, используя TARGET_LINK_LIBRARIES()
* добавить дополнительные ключи компиляции, используя ADD_DEFINITIONS()
* добавить дополнительные ключи компиляции, используя ADD_DEFINITIONS()
* add some "configure" checks, see [http://www.cmake.org/Wiki/CMake_HowToDoPlatformChecks How To Do Platform Checks] and [http://www.cmake.org/Wiki/CMake_HowToFindInstalledSoftware How To Find Installed Software]
* добавлять проверки для "configure" , подробнее об этом можно узнать на [http://www.cmake.org/Wiki/CMake_HowToDoPlatformChecks How To Do Platform Checks] и [http://www.cmake.org/Wiki/CMake_HowToFindInstalledSoftware How To Find Installed Software]
* take special care of former libtool convenience libraries. They are not supported by cmake, instead there will be a file ConvenienceLibs.cmake created.  In this file you will find for every convenience lib a variable, which contains all source files of this convenience lib.  For the targets which linked to this convenience lib, just add the variable to the sources.
* take special care of former libtool convenience libraries. They are not supported by cmake, instead there will be a file ConvenienceLibs.cmake created.  In this file you will find for every convenience lib a variable, which contains all source files of this convenience lib.  For the targets which linked to this convenience lib, just add the variable to the sources.
* a file AdditionalInfo.txt will be created.  There you will see all *.in and *.in.in files of your project. The stuff done in these files will have to be converted manually to cmake.
* a file AdditionalInfo.txt will be created.  There you will see all *.in and *.in.in files of your project. The stuff done in these files will have to be converted manually to cmake.
Line 218: Line 211:


=== Как я могу научить мой любимый редактор синтаксису и выравниванию CMake ? ===
=== Как я могу научить мой любимый редактор синтаксису и выравниванию CMake ? ===
Прочитайте раздел CMake Wiki  [http://www.cmake.org/Wiki/CMake_Editors_Support CMake Editors Support]. В нем описывается, как настроить Emacs (XEmacs тоже работает), VIM, Kate, KWrite, и KDevelop.
Прочитайте раздел CMake Wiki  [http://www.cmake.org/Wiki/CMake_Editors_Support CMake Editors Support]. В нем описывается, как настроить Emacs (XEmacs тоже работает), VIM, Kate, KWrite и KDevelop.


=== Мне необходиом создать некоторые файлы в процессе сборки. Как мне это сделать ? ===
=== Мне необходимо создать некоторые файлы в процессе сборки. Как мне это сделать ? ===
Используйте ADD_CUSTOM_COMMAND(). Это объясняется в CMake wiki: [http://www.cmake.org/Wiki/CMake_FAQ#How_can_I_generate_a_source_file_during_the_build.3F  How can I generate a source file during the build]
Используйте ADD_CUSTOM_COMMAND(). Это объясняется в CMake wiki: [http://www.cmake.org/Wiki/CMake_FAQ#How_can_I_generate_a_source_file_during_the_build.3F  How can I generate a source file during the build]


=== Мне необходимо собрать исполняемый модуль, который будет использоваться позже в процессе сборки для создания файлов. Как мне это сделать ? ===
=== Мне необходимо собрать исполняемый модуль, который будет использоваться позже в процессе сборки для создания файлов. Как мне это сделать ? ===


Let's say the executable is called genembed. Then use KDE4_ADD_EXECUTABLE(foo RUN_UNINSTALLED ${fooSources})to create the executable. The RUN_UNINSTALLED option is important, because the executable has to run from the build dir and has to link to the libraries in the builddir. To achieve this, the executable is compiled with RPATH set accordingly and a wrapper shell script, named just like the executable but with the suffix ".sh" is created. This shell scripts sets up LD_LIBRARY_PATH and the calls the actual executable.
Предположим, что исполняемый файл называется genembed. В этом случае используйте KDE4_ADD_EXECUTABLE(foo RUN_UNINSTALLED ${fooSources}) для того, чтобы создать исполняемый файл. Параметр RUN_UNINSTALLED нужен для того, чтобы исполняемый файл запускать из каталога, в котором он был собран и связывать его с библиотеками, которые находятся в каталоге сборки. Чтобы достичь этого, исполняемый файл компилируется с установленной соответствующим образом RPATH и скрипт, названный как исполняемый файл, но имеющий расширение ".sh". Скрипт устанавливает LD_LIBRARY_PATH и вызывает существующий исполняемый файл.
Use this wrapper shell script in the ADD_CUSTOM_COMMAND() as described above.
Использование этого скрипта в ADD_CUSTOM_COMMAND() описано ниже. Вы можете получить его имя и расположение запросом свойства WRAPPER_SCRIPT. Здесь дан полный пример, взяты из kdelibs/kstyles/keramik/ :
You can find out the name and exact location by querying the property WRAPPER_SCRIPT. Here's a full example taken from kdelibs/kstyles/keramik/ :
<syntaxhighlight lang="text">
<code>
# собрать исполняемый файл
# build the executable
KDE4_ADD_EXECUTABLE(genembed RUN_UNINSTALLED ${genembed_SRCS})
KDE4_ADD_EXECUTABLE(genembed RUN_UNINSTALLED ${genembed_SRCS})


# get the name of the generated wrapper script (which sets up LD_LIBRARY_PATH)
# получит имя сгенерированного
get the name of the generated wrapper script (which sets up LD_LIBRARY_PATH)
GET_TARGET_PROPERTY(GENEMBED_EXECUTABLE genembed WRAPPER_SCRIPT)
GET_TARGET_PROPERTY(GENEMBED_EXECUTABLE genembed WRAPPER_SCRIPT)


Line 241: Line 234:
   DEPENDS genembed ${keramikPics}
   DEPENDS genembed ${keramikPics}
)
)
</code>
</syntaxhighlight>


As you can see genembed is also listed as a dependency, this means cmake knows that it has to build the executable genembed before executing this rule.
Как видите, genembed здесь обозначен как зависимость. Это значит, что cmake должен собрать genembed перед тем, как использовать это правило.


=== Я не хочу устанавливать параметр командной строки -DCMAKE_INSTALL_PREFIX .cmake поддерживает переменную окружения KDEDIR ? ===
=== Я не хочу устанавливать параметр командной строки -DCMAKE_INSTALL_PREFIX. cmake поддерживает переменную окружения KDEDIR ? ===
Нет. $KDEDIR устарела в KDE 4.
Нет. $KDEDIR устарела в KDE 4.


Line 253: Line 246:
=== Как я могу указать cmake создавать подробные makefiles?  Я хочу видеть, какие точно запускаются команды в процессе сборки. ===
=== Как я могу указать cmake создавать подробные makefiles?  Я хочу видеть, какие точно запускаются команды в процессе сборки. ===
Передайте переменную VERBOSE в make, то есть
Передайте переменную VERBOSE в make, то есть
<code>
<syntaxhighlight lang="text">
% make VERBOSE=1
% make VERBOSE=1
</code>
</syntaxhighlight>
или
или
<code>
<syntaxhighlight lang="text">
% VERBOSE=1 make
% VERBOSE=1 make
</code>
</syntaxhighlight>


Более подробную информацию можно найти на CMake wiki: [http://www.cmake.org/Wiki/CMake_FAQ#Is_there_an_option_to_produce_more_.27verbose.27_compiling.3F Is there an option to produce more 'verbose' compiling?]
Более подробную информацию можно найти на CMake wiki: [http://www.cmake.org/Wiki/CMake_FAQ#Is_there_an_option_to_produce_more_.27verbose.27_compiling.3F Is there an option to produce more 'verbose' compiling?]


=== There is no 'make distclean' target in the generated MakefilesHow do I clean up everything, including the cache files? ===
=== В сгенерированном Makefile нет цели 'make distclean'.  Как я могу очистить всё, включаю кешированные файлы? ===
Simply remove the build directory, or just the contents of the build directory.
Удалите директорию, в которой было собрано приложение или просто удалите её содержимое.


[[Category:Programming]]
[[Category:Programming]]
[[Category:Tutorial]]
[[Category:Tutorial]]
[[Category:FAQs]]
[[Category:FAQs]]

Latest revision as of 09:54, 14 July 2012


Введение

CMake считывает файлы сценария и генерирует входные файлы для системы сборки той платформы, на которой он запущен. Он может создавать GNU Makefiles, файлы проекта KDevelop , файлы проекта XCode и файлы проекты Visual Studio.

CMake — это свободное программное обеспечение, выпущенное под лицензией, подобной BSD. CMake разработана Kitware Inc.

Здесь приведены несколько интересных ссылок, где вы можете найти информацию о CMake:

Также вы можете присоединиться к CMake mailing list.

Почему необходимо использовать CMake ?

CMake — это официальный инструмент для выпуска KDE 4, решение использовать который было принято в марте 2006, главным образом из-за технических преимуществ по сравнению с более старыми инструментами KDE: automake и unsermake.

  • CMake разработан независимо от KDE и может быть использован другими проектами
  • Время компиляции значительно меньше, главным достоинством является то, что он больше не испольует libtool
  • Файлы сборки более просты для написания

Как скомпилировать KDE с использованием CMake

Получение и установка CMake

Linux, BSD, и другие Unix системы

Загрузите последнюю стабильную версию CMake с [1].

Разархивируйте и скомпилируйте CMake:

$ mkdir cmake-build
$ cd cmake-build
$ ../bootstrap
$ make
$ make install

По умолчанию CMake будет установлен в /usr/local, поэтому убедитесь, что путь /usr/local/bin есть в переменной окружения PATH. Чтобы изменить путь для установки (например сделать /usr для debian), добавьте '--prefix=PATH' к команде bootstrap.

Следуйте этим инструкциям, если хотите использовать текущую разрабатываемую версию.

Windows

Загрузите последнюю стабильную версию CMake с [2].

Запустите инсталлятор CMake.

По умолчанию CMake будет установлен в C:\Program Files\CMake 2.4, поэтому убедитесь, что <installpath>\bin находиться в вашей переменной окружения.

Пожалуйста, следуйте инструкциям, которые находятся здесь, если вы хотите использовать текущую разрабатываемую версию.

Запуск CMake

CMake генерирует файлы описывающие правила сборки в формате системного инструментария.

Linux, BSD, и другие Unix системы

Если у вас kdelibs/ в папке ~/src/kdelibs/, вам необходимо сделать следующее:

$ ls ~/src/kdelibs/
$ mkdir kdelibs-build
$ cd kdelibs-build
$ cmake ../kdelibs

Этот код сгенерирует файлы Makefile для сборки kdelibs/ в kdelibs-build/.

Windows

Если у вас kdelibs\ in c:\src\kdelibs\, вам необходимо сделать следующее:

c:\daten\kde4> cd kdelibs\win
c:\daten\kde4> cmake
c:\daten\kde4> make 
c:\daten\kde4> make install
c:\daten\kde4> cd ..
c:\daten\kde4> mkdir kdelibs-build
c:\daten\kde4> cd kdelibs-build
c:\daten\kde4\kdelibs-build> cmake ..\kdelibs

Этот код сгенерирует файлы Makefile для сборки kdelibs\ в kdelibs-build\. Также см.[Projects/KDE_on_Windows|KDE в Windows]].

Файлы проекта KDevelop

Если вы предпочитайте файлы проекта KDevelop (файлы Makefile и некоторые дополнительные файлы для KDevelop):

$ cmake ../kdelibs -GKDevelop3

Используйте 'cmake -h', чтобы узнать, какие генераторы CMake поддерживаются.

CMake и Qt4

Чтобы определить местонахождение Qt 4, CMake ищет qmake в переменной окружения PATH. CMake не использует переменную окружения QTDIR.

Более подробная информация

Когда CMake завершает работу, он создает файл CMakeCache.txt. Этот файл содержит все данные собранные о вашей системе. Если вы хотите запустить CMake с другим генератором или хотите, чтобы CMake определил всё заново, удалите этот файл.

Если CMake не находит что-либо, но вы знайте, что это что-то у вас установлено, можно вручную сказать CMake, где это следует искать. CMake использует переменные для хранения этой информации. Эти переменные могут кешироваться в уже упомянутом CMakeCache.txt. Есть три способа задать эти переменные вручную:

  • Сказать CMake с помощью командной строки, чтобы он скоректировал значение: cmake ../kdelibs -D <имя_переменной>=<значение>
  • использовать ccmake, который предоставляет интерфейс на базе библиотеки curses для изменения значений переменных CMake (запустив: ccmake ../kdelibs)
  • редактировать файл CMakeCache.txt напрямую (не рекомендуется)

Вам следует запустить ccmake ../kdelibs по крайней мере один раз, чтобы получить представление, какие переменные использует CMake. Нажмите T, чтобы увидеть также «продвинутые» переменные. Так, если CMake не находит что-либо, запустите ccmake и установите это вручную.

Аргументы командной строки

Вы можете установить некоторые параметры через аргументы командной строки:

  • CMAKE_INSTALL_PREFIX: cmake ../kdelibs -DCMAKE_INSTALL_PREFIX=/opt/kde4 это тоже самое, что ./configure --prefix=/opt/kde4
  • CMAKE_BUILD_TYPE: определяет, какой тип сборки: debugfull, debug, profile, relwithdebinfo и release. По умолчанию этот параметр равен relwithdebinfo (-O2 -g). Посмотрите FindKDE4Internal.cmake для более подробной информации.
  • KDE4_BUILD_TESTS=ON: создает файлы Makefile включающие инструкции по сборке тестов, создаёт цели 'test'
  • KDE4_TEST_OUTPUT=xml: Unit tests using the QTestLib framework will create xml formatted logfiles.
  • KDE4_DISABLE_MULTIMEDIA=ON: Компилирует KDE без какой-либо мультимедиа (аудио, видео) поддержки.
  • RPATH_STYLE: Этот параметр больше недоступен. By default everything will be built with RPATH set correctly. If you don't want RPATH at all, set CMAKE_SKIP_RPATH to TRUE.
  • BUILD_чёто=OFF: отключает сборку подпапки 'чёто'.
  • WITH_чёто: есть несколько опций типа WITH_CUPS или WITH_Jasper. Если вы отключите их, cmake даже не будет искать этот пакет в системе. Если опция включена, cmake будет искать установочный пакет. Если у cmake не получится его найти, вы по-прежнему можете настроить cmake вручную как было описано выше.

Переменные окружения

Если у вас есть заголовочные файлы и библиотеки, установленные в нестандартные директории, которые cmake не может найти (например fink на Mac OSX установлена в /sw), тогда вам необходимо установить следующие переменные окружения (несмотря на похожие соглашения о наименовании, они не будут работать как аргументы командной строки cmake):

  • CMAKE_INCLUDE_PATH, например export CMAKE_INCLUDE_PATH=/sw/include
  • CMAKE_LIBRARY_PATH, например export CMAKE_LIBRARY_PATH=/sw/lib

Более подробную информацию о переменных окружения смотрите на this cmake.org wiki page

Идём дальше

Если cmake завершается с сообщением "Generating done", тогда ошибок не обнаружено, но если он завершается с сообщением "Configuring done", тогда обнаружены ошибки и вам необходимо их исправить. Когда cmake завершится успешно, запустится ваша система сборки (например make, KDevelop, XCode или MSVC) и соберет ваше приложение.

Если cmake завершился неудачно, вы увидите что-то вроде этого:

CMake Error: This project requires some variables to be set,
and cmake can not find them.
Please set the following variables:
X11_XTest_LIB (ADVANCED)

Это означает, что у вас не найдена требуемая библиотека (или другая зависимость). Для того, чтобы понять, какая библиотека не найдена, найдите в каталоге cmake/modules переменную, которую сmake не может найти. Например

FIND_LIBRARY(X11_XTest_LIB Xtst ${X11_LIB_SEARCH_PATH})

В данном случае не найдена библиотека Xtst. Вам необходимо найти её (возможно установив libXtst-devel) и перезапустить cmake.

Использование CMake для простого приложения

Здесь самый простой пример CMakeLists.txt

add_executable(hello main.cpp)

Этот файл создает выполняемый код, который называется "hello" (или "hello.exe" в Windows) из файла исходного текста main.cpp. Вы можете смешивать файлы C и C++ так как вам хочется. Вы можете иметь много исполняемых файлов и библиотек в одном CMakeLists.txt. Один и тот же файл исходного текст может быть использован для нескольких целей или может быть скомпилирован для каждой цели отдельно. Возможно, самая главная часть языка cmake — это переменные:

SET( MY_SOURCES main.cpp widget.cpp)
MESSAGE(STATUS "my sources: ${MY_SOURCES}")

Используйте команду SET(), чтобы установить значение переменной. Если вы составляйте список более чем из одной строки, переменная может быть списком. Список — это список строк, разделенных точкой с запятой. Если вы установили только один элемент, вам необходимо только значение. Для получение значения переменной используйте ${VAR}. Вы можете совершать операции над списком, используя FOREACH():

FOREACH(next_ITEM ${MY_SOURCES})
   MESSAGE(STATUS "next item: ${next_ITEM}")
ENDFOREACH(next_ITEM ${MY_SOURCES})

Команды CMake не чувствительны к регистру. Имена переменных и параметров чувствительны к регистру.

Вы можете проверять различные условия:

IF (UNIX)
   MESSAGE(STATUS "This is UNIX (including OS X and CygWin)")
ENDIF (UNIX)

В этом примере вы можете увидеть, как добавлять элементы в список:
IF (MSVC)
   SET(MY_SRCS ${MY_SRCS} winextra.cpp)
ENDIF (MSVC)

In the cmake Wiki there is also a tutorial on using cmake to build KDE 4 software. It is recommended reading.

Использование CMake для проекта KDE

Здесь приведен файл CmakeList, который собрирает маленький проект KDE 4:

PROJECT(kde4project)
FIND_PACKAGE(KDE4 REQUIRED)
INCLUDE_DIRECTORIES( ${KDE4_INCLUDES} )

SET(KDE4ProjectSources kde4mainapp.cpp someclass.cpp someotherclass.cpp)

KDE4_ADD_EXECUTABLE(kde4project ${KDE4ProjectSources} )

TARGET_LINK_LIBRARIES(kde4project ${KDE4_KDEUI_LIBS} ${KDE4_KPARTS_LIBS} )

Переменные, макросы и другую полезную информацию, относящуюся к KD можно найти на странице Development/CMake/Addons for KDE.

Расширение CMake

CMake может быть расширен использованием скриптов cmake. CMake поставляется с некоторым количеством скриптов; в UNIX они по умолчанию устанавливаются в /usr/local/share/CMake/Modules/. Библиотеки KDE также устанавливаются с набором модулей cmake в share/apps/cmake/modules/. The files located there will be preferred over the ones in the system global cmake module path. Для определения программных пакетов существуют файлы FindFOO.cmake. Более подробно об этом смотрите здесь. Вы также можете писать макросы в CMake. Они достаточно мощные, чтобы делать всё что вам нужно для сборки приложения, но они не предназначены для того, чтобы использоваться как язык программирования общего назначения.

Преобразование приложений KDE на базе autotools в приложения KDE на базе CMake

В kdesdk/cmake/ вы можете найти скрипт am2cmake . Это скрипт на языке Ruby, поэтому необходимо чтобы Ruby был установлен. Запустите am2cmake в корневой директории дерева исходных кодов:

$ cd src/mykooltool/
$ am2cmake --kde4

Не забудьте переключатель --kde4, в противном случае вы не получите файлов, подходящих для сборки приложений для KDE 4. Преобразованные файлы могут работать сразу, но сложные проекты требует некоторого дополнительного редактирования.

Вы можете также:

  • добавить дополнительные директории, исользуя INCLUDE_DIRECTORIES()
  • добавить дополнительные библиотеки, используя TARGET_LINK_LIBRARIES()
  • добавить дополнительные ключи компиляции, используя ADD_DEFINITIONS()
  • добавлять проверки для "configure" , подробнее об этом можно узнать на How To Do Platform Checks и How To Find Installed Software
  • take special care of former libtool convenience libraries. They are not supported by cmake, instead there will be a file ConvenienceLibs.cmake created. In this file you will find for every convenience lib a variable, which contains all source files of this convenience lib. For the targets which linked to this convenience lib, just add the variable to the sources.
  • a file AdditionalInfo.txt will be created. There you will see all *.in and *.in.in files of your project. The stuff done in these files will have to be converted manually to cmake.

Часто задаваемые вопросы

Как я могу научить мой любимый редактор синтаксису и выравниванию CMake ?

Прочитайте раздел CMake Wiki CMake Editors Support. В нем описывается, как настроить Emacs (XEmacs тоже работает), VIM, Kate, KWrite и KDevelop.

Мне необходимо создать некоторые файлы в процессе сборки. Как мне это сделать ?

Используйте ADD_CUSTOM_COMMAND(). Это объясняется в CMake wiki: How can I generate a source file during the build

Мне необходимо собрать исполняемый модуль, который будет использоваться позже в процессе сборки для создания файлов. Как мне это сделать ?

Предположим, что исполняемый файл называется genembed. В этом случае используйте KDE4_ADD_EXECUTABLE(foo RUN_UNINSTALLED ${fooSources}) для того, чтобы создать исполняемый файл. Параметр RUN_UNINSTALLED нужен для того, чтобы исполняемый файл запускать из каталога, в котором он был собран и связывать его с библиотеками, которые находятся в каталоге сборки. Чтобы достичь этого, исполняемый файл компилируется с установленной соответствующим образом RPATH и скрипт, названный как исполняемый файл, но имеющий расширение ".sh". Скрипт устанавливает LD_LIBRARY_PATH и вызывает существующий исполняемый файл. Использование этого скрипта в ADD_CUSTOM_COMMAND() описано ниже. Вы можете получить его имя и расположение запросом свойства WRAPPER_SCRIPT. Здесь дан полный пример, взяты из kdelibs/kstyles/keramik/ :

# собрать исполняемый файл
KDE4_ADD_EXECUTABLE(genembed RUN_UNINSTALLED ${genembed_SRCS})

# получит имя сгенерированного 
get the name of the generated wrapper script (which sets up LD_LIBRARY_PATH)
GET_TARGET_PROPERTY(GENEMBED_EXECUTABLE genembed WRAPPER_SCRIPT)

# and the custom command
ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/keramikrc.h
  COMMAND ${GENEMBED_EXECUTABLE} --file ${CMAKE_CURRENT_BINARY_DIR}/keramikPics.txt > \
  ${CMAKE_CURRENT_BINARY_DIR}/pixmaps.keramik
  DEPENDS genembed ${keramikPics}
)

Как видите, genembed здесь обозначен как зависимость. Это значит, что cmake должен собрать genembed перед тем, как использовать это правило.

Я не хочу устанавливать параметр командной строки -DCMAKE_INSTALL_PREFIX. cmake поддерживает переменную окружения KDEDIR ?

Нет. $KDEDIR устарела в KDE 4.

Почему я получаю ошибки при компиляции, такие как /usr/lib/qt4/include/QtCore/qstring.h:536: undefined reference to `QString::fromLatin1_helper(char const*, int)'?

A: Если у вас старая версия Qt4 в директории qt/lib, вы должны удалить старые (4.0.1) файлы.

Как я могу указать cmake создавать подробные makefiles? Я хочу видеть, какие точно запускаются команды в процессе сборки.

Передайте переменную VERBOSE в make, то есть

% make VERBOSE=1

или

% VERBOSE=1 make

Более подробную информацию можно найти на CMake wiki: Is there an option to produce more 'verbose' compiling?

В сгенерированном Makefile нет цели 'make distclean'. Как я могу очистить всё, включаю кешированные файлы?

Удалите директорию, в которой было собрано приложение или просто удалите её содержимое.