<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="http://wiki2.linuxformat.ru/skins/common/feed.css?97"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title>LXF111:CMake - История изменений</title>
		<link>http://wiki2.linuxformat.ru/index.php?title=LXF111:CMake&amp;action=history</link>
		<description>История изменений этой страницы в вики</description>
		<language>ru</language>
		<generator>MediaWiki 1.11.1</generator>
		<lastBuildDate>Wed, 13 May 2026 23:43:01 GMT</lastBuildDate>
		<item>
			<title>Crazy Rebel: викификация, оформление, иллюстрация</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF111:CMake&amp;diff=8796&amp;oldid=prev</link>
			<description>&lt;p&gt;викификация, оформление, иллюстрация&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая статья&lt;/b&gt;&lt;/p&gt;&lt;div&gt;: '''''CMake''''' Кроссплатформенная система сборки для ваших приложений [[Категория:Учебники]]&lt;br /&gt;
&lt;br /&gt;
==Раздвигая горизонты==&lt;br /&gt;
&lt;br /&gt;
{{Цикл/CMake}}&lt;br /&gt;
&lt;br /&gt;
: '''ЧАСТЬ 3''' ''CMake'' – не только мощный, но и расширяемый инструмент для сборки ваших приложений. '''Андрей Боровский''' покажет, как добавить ему функциональности.&lt;br /&gt;
&lt;br /&gt;
Сегодня мы завершим знакомство с ''CMake'' обзором тех возможностей пакета, которым не нашлось места на предыдущих уроках. Из этой статьи вы узнаете, как писать собственные сценарии расширения ''CMake'', научитесь устанавливать ПО &lt;br /&gt;
и создавать дистрибутивы (нет, не Linux, но тоже полезные).&lt;br /&gt;
&lt;br /&gt;
===Нестандартные связи===&lt;br /&gt;
&lt;br /&gt;
Давайте условимся понимать под стандартными библиотеками те,&lt;br /&gt;
для которых уже имеются готовые модули (сценарии) расширения&lt;br /&gt;
''CMake''. Если вы пишете новую библиотеку, вполне логично создать&lt;br /&gt;
для нее и модуль расширения. Этим мы займемся позже, а сейчас&lt;br /&gt;
рассмотрим действия, необходимые для подключения библиотеки&lt;br /&gt;
к проекту. Прежде всего, нам потребуется нестандартная (в указанном выше смысле) библиотека.&lt;br /&gt;
&lt;br /&gt;
Структурно проект библиотеки мало чем отличается от проекта программы. Фактически, вся разница сводится к однойединственной команде. На прилагаемом диске вы найдете проект библиотеки '''demolib''', которая экспортирует функцию '''testfunc()'''.&lt;br /&gt;
Последняя, в свою очередь, распечатывает на экране сообщение о&lt;br /&gt;
своем вызове (вряд ли в природе существует более простая библиотека). Исходный текст нас сейчас не интересует, так что перейдем&lt;br /&gt;
сразу к файлу '''CMakeLists.txt''':&lt;br /&gt;
&lt;br /&gt;
 cmake_minimum_required(VERSION 2.6)&lt;br /&gt;
 project(demolib C)&lt;br /&gt;
 add_library(demolib SHARED demolib.c demolib.h)&lt;br /&gt;
 if(${CMAKE_SYSTEM_NAME} STREQUAL Windows)&lt;br /&gt;
 set(LIB_INSTALL_PATH ${CMAKE_INSTALL_PREFIX}/lib/)&lt;br /&gt;
 elseif(${CMAKE_SYSTEM_NAME} STREQUAL Linux)&lt;br /&gt;
 set(LIB_INSTALL_PATH /usr/lib/)&lt;br /&gt;
 endif()&lt;br /&gt;
 install(TARGETS demolib DESTINATION ${LIB_INSTALL_PATH})&lt;br /&gt;
 find_path(LIB_INCLUDE_PATH string.h)&lt;br /&gt;
 install(FILES demolib.h DESTINATION ${LIB_INCLUDE_PATH})&lt;br /&gt;
&lt;br /&gt;
Значительная часть команд в этом файле предназначена для&lt;br /&gt;
обеспечения кроссплатформенности. За обычным заголовком метапроекта ''CMake'' следует команда '''add_library()'''. Как нетрудно догадаться, она представляет собой аналог уже знакомой нам команды&lt;br /&gt;
'''add_executable()''', только в качестве цели сборки выступает не исполняемый файл программы, а библиотека. Первым аргументом команды '''add_library()''' должно быть ее имя (которое по совместительству&lt;br /&gt;
является именем соответствующей цели сборки). Имя указывается&lt;br /&gt;
в кроссплатформенном виде (без префикса '''lib''' и расширения '''so''').&lt;br /&gt;
Далее следует тип создаваемой библиотеки ('''SHARED''' – разделяемая,&lt;br /&gt;
'''STATIC''' – статическая, '''MODULE''' – динамически загружаемый разделяемый модуль ['''на большинстве систем эквивалентен SHARED, – прим. ред.''']). Затем, как и в команде '''add_executable()''', мы указываем&lt;br /&gt;
список файлов исходных текстов, необходимых для сборки цели.&lt;br /&gt;
&lt;br /&gt;
Конструкция '''if(${CMAKE_SYSTEM_NAME} STREQUAL XXX)''' позволяет определить, выполняется ли сценарий ''CMake'' на платформе&lt;br /&gt;
'''XXX''' или на какой-либо другой ([[LXF110:Cmake|LXF110]]). Допустимо использовать и&lt;br /&gt;
более краткую запись: '''if(WIN32), if(UNIX)'''. Переменная '''UNIX''' обозначает все Unix-системы, но поскольку Solaris – это все же не HP-UX и не AIX, я предпочитаю более конкретный вариант с проверкой&lt;br /&gt;
'''CMAKE_SYSTEM_NAME'''.&lt;br /&gt;
&lt;br /&gt;
В приведенном выше примере мета-проекта задействована&lt;br /&gt;
еще одна возможность ''CMake'', с которой мы ранее не встречались – установка собранной цели. ''CMake'' предоставляет несколько&lt;br /&gt;
команд, с помощью которых можно добавить в создаваемый проект&lt;br /&gt;
средства инсталляции ПО. Самой полезной из них является '''install()''',&lt;br /&gt;
принимающая три группы аргументов: спецификатор, определяющий, что именно мы устанавливаем, список имен объектов и целевую директорию. Команда '''install()''', вызванная со спецификатором&lt;br /&gt;
'''TARGETS''', устанавливает файлы, являющиеся целями (т.е. результатом сборки). В качестве аргументов ей передаются имя цели и&lt;br /&gt;
каталог, в который должны быть помещены файлы. Чтобы сгенерировать инструкции установки файла, не являющегося целью сборки&lt;br /&gt;
(например, '''demolib.h'''), используется команда '''install()''' со спецификатором '''FILES'''. Есть и другие опции: можно, например, указать, какую из конфигураций сборки ('''RELEASE, DEBUG''' и т.д.) следует использовать для инсталляции (если вы думаете, что никому не понадобится устанавливать '''DEBUG'''-проект, то ошибаетесь: многие библиотеки,&lt;br /&gt;
модули расширения, да и программы можно отлаживать только&lt;br /&gt;
после полной установки). В команде '''install()''' можно также указывать права доступа для устанавливаемого файла. Спецификатор&lt;br /&gt;
'''SCRIPTS''' команды '''install()''' позволяет выполнять сценарии ''CMake''&lt;br /&gt;
до и после установки. Это может оказаться полезным в тех случаях,&lt;br /&gt;
когда для корректной инсталляции необходимо не только скопировать файл, но и выполнить некоторые дополнительные действия –&lt;br /&gt;
запустить утилиты, настроить файлы конфигурации, добавить записи в реестр (ой, о чем это я?..).&lt;br /&gt;
&lt;br /&gt;
Корректная установка файлов возможна только при правильном&lt;br /&gt;
выборе целевых директорий. В Linux и других *nix проблем обычно&lt;br /&gt;
не возникает (таким образом, мы еще раз убеждаемся в технической рациональности идеи файловой системы с единым корнем).&lt;br /&gt;
На платформе Windows все гораздо сложнее. Мало того, что разные важные директории (точнее – каталоги) могут быть расположены на разных дисках; в Windows вообще не существует единых&lt;br /&gt;
правил относительно установки библиотек и разделяемых файлов.&lt;br /&gt;
Например, популярные динамические библиотеки копируются в&lt;br /&gt;
каталоги '''%WINDIR%/system/''', '''%WINDIR%/system32/''' и т.п., однако&lt;br /&gt;
это касается только '''DLL'''; '''lib'''-файлы, необходимые для компоновки программ с разделяемыми библиотеками, устанавливаются в&lt;br /&gt;
директории сред разработки. В то же время, команда '''install()''' по умолчанию копирует '''DLL'''- и '''LIB'''-файлы в один каталог.&lt;br /&gt;
&lt;br /&gt;
В нашем мета-проекте мы сохраняем полное имя директории&lt;br /&gt;
для установки библиотеки в переменной '''LIB_INSTALL_PATH'''. На&lt;br /&gt;
платформе Windows мы записываем сюда значение '''${CMAKE_INSTALL_PREFIX}/lib/''' (которое разрешается, например, в '''C:\Program Files\demolib\lib'''), а под Linux используем жестко заданное '''/usr/lib/'''.&lt;br /&gt;
Обратите внимание на важную особенность работы '''install()''': если&lt;br /&gt;
указанная в этой команде директория не существует, она будет создана. С одной стороны, это удобно, с другой – в случае опечатки в&lt;br /&gt;
системе могут появиться странные каталоги. В ходе моих экспериментов с Windows и Linux были случайно созданы директории '''C:\usr\local\lib''' и '''/usr/lib/;/'''.&lt;br /&gt;
&lt;br /&gt;
Для определения имени директории, в которую следует установить заголовочный файл, мы пользуемся довольно распространенным при работе в ''CMake'' методом интроспекции ([[LXF110:Cmake|LXF110]]): с помощью команды '''find_path()''' определяем каталог, в котором располагается какой-либо общераспространенный файл того же типа&lt;br /&gt;
(в нашем примере – '''string.h'''), и устанавливаем '''demiolib.h''' в него же. В&lt;br /&gt;
Linux искомой директорией почти непременно окажется '''/usr/include/'''&lt;br /&gt;
(можно было бы и не напрягаться), а вот при работе под Windows&lt;br /&gt;
все будет сложнее. Путь к директории заголовочных файлов зависит от того, какое средство разработки мы используем и где оно&lt;br /&gt;
установлено. Замечено, что под Windows данный метод интроспекции не всегда может корректно определить требуемый каталог с&lt;br /&gt;
первого раза – нужно выйти из программы ''CMake GUI'' и запустить ее&lt;br /&gt;
снова. Альтернативный вариант – указать расположение заголовочного файла вручную в окне ''CMake GUI'' (само наличие такой опции&lt;br /&gt;
является признанием того, что интроспекция под Windows работает хуже, чем хотелось бы).&lt;br /&gt;
&lt;br /&gt;
Как изменится сгенерированный проект от того, что в метапроект была добавлена команда '''install()'''? На каждой ОС это будет&lt;br /&gt;
выглядеть по-своему. Если целевой платформой является Linux, в&lt;br /&gt;
''make''-файл добавляется цель '''install''', так что установить нашу библиотеку можно командой&lt;br /&gt;
&lt;br /&gt;
 sudo make install&lt;br /&gt;
&lt;br /&gt;
При работе под Windows (среда ''Microsoft Visual C++'') в решение&lt;br /&gt;
(Solution) Visual Studio добавляется специальный проект '''INSTALL'''.&lt;br /&gt;
Выглядит это несколько неуклюже, но другого универсального способа установки проектов под Windows, по-видимому, пока что не&lt;br /&gt;
существует.&lt;br /&gt;
&lt;br /&gt;
===Создание модуля ''CMake''===&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Заголовок=Скорая помощь|Содержание=Если в метапроекте ''CMake'' вам нужно получить значение переменной окружения,&lt;br /&gt;
для которой не существует встроенного «двойника», можно воспользоваться конструкцией '''$ENV{ИМЯ_ПЕРЕМЕННОЙ}''', например:&lt;br /&gt;
&lt;br /&gt;
 $ENV{SHELL}&lt;br /&gt;
 $ENV{WINDIR}&lt;br /&gt;
&lt;br /&gt;
Синтаксис обращения к переменным окружения из ''CMake'' не зависит от платформы.|Ширина=200px}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если разделяемую библиотеку планируется использовать во многих&lt;br /&gt;
проектах, целесообразно написать для нее собственный модуль, в&lt;br /&gt;
котором будет выполняться поиск связанных с библиотекой файлов. Мы проделаем все это для библиотеки '''demolib''' (хотя, честно&lt;br /&gt;
говоря, ее широкое распространение не предвидится). О том, что&lt;br /&gt;
именно делают модули расширений ''CMake'', говорилось в [[LXF110:Cmake|LXF110]],&lt;br /&gt;
поэтому перейдем сразу к начинке (файл '''FindDemoLib.cmake'''):&lt;br /&gt;
&lt;br /&gt;
  include(FindPackageHandleStandardArgs)&lt;br /&gt;
  if(DEMOLIB_INCLUDE_DIR AND DEMOLIB_LIBRARIES)&lt;br /&gt;
  set(DemoLib_FIND_QUIETLY TRUE)&lt;br /&gt;
  endif(DEMOLIB_INCLUDE_DIR AND DEMOLIB_LIBRARIES)&lt;br /&gt;
  find_path(DEMOLIB_INCLUDE_HINT string.h)&lt;br /&gt;
  find_path(DEMOLIB_INCLUDE_DIR demolib.h HINTS ${DEMOLIB_INCLUDE_HINT})&lt;br /&gt;
  find_library(DEMOLIB_LIBRARIES demolib HINTS $ENV{PROGRAMFILES}/demolib/lib/ /usr/lib)&lt;br /&gt;
  find_package_handle_standard_args(DemoLib DEFAULT_MSG DEMOLIB_LIBRARIES DEMOLIB_INCLUDE_DIR)&lt;br /&gt;
  mark_as_advanced(DEMOLIB_LIBRARIES)&lt;br /&gt;
&lt;br /&gt;
Минимум, что должен делать модуль загрузки разделяемой библиотеки '''XXX''' – это записывать в переменные '''XXX_INCLUDE_DIR'''&lt;br /&gt;
и '''XXX_LIBRARIES''' пути к заголовочным файлам и самой библиотеке, соответственно. Кроме того, должны быть инициализированы&lt;br /&gt;
служебные переменные, например, '''XXX_FOUND'''. Вдобавок модуль&lt;br /&gt;
может предоставлять специальные команды, дополнительные пере-&lt;br /&gt;
менные и многое другое; но в нашем примере мы ограничимся&lt;br /&gt;
малым. Модуль '''FindDemoLib''' записывает путь к библиотеке '''demolib'''&lt;br /&gt;
в переменную '''DEMOLIB_LIBRARIES''', а путь к файлу '''demolib.h''' – в&lt;br /&gt;
переменную '''DEMOLIB_INCLUDE_DIR'''.&lt;br /&gt;
&lt;br /&gt;
В первой строчке '''FindDemoLib.cmake''' мы загружаем модуль&lt;br /&gt;
'''FindPackageHandleStandardArgs''', который содержит полезную вспомогательную команду. Далее мы проверяем, не установлены ли уже&lt;br /&gt;
значения переменных '''DEMOLIB_INCLUDE_DIR''' и '''DEMOLIB_LIBRARIES'''.&lt;br /&gt;
Если обе переменные инициализированы, значит, они уже присутствуют в кэше ([[LXF110:Cmake|LXF110]]). Если кэш обновлять не нужно, мы присваиваем значение '''TRUE''' переменной '''DemoLib_FIND_QUIETLY'''.&lt;br /&gt;
&lt;br /&gt;
Обратите внимание на префикс '''DemoLib''', который соответствует&lt;br /&gt;
основе имени файла модуля. В процессе обработки модуля система ''CMake'' проверяет значение этой и еще нескольких подобных&lt;br /&gt;
служебных переменных. Дальше мы выполняем ту самую интроспекцию, ради которой все и затевалось. В команде '''find_path()'''&lt;br /&gt;
используется новый элемент – спецификатор '''HINTS'''. Он позволяет&lt;br /&gt;
нам делать среде ''CMake'' «подсказки», упрощающие поиск файлов.&lt;br /&gt;
За спецификатором '''HINTS''' обычно следует список директорий, в&lt;br /&gt;
которых может находиться (а может и не находиться) искомый&lt;br /&gt;
файл. Если он не будет найден в «подсказанных» директориях,&lt;br /&gt;
система выполнит стандартный поиск. Спецификатор '''HINTS''' не&lt;br /&gt;
следует путать со спецификатором '''PATHS''', с помощью которого&lt;br /&gt;
мы можем жестко указать список директорий для поиска. Отметим,&lt;br /&gt;
что даже с подсказкой система не всегда может найти директорию&lt;br /&gt;
заголовочных файлов на платформе Windows. В этом случае придется вводить имя директории вручную в окне графической утилиты ''CMake''.&lt;br /&gt;
&lt;br /&gt;
Команда '''find_package_handle_standard_args()''', предоставляемая&lt;br /&gt;
загруженным модулем, выполняет рутинные действия по инициализации служебных переменных. Ее первый аргумент – основа имени модуля, которая используется, например, для генерации имен.&lt;br /&gt;
Второй аргумент определяет, что именно программа должна сказать&lt;br /&gt;
в том случае, если библиотека '''demolib''' не будет найдена. Вместо&lt;br /&gt;
значения '''DEFAULT_MSG''' можно указать свой собственный текст.&lt;br /&gt;
Далее следуют имена переменных, в которых содержаться путь к&lt;br /&gt;
библиотеке и заголовочным файлам соответственно.&lt;br /&gt;
&lt;br /&gt;
Завершающая команда '''mark_as_advanced()''' помечает переменные, переданные ей в качестве аргумента, как «продвинутые»&lt;br /&gt;
(advanced). Продвинутые переменные обычно не отображаются в окне графического инструмента ''CMake''.&lt;br /&gt;
&lt;br /&gt;
Файл '''FindDemoLib.cmake''' следует скопировать в директорию&lt;br /&gt;
'''Modules''' (здесь хранятся расширения ''CMake''). В результате в метапроекте для сборки '''libtest''' мы сможем обойтись без интроспекции:&lt;br /&gt;
&lt;br /&gt;
  cmake_minimum_required(VERSION 2.6)&lt;br /&gt;
  project(libtest)&lt;br /&gt;
  find_package(DemoLib REQUIRED)&lt;br /&gt;
  include_directories(${DEMOLIB_INCLUDE_DIR})&lt;br /&gt;
  add_executable(libtest libtest.c)&lt;br /&gt;
  target_link_libraries(libtest ${DEMOLIB_LIBRARIES})&lt;br /&gt;
&lt;br /&gt;
===Подготовка к распространению===&lt;br /&gt;
&lt;br /&gt;
Помимо пакета ''Cmake'', компания Kitware выпускает еще несколько полезных утилит, в том числе ''CPack'' – средство создания дистрибутивов. ''CPack'' входит в состав пакета ''Cmake'', и им можно управлять из сценариев ''CMake'', так что будет уместно рассмотреть его здесь. Чтобы задействовать ''CPack'' в сценарии ''CMake'', достаточно подгрузить модуль:&lt;br /&gt;
&lt;br /&gt;
  include(CPack)&lt;br /&gt;
&lt;br /&gt;
Если теперь мы запустим утилиту ''cmake,'' то в результирующем '''Make'''-файле появятся цели '''package''' и '''package_source'''. Первая предназначена для создания двоичного пакета, вторая – для дистрибутива исходных текстов. Если теперь мы наберем&lt;br /&gt;
&lt;br /&gt;
  sudo make package&lt;br /&gt;
&lt;br /&gt;
(эту команду необходимо выполнять от имени суперпользователя), то в результате получим файл сценария оболочки с расширением&lt;br /&gt;
'''.sh''', а также архивы '''.tar.gz''', '''tar.Z''' и '''tar.bz2'''. Имена файлов сконструированы из имени проекта, номера версии и названия платформы. Например, для проекта '''demolib''', на примере которого мы изучаем ''CPack'', все они будут называться '''demolib-0.1.1-Linux'''. Перечисленные файлы представляют собой двоичные пакеты в разных форматах (по умолчанию ''CPack'' создает сразу несколько пакетов). Файл с расширением '''.sh''' – это сценарий оболочки с встроенным архивом '''tar.gz'''. Если мы запустим его на выполнение, он задаст нам несколько вопросов по поводу согласия с лицензией и путей установки, после чего (если наши ответы его устроят) распакует содержимое встроенного архива в заданную директорию. Файлы с расширениями '''.tar.*''' в комментариях не нуждаются.&lt;br /&gt;
&lt;br /&gt;
Если изложенное выше навело вас на мысль, что создавать двоичные пакеты с помощью ''CPack'' очень просто, то вы почти правы. На практике, однако, можно столкнуться с некоторыми сложностями. Механизм генерации пакетов ''CMake-CPack'' использует инструкции, заданные нами для генерации цели '''install''' (установки проекта). Попросту говоря, для создания цели '''package''' умолчательное значение переменной '''CMAKE_INSTALL_PREFIX''' (напомню, что она содержит путь к корневой директории инсталляции) заменяется на путь к некому временному каталогу. Далее вызывается цель '''install''', в результате чего выполняется «холостая» установка проекта во временную директорию, содержимое которой упаковывается в архивы. Этот факт имеет несколько последствий. Во-первых, вы можете создать двоичный пакет только в том случае, если ваш метапроект содержит инструкции для генерации цели '''install'''. Во-вторых, поскольку процесс создания пакета использует подмену значения '''CMAKE_INSTALL_PREFIX''', генерация может пройти успешно лишь в том случае, когда команды '''install()''' ее используют. Если вы выполняете нестандартные действия с директориями, будьте готовы к неожиданным проблемам с генерацией пакетов. Чтобы ''CMake'' мог задействовать переменную '''CMAKE_INSTALL_PREFIX''', в команде '''install()''' следует указывать относительные, а не абсолютные пути (например, '''lib''', а не '''/usr/lib'''). Наконец, в-третьих, выполнение процесса установки в ходе генерации пакета может вызвать побочные эффекты в том случае, когда установка включает в себя какие-то действия помимо простого копирования файлов.&lt;br /&gt;
&lt;br /&gt;
Настройка ''CPack'' из мета-проектов ''CMake'' выполняется с помощью переменных, которые использует модуль ''CPack''. Перечислим&lt;br /&gt;
 наиболее интересные из них:&lt;br /&gt;
&lt;br /&gt;
* '''CPACK_BINARY_DEB, CPACK_BINARY_RPM, CPACK_BINARY_STGZ''' – указывают, нужно ли создавать пакет в формате Debian, RPM или .sh.&lt;br /&gt;
* '''CPACK_BINARY_TGZ, CPACK_BINARY_TZ, CPACK_BINARY_TBZ2''' – управляет созданием архивов '''tar.gz, tar.Z''' или '''tar.bz2'''. Последним четырем переменным по умолчанию присвоено значение '''ON''', первым двум – '''OFF'''.&lt;br /&gt;
* '''CPACK_INSTALL_PREFIX''' – переменная, в которой сохраняется полное имя корневой директории для установки проекта.&lt;br /&gt;
* '''CPACK_PACKAGE_DESCRIPTION_FILE''' – путь к файлу с развернутым описанием собираемого пакета.&lt;br /&gt;
* '''CPACK_PACKAGE_DESCRIPTION_SUMMARY''' – краткое описание собираемого пакета.&lt;br /&gt;
* '''CPACK_PACKAGE_FILE_NAME''' – основа имени файла пакета.&lt;br /&gt;
* '''CPACK_PACKAGE_INSTALL_DIRECTORY''' – директория, в которую по умолчанию извлекается содержимое пакета.&lt;br /&gt;
* '''CPACK_PACKAGE_VENDOR''' – имя сборщика пакета.&lt;br /&gt;
* '''CPACK_PACKAGE_VERSION_MAJOR, CPACK_PACKAGE_VERSION_MINOR, CPACK_PACKAGE_VERSION_RELEASE''' – эти переменные содержат три цифры номера версии распространяемого ПО – старшую, младшую и номер релиза соответственно (используется, в том числе, при конструировании имени файла пакета).&lt;br /&gt;
* '''CPACK_RESOURCE_FILE_LICENSE''' – путь к файлу с текстом лицензии.&lt;br /&gt;
* '''CPACK_RESOURCE_FILE_README''' – путь к файлу README.&lt;br /&gt;
* '''CPACK_SYSTEM_NAME''' – имя системы (используется, в том числе, при конструировании имени файла пакета).&lt;br /&gt;
&lt;br /&gt;
Если результатом сборки является скрипт или пакет RPM, информация из файлов лицензии, README и WELCOME становится его частью. Чтобы изменить настройки ''CPack'', заданные по умолчанию, нужно отредактировать значения соответствующих переменных перед вызовом '''include()'''. Например, если мы хотим создать пакет RPM и привести его имя к классическому виду, можно&lt;br /&gt;
написать:&lt;br /&gt;
&lt;br /&gt;
 set(CPACK_BINARY_RPM ON)&lt;br /&gt;
 set(CPACK_SYSTEM_NAME i686)&lt;br /&gt;
 include (CPack)&lt;br /&gt;
&lt;br /&gt;
С учетом всего вышеизложенного вариант сценарий сборки '''demolib'''&lt;br /&gt;
с дополнительной целью '''package''' выглядит так:&lt;br /&gt;
&lt;br /&gt;
 cmake_minimum_required(VERSION 2.6)&lt;br /&gt;
 project(demolib C)&lt;br /&gt;
 if(UNIX)&lt;br /&gt;
 set(CMAKE_INSTALL_PREFIX /usr)&lt;br /&gt;
 set(CPACK_BINARY_RPM ON)&lt;br /&gt;
 set(CPACK_SYSTEM_NAME i686)&lt;br /&gt;
 endif(UNIX)&lt;br /&gt;
 set(CPACK_PACKAGE_DESCRIPTION_SUMMARY &amp;quot;Demo Library Project&amp;quot;)&lt;br /&gt;
 set(CPACK_PACKAGE_VERSION 1.0.0)&lt;br /&gt;
 include(CPack)&lt;br /&gt;
 add_library(demolib SHARED demolib.c demolib.h)&lt;br /&gt;
 install(TARGETS demolib DESTINATION lib)&lt;br /&gt;
 install(FILES demolib.h DESTINATION include)&lt;br /&gt;
&lt;br /&gt;
На платформе Windows для создания двоичных пакетов можно использовать ''Nullsoft NSIS'' (что выходит за рамки этой статьи) и '''zip''' (что не очень удобно с точки зрения Windows-пользователя).&lt;br /&gt;
&lt;br /&gt;
Как уже говорилось, с помощью ''CPack'' можно создавать не только двоичные пакеты, содержащие собранное ПО, но и дистрибутивы&lt;br /&gt;
исходных текстов. По умолчанию, вызов&lt;br /&gt;
&lt;br /&gt;
 make package_source&lt;br /&gt;
&lt;br /&gt;
приводит к тому, что все содержимое корневой директории проекта&lt;br /&gt;
и всех ее поддиректорий (в том числе, с двоичными файлами) упаковывается в архив. Более того, поскольку сам файл пакета исходников&lt;br /&gt;
по умолчанию сохраняется в той же корневой директории, может возникнуть ситуация, при которой упаковщик будет пытаться заархивировать файл сам в себя. Управление настройкой генератора пакетов&lt;br /&gt;
исходных текстов также выполняется с помощью переменных, имена&lt;br /&gt;
которых начинаются с префикса '''CPACK_SOURCE_'''. Как и в случае с&lt;br /&gt;
''CMake'', вы можете узнать много полезного о переменных ''CPack'', ознакомившись с файлами '''CPackConfig.cmake''' и '''CPackSourceConfig.cmake'''.&lt;br /&gt;
Некоторые переменные из этих файлов попадают в кэш '''CMake''.&lt;br /&gt;
&lt;br /&gt;
Надеюсь, что после всего сказанного о ''CMake'' вы придете к тем&lt;br /&gt;
же выводам, к которым пришел и я – этот пакет не только является&lt;br /&gt;
средством кроссплатформенной сборки, но и упрощает жизнь программиста, работающего исключительно в Linux. '''LXF'''&lt;br /&gt;
&lt;br /&gt;
===Подключение библиотеки===&lt;br /&gt;
&lt;br /&gt;
Простой библиотеке – простая программа. На диске вы найдете приложение ''libtests'', которое вызывает функцию '''testfunc()''' из библиотеки '''demolib'''. Само подключение выполняется с помощью&lt;br /&gt;
уже знакомой нам команды '''target_link_libraries()'''. Ниже следует&lt;br /&gt;
файл '''CMakeLists.txt''' для сборки программы ''libtest''.&lt;br /&gt;
&lt;br /&gt;
  cmake_minimum_required(VERSION 2.6)&lt;br /&gt;
  project(libtest)&lt;br /&gt;
  find_path(DEMOLIB_INCLUDE_DIR demolib.h)&lt;br /&gt;
  include_directories(${DEMOLIB_INCLUDE_DIR})&lt;br /&gt;
  add_executable(libtest libtest.c)&lt;br /&gt;
  if(${CMAKE_SYSTEM_NAME} STREQUAL Windows)&lt;br /&gt;
  target_link_libraries(libtest $ENV{PROGRAMFILES}/demolib/lib/&lt;br /&gt;
 demolib.lib)&lt;br /&gt;
  elseif(${CMAKE_SYSTEM_NAME} STREQUAL Linux)&lt;br /&gt;
  target_link_libraries(libtest demolib)&lt;br /&gt;
  endif()&lt;/div&gt;</description>
			<pubDate>Fri, 02 Oct 2009 04:47:38 GMT</pubDate>			<dc:creator>Crazy Rebel</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF111:CMake</comments>		</item>
	</channel>
</rss>