<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.linuxformat.ru/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF110%3ACmake</id>
		<title>LXF110:Cmake - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF110%3ACmake"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF110:Cmake&amp;action=history"/>
		<updated>2026-05-13T08:46:44Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF110:Cmake&amp;diff=8802&amp;oldid=prev</id>
		<title>Yaleks в 10:24, 4 октября 2009</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF110:Cmake&amp;diff=8802&amp;oldid=prev"/>
				<updated>2009-10-04T10:24:54Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 10:24, 4 октября 2009&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Цикл/&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;Cmake&lt;/del&gt;}}&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Цикл/&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;CMake&lt;/ins&gt;}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;== Интроспекция и логика ==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;== Интроспекция и логика ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;: ''ЧАСТЬ 2 Основная задача инструментов типа CMake – обеспечить единый файл проекта для его сборки на любой системе. '''Андрей Боровский''' покажет, за счет чего это достигается.''&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;: ''ЧАСТЬ 2 Основная задача инструментов типа CMake – обеспечить единый файл проекта для его сборки на любой системе. '''Андрей Боровский''' покажет, за счет чего это достигается.''&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 10:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 10:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;предположительно, просил других людей собрать ему его программы. Сколько в этих обвинениях было правды, я не знаю. Между&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;предположительно, просил других людей собрать ему его программы. Сколько в этих обвинениях было правды, я не знаю. Между&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;прочим, сегодня Митник – респектабельный ИТ-специалист, основатель компании, занимающейся компьютерной безопасностью&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;прочим, сегодня Митник – респектабельный ИТ-специалист, основатель компании, занимающейся компьютерной безопасностью&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;(www.kevinmitnick.com). Как бы там ни было, я должен вас обрадовать. Чем бы вы ни занялись в будущем, никто не сможет обвинить&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;(&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;http://&lt;/ins&gt;www.kevinmitnick.com). Как бы там ни было, я должен вас обрадовать. Чем бы вы ни занялись в будущем, никто не сможет обвинить&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;вас в том, что вы не умеете собирать программы, если сегодня вы&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;вас в том, что вы не умеете собирать программы, если сегодня вы&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;освоите CMake.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;освоите CMake.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 109:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 109:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;=== Простые проверки ===&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;=== Простые проверки ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;{{Врезка&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;|Заголовок=Ловкость рук и никакого мошенничества&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;|Содержание=На первый взгляд может показаться, что способность CMake&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;определять не только местоположение файлов библиотек, но&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;и экспортируемые ими функции граничит с чистой магией.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;На самом деле пакет мета-сборки использует брутальный, но&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;эффективный прием – создает небольшую программу и выполняет ее тестовую компиляцию (и компоновку). Этим же способом&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;выясняются параметры заголовочных файлов, размеры базовых типов и многое другое. Тестовая компиляция существенно&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;замедляет работу CMake. Для ее ускорения CMake и создает&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;кэш CMakeCache.txt в ходе первой генерации файлов проекта.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;Последующие изменения в файле CMakeLists.txt, равно как и в&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;системе, не приводят к обновлению кэша, и в результате CMake&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;продолжает использовать старые значения переменных. Если&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;интроспекция работает не так, как вы ожидали, первое, что нужно&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;сделать – очистить кэш.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;|Ширина=250px}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Переменные, определенные в CMake и загружаемых расширениях, не всегда могут предоставить вам всю необходимую информацию о системе. В этой ситуации вы можете воспользоваться теми&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Переменные, определенные в CMake и загружаемых расширениях, не всегда могут предоставить вам всю необходимую информацию о системе. В этой ситуации вы можете воспользоваться теми&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;же инструментами интроспекции, которые применяет CMake для&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;же инструментами интроспекции, которые применяет CMake для&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 156:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 172:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;=== Генерация заголовочных файлов с помощью CMake ===&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;=== Генерация заголовочных файлов с помощью CMake ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;gallery perrow=1 align=right&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;Изображение:LXF110 94 1.png|Код этого сервера не является чем-то новым: все дело в умелой сборке.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;Изображение:LXF110 95 2.png|Мета-проект для этого клиента мы написали самостоятельно.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/gallery&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;CMake умеет генерировать заголовочные файлы, основываясь на&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;CMake умеет генерировать заголовочные файлы, основываясь на&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;шаблонах. Помимо обычных элементов, такой шаблон содержит&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;шаблонах. Помимо обычных элементов, такой шаблон содержит&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 261:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 281:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; cmake ./&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; cmake ./&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; make&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; make&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;{{Врезка|center|&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;|Заголовок=Ключи программы cmake&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;|Содержание=Приведем краткую справку по наиболее интересным ключам программы cmake:&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;* -D – позволяет записать в кэш CMake переменную и ее значение. Формат определения переменной соотвествует синтаксису кэш-файла: ИМЯ[:ТИП]=ЗНАЧЕНИЕ, например:&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt; cmake -D TESTVAR:BOOL=1 ./&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;В результате в файл CMakeCache.txt будет добавлена запись &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt; TESTVAR:BOOL=1&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;* -U – удаление из кэша переменных, имена которых соответствуют регулярному выражению, переданному в качестве аргумента команды.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;* -G – эта команда позволяет указать имя генератора файлов проекта (в том формате, в котором они возвращаются переменной CMAKE_GENERATOR). Список генераторов, доступных в текущей системе, можно узнать с помощью команды&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt; cmake --help&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;* -E – запускает CMake в командном режиме. Аргументом ключа должна быть команда, которую нужно выполнить. Для получения списка доступных команд введите:&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt; cmake -E help&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;* -i – выполняет CMake в режиме мастера.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;* --system-information – распечатывает информацию о CMake и проекте, если текущая директория содержит файл CMakeLists.txt.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;В качестве параметра команды может быть указан файл для сохра-&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;нения информации о системе.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;--help-command – выводит информацию о команде, имя которой передано ключу в качестве аргумента. В качестве второго параметра команды может быть указан файл для сохранения информации о системе (это верно и для прочих команд --help-*). Например:&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt; cmake --help-command project&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;* --help-command-list – распечатывает список команд, для которых можно получить справку.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;* --help-module – распечатывает справочные данные об указанном модуле.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;* --help-commands – распечатывает справку по всем командам cmake.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;* --help-property – делает то же, что и --help-command, но только для свойств.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;* --help-variable – делает то же, что и --help-command, но только для переменных.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;|Ширина=}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В результате в поддиректории bin появятся программы server и .&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В результате в поддиректории bin появятся программы server и .&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Понравилось? Тогда оставайтесь на связи: в следующий раз мы&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Понравилось? Тогда оставайтесь на связи: в следующий раз мы&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;рассмотрим более сложные аспекты использования CMake – установку приложений, комплексные проверки и написание собственных расширений.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;рассмотрим более сложные аспекты использования CMake – установку приложений, комплексные проверки и написание собственных расширений.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Yaleks</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF110:Cmake&amp;diff=8569&amp;oldid=prev</id>
		<title>Yaleks: Новая: {{Цикл/Cmake}} == Интроспекция и логика == : ''ЧАСТЬ 2 Основная задача инструментов типа CMake – обеспечить един...</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF110:Cmake&amp;diff=8569&amp;oldid=prev"/>
				<updated>2009-08-25T18:00:01Z</updated>
		
		<summary type="html">&lt;p&gt;Новая: {{Цикл/Cmake}} == Интроспекция и логика == : &amp;#039;&amp;#039;ЧАСТЬ 2 Основная задача инструментов типа CMake – обеспечить един...&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;
: ''ЧАСТЬ 2 Основная задача инструментов типа CMake – обеспечить единый файл проекта для его сборки на любой системе. '''Андрей Боровский''' покажет, за счет чего это достигается.''&lt;br /&gt;
&lt;br /&gt;
Вы помните, кто такой Кевин Митник? Когда-то призывы&lt;br /&gt;
досрочно освободить этого электронного взломщика из&lt;br /&gt;
тюрьмы украшали сетевые странички многих начинающих&lt;br /&gt;
хакеров. Противники Митника злорадно разъясняли, что «мастер&lt;br /&gt;
социальной инженерии» не так уж хорошо разбирается в программировании. Приводились даже распечатки с форумов, где Митник,&lt;br /&gt;
предположительно, просил других людей собрать ему его программы. Сколько в этих обвинениях было правды, я не знаю. Между&lt;br /&gt;
прочим, сегодня Митник – респектабельный ИТ-специалист, основатель компании, занимающейся компьютерной безопасностью&lt;br /&gt;
(www.kevinmitnick.com). Как бы там ни было, я должен вас обрадовать. Чем бы вы ни занялись в будущем, никто не сможет обвинить&lt;br /&gt;
вас в том, что вы не умеете собирать программы, если сегодня вы&lt;br /&gt;
освоите CMake.&lt;br /&gt;
&lt;br /&gt;
Того, что мы узнали о CMake в прошлый раз, достаточно для&lt;br /&gt;
написания простейших случаев, однако для сборки более сложных&lt;br /&gt;
проектов требуются более глубокие знания.&lt;br /&gt;
&lt;br /&gt;
=== Исследуем систему ===&lt;br /&gt;
В предыдущей статье говорилось, что одним из преимуществ CMake&lt;br /&gt;
является мощная система определения параметров платформы, для&lt;br /&gt;
которой выполняется сборка. Источником информации о платформе служат специальные переменные, значения которых устанавливаются средой CMake, и команды. Мы уже знаем, что в результате&lt;br /&gt;
загрузки расширения CMake нам становятся доступны специальные&lt;br /&gt;
переменные, позволяющие выяснить параметры подключаемых к&lt;br /&gt;
проекту библиотек и вспомогательных программ, используемых&lt;br /&gt;
для сборки. Рассмотрим переменные и команды, которые позволяют определить параметры системы, не зависящие от загруженных расширений. В архиве sysinfo.tar.gz на LXFDVD вы найдете&lt;br /&gt;
несколько необычный файл CMakeLists.txt. Он не связан со сборкой&lt;br /&gt;
какого-либо проекта, а просто демонстрирует возможности CMake&lt;br /&gt;
по определению параметров системы:&lt;br /&gt;
&amp;lt;pre&amp;gt;project(SystemInfo CXX)&lt;br /&gt;
message(STATUS &amp;quot;System: &amp;quot; ${CMAKE_SYSTEM_NAME} &amp;quot; &amp;quot; ${CMAKE_SYSTEM_VERSION})&lt;br /&gt;
message(STATUS &amp;quot;Processor: &amp;quot; ${CMAKE_HOST_SYSTEM_PROCESSOR})&lt;br /&gt;
if(${CMAKE_SYSTEM_NAME} STREQUAL Windows)&lt;br /&gt;
if(MSVC)&lt;br /&gt;
message(STATUS &amp;quot;Compiler: MSVC, version: &amp;quot; ${MSVC_VERSION})&lt;br /&gt;
endif(MSVC)&lt;br /&gt;
if(BORLAND)&lt;br /&gt;
message(STATUS &amp;quot;Compiler: BCC&amp;quot;)&lt;br /&gt;
endif(BORLAND)&lt;br /&gt;
else(${CMAKE_SYSTEM_NAME} STREQUAL Linux)&lt;br /&gt;
message(STATUS &amp;quot;Only GCC is supported on Linux&amp;quot;)&lt;br /&gt;
endif(${CMAKE_SYSTEM_NAME} STREQUAL Windows)&lt;br /&gt;
message(STATUS &amp;quot;CMake generates &amp;quot; ${CMAKE_GENERATOR})&amp;lt;/pre&amp;gt;&lt;br /&gt;
Назначение команды message() – выводить различные сообщения во время генерации файлов проекта утилитой CMake. Ее первым аргументом является тип сообщения. Допустимы три варианта: SEND_ERROR, FATAL_ERROR и STATUS. Первые два типа&lt;br /&gt;
предназначены для вывода сообщений об ошибках разной степени&lt;br /&gt;
тяжести. Если в процессе обработки файла CMakeLists.txt генерируется сообщение типа SEND_ERROR, обработка текущего файла&lt;br /&gt;
CMakeLists.txt завершается. Генерация сообщения с типом FATAL_ERROR приводит к завершению работы CMake в целом. Сообщения&lt;br /&gt;
типа STATUS не влияют на генерацию файлов проекта – они просто распечатывают данные. Мы используем команду message() для&lt;br /&gt;
отображения значений некоторых переменных CMake. Переменная&lt;br /&gt;
CMake_SYSTEM_NAME содержит короткое имя системы (например,&lt;br /&gt;
Linux или Windows). В переменной CMake_SYSTEM_VERSION содержится номер версии системы (для Linux это версия ядра).&lt;br /&gt;
&lt;br /&gt;
Команда if(), как вы, конечно, догадались, реализует условные&lt;br /&gt;
переходы в файле мета-проекта. Однако ее синтаксис, к сожалению, не столь очевиден. Аргументом команды является логическое&lt;br /&gt;
выражение, управляющее переходом к одному из последующих&lt;br /&gt;
блоков. Практически любое значение переменной или операции&lt;br /&gt;
может рассматриваться в языке CMake как логическое выражение.&lt;br /&gt;
Если переменной не присвоено значение, или присвоено одно из&lt;br /&gt;
значений N, NO, OFF, FALSE, NOTFOUND, &amp;lt;variable&amp;gt;-NOTFOUND, это&lt;br /&gt;
интерпретируется как «ложь» (False), в противном случае значение считается истинным (True). Логическое значение переменной&lt;br /&gt;
может быть инвертировано с помощью оператора NOT. Операторы&lt;br /&gt;
сравнения в языке CMake выглядят довольно необычно. Для сопоставления числовых значений используются операторы EQUAL&lt;br /&gt;
(равно), GREATER (больше), LESS (меньше). Для сравнения строковых значений используются, соответственно, операторы STREQUAL,&lt;br /&gt;
STRGREATER и STRLESS. Чтобы определить, присвоено ли переменной какое-либо значение в принципе, можно воспользоваться&lt;br /&gt;
оператором DEFNED:&lt;br /&gt;
 if(DEFINED variable)&lt;br /&gt;
Оператор MATCHES выполняет сравнение по регулярному&lt;br /&gt;
выражению.&lt;br /&gt;
&lt;br /&gt;
Помимо команды if() в нашем распоряжении есть команды else()&lt;br /&gt;
и elseif(), с помощью которых мы можем определять альтернативные ветви условных переходов. В качестве аргументов этих команд&lt;br /&gt;
также используются логические выражения. Аргументом команды elseif() должно быть альтернативное выражение, а аргументом&lt;br /&gt;
else() – то же выражение, что и для команды if(). Каждой команде&lt;br /&gt;
if() должна соответствовать команда endif(), аргумент которой должен совпадать с переданным if() и else() (этого требует документация по CMake). Необходимость указывать логические выражения в&lt;br /&gt;
качестве аргументов для команд else() и endif() наверняка покажется вам излишней, и вы будете правы. Аргументы этих команд указывают, скорее, для того, чтобы не запутаться в сложных конструкциях, содержащих вложенные условные переходы. Хотя в примерах&lt;br /&gt;
CMake команд else() и endif() всегда вызываются с аргументами,&lt;br /&gt;
практика показывает, что это не обязательно.&lt;br /&gt;
&lt;br /&gt;
Если «скормить» CMake написанный нами файл, то в Linux будет&lt;br /&gt;
распечатано следующее:&lt;br /&gt;
&amp;lt;pre&amp;gt;-- System: Linux 2.6.25.5-1.1-default&lt;br /&gt;
-- Processor: i686&lt;br /&gt;
-- Only GCC is supported on Linux&lt;br /&gt;
-- CMake generates Unix Makefiles&amp;lt;/pre&amp;gt;&lt;br /&gt;
На платформе Windows XP + Visual Studio 2005 информация&lt;br /&gt;
будет отличаться:&lt;br /&gt;
&amp;lt;pre&amp;gt;System: Windows 5.1&lt;br /&gt;
Processor: x86&lt;br /&gt;
Compiler: MSVC, version: 1400&lt;br /&gt;
CMake generates Visual Studio 8 2005&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Кэш CMake ===&lt;br /&gt;
Значения некоторых переменных CMake, описывающих настройку&lt;br /&gt;
инструментов сборки и компоновки, сохраняются в файле кэша. Он&lt;br /&gt;
создается для каждого мета-проекта и имеет имя CMakeCache.txt. С&lt;br /&gt;
помощью CMakeCache.txt вы не только можете узнать, какие переменные CMake определяют параметры инструментов сборки, но и&lt;br /&gt;
отредактировать их значения прямо в этом файле (однако, поскольку файл CMakeCache.txt генерируется автоматически, постоянные&lt;br /&gt;
модификации значений переменных все же следует вносить в&lt;br /&gt;
файл CMakeLists.txt). Структура записей в файле CMakeCache.txt&lt;br /&gt;
очень проста [однако не является официально заявленной и может&lt;br /&gt;
меняться от версии к версии – будьте внимательны, – прим. ред.].&lt;br /&gt;
Каждая запись имеет вид&lt;br /&gt;
 ИМЯ[:ТИП]=ЗНАЧЕНИЕ&lt;br /&gt;
где ИМЯ – имя переменной, ТИП – необязательный элемент, указывающий ее тип. Переменные, определенные в основном модуле&lt;br /&gt;
CMake и загружаемых расширениях, снабжены поясняющими комментариями. Изучение переменных, внесенных в кэш CMake, позволит вам лучше понять работу системы; кроме того, редактирование&lt;br /&gt;
содержимого кэша может пригодиться при правке самого файла&lt;br /&gt;
проекта CMake.txt (подробнее об этом сказано во врезке).&lt;br /&gt;
&lt;br /&gt;
=== Простые проверки ===&lt;br /&gt;
Переменные, определенные в CMake и загружаемых расширениях, не всегда могут предоставить вам всю необходимую информацию о системе. В этой ситуации вы можете воспользоваться теми&lt;br /&gt;
же инструментами интроспекции, которые применяет CMake для&lt;br /&gt;
присвоения значений стандартным переменным. Дополнительные&lt;br /&gt;
модули CMake предоставляют нам несколько команд, позволяющих&lt;br /&gt;
выяснить, «что где лежит». Модуль CheckIncludeFile экспортирует&lt;br /&gt;
команду check_include_file(), проверяющую, доступен ли системе&lt;br /&gt;
сборки тот или иной заголовочный файл. Вот как, например, можно&lt;br /&gt;
узнать, установлен ли файл GL/glx.h:&lt;br /&gt;
 include(CheckIncludeFile)&lt;br /&gt;
 check_include_file(&amp;quot;GL/glx.h&amp;quot; HAVE_GLX_H)&lt;br /&gt;
Команда include() позволяет включить в наш мета-проект файл&lt;br /&gt;
расширения, заданный именем (ее можно рассматривать как более&lt;br /&gt;
общий аналог команды find_package()). После этого нам становятся&lt;br /&gt;
доступны переменные и команды, определенные в файле расширения. Первым аргументом команды check_include_file() должно быть&lt;br /&gt;
имя заголовочного файла, вторым – имя переменной, в которой&lt;br /&gt;
будет сохранен результат. Если указанный заголовочный файл найден, переменной присваивается значение 1, если не найден – 0. Если&lt;br /&gt;
команда не изменила значение переменной, например, оставила его&lt;br /&gt;
неопределенным, значит, выполнить поиск файла по каким-то причинам не удалось.&lt;br /&gt;
&lt;br /&gt;
У команды check_include_file() есть несколько родственников. Модуль CheckIncludeFiles экспортирует команду check_include_files(), умеющую проверять доступность одновременно нескольких&lt;br /&gt;
заголовочных файлов. Модуль CheckIncludeFilesCXX экспортирует&lt;br /&gt;
команду check_include_files_cxx(), которая проверяет доступность&lt;br /&gt;
заголовочных файлов программ на C++.&lt;br /&gt;
&lt;br /&gt;
Если вы добавили команду check_include_file() или ей подобную&lt;br /&gt;
в файл CMakeLists.txt, не забудьте очистить кэш (самый простой&lt;br /&gt;
способ сделать это – удалить файл CMakeCache.txt из директории&lt;br /&gt;
проекта).&lt;br /&gt;
&lt;br /&gt;
Модули расширения предоставляют еще несколько команд,&lt;br /&gt;
работающих аналогично check_include_files(). Команда check_symbol_exists() из модуля CheckSymbolExists позволяет проверить,&lt;br /&gt;
содержат ли указанные команде заголовочные файлы заданный&lt;br /&gt;
символ. Команда check_library_exists() (модуль CheckLibraryExists)&lt;br /&gt;
уточняет наличие заданной библиотеки. С помощью команды&lt;br /&gt;
check_function_exists() (модуль CheckFunctionExists) можно выяснить, доступна ли проекту некоторая функция. Подробные описания&lt;br /&gt;
этих команд вы можете прочитать в файлах модулей расширения,&lt;br /&gt;
которые по умолчанию хранятся в директории /usr/share/CMake/Modules/ и имеют расширения .CMake. Обычно в начале каждого&lt;br /&gt;
модуля располагается комментарий, поясняющий, как работать с&lt;br /&gt;
объявленными в нем командами. Получить справку о функциях&lt;br /&gt;
модуля можно также с помощью специальной команды CMake (об&lt;br /&gt;
этом сказано ниже).&lt;br /&gt;
&lt;br /&gt;
Все это хорошо, скажете вы, но каким образом значения переменных CMake могут повлиять на генерацию файлов проекта? Во-первых,&lt;br /&gt;
условные переходы позволяют пустить ее различными путями в зависимости от заданных значений переменных. Кроме того, значения&lt;br /&gt;
переменных CMake можно переносить в заголовочные файлы.&lt;br /&gt;
&lt;br /&gt;
=== Генерация заголовочных файлов с помощью CMake ===&lt;br /&gt;
CMake умеет генерировать заголовочные файлы, основываясь на&lt;br /&gt;
шаблонах. Помимо обычных элементов, такой шаблон содержит&lt;br /&gt;
специальные ключевые символы, заменяемые в результирующем&lt;br /&gt;
заголовочном файле выражениями C/C++. Саму генерацию заголовочных файлов выполняет команда configure_file(). Впрочем, вместо долгих объяснений лучше один раз показать все это на практике.&lt;br /&gt;
Добавьте в файл CMakeLists.txt строчки:&lt;br /&gt;
 check_include_file_cxx(&amp;quot;GL/glx.h&amp;quot; HAVE_GLX_H)&lt;br /&gt;
 set (NUM_VAR 16)&lt;br /&gt;
 configure_file(config.h.in config.h)&lt;br /&gt;
Обратите внимание на аргументы configure_file(). config.h.in –&lt;br /&gt;
это шаблон, на основе которого CMake и генерирует файл config.h&lt;br /&gt;
(сам config.h.in останется неизменным). Вам следует создать файл&lt;br /&gt;
config.h.in, который должен быть расположен в той же директории,&lt;br /&gt;
что и проект CMake, и добавить в него строки&lt;br /&gt;
 #cmakedefine HAVE_GLX_H&lt;br /&gt;
 #define NUM_VAR ${NUM_VAR}&lt;br /&gt;
В этой же директории скомандуйте&lt;br /&gt;
 cmake ./&lt;br /&gt;
В результате в каталоге появится файл config.h следующего&lt;br /&gt;
содержания:&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;#define HAVE_GLX_H&lt;br /&gt;
#define NUM_VAR 16&amp;lt;/source&amp;gt;&lt;br /&gt;
Если переменной CMake HAVE_GLX_H присвоено значение, эквивалентное логическому True, строка шаблона&lt;br /&gt;
 #cmakedefine HAVE_GLX_H&lt;br /&gt;
заменяется в результирующем файле на&lt;br /&gt;
 #define HAVE_GLX_H&lt;br /&gt;
Если же переменной HAVE_GLX_H присвоено значение, эквивалентное логическому False, или переменная не инициализирована, указанная строка шаблона будет заменена в заголовочном файле на&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;/* #undef HAVE_GLX_H */&amp;lt;/source&amp;gt;&lt;br /&gt;
Если в шаблоне присутствуют ключевые слова вида ${VARIABLE}&lt;br /&gt;
или @VARIABLE@, то в результирующем заголовочном файле они&lt;br /&gt;
будут заменены значением переменной VARIABLE (подстановка&lt;br /&gt;
выполняется во всем файле, а не только в директивах #define).&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;
файл CMakeLists.txt, содержащий инструкции сборки целей данной&lt;br /&gt;
директории, а в корневом каталоге создать файл CMakeLists.txt,&lt;br /&gt;
управляющий всем проектом в целом.&lt;br /&gt;
&lt;br /&gt;
В качестве примера рассмотрим набор из двух программ,&lt;br /&gt;
демонстрирующих возможности межпроцессного взаимодействия&lt;br /&gt;
с помощью библиотеки wxWidgets. Исходные тексты этих программ&lt;br /&gt;
(клиента и сервера) расположены в директории /samples/ipc дистрибутива wxWidgets. Я изменил структуру примера, расположив&lt;br /&gt;
программу-клиент и программу-сервер в разных поддиректориях&lt;br /&gt;
ipc: server – для сервера и client – для клиента (мой вариант примера вы найдете на диске, в файле ipc.tar.gz). Файлы CMakeLists.txt,&lt;br /&gt;
предназначенные для управления сборкой каждой отдельной цели,&lt;br /&gt;
заметно отличаются от тех, с которыми мы работали ранее. Вот,&lt;br /&gt;
например, как выглядит текст файла CMakeLists.txt для цели client&lt;br /&gt;
(он, как и положено, находится в поддиректории client):&lt;br /&gt;
&amp;lt;pre&amp;gt;project(client)&lt;br /&gt;
cmake_minimum_required(VERSION 2.6)&lt;br /&gt;
set(client_SRCS client.cpp)&lt;br /&gt;
if(WIN32)&lt;br /&gt;
set(client_SRCS ${client_SRCS} client.rc)&lt;br /&gt;
endif(WIN32)&lt;br /&gt;
add_executable(client WIN32 ${client_SRCS})&lt;br /&gt;
target_link_libraries(client ${wxWidgets_LIBRARIES})&amp;lt;/pre&amp;gt;&lt;br /&gt;
Обратите внимание, что в файле сборки цели отсутствует команда&lt;br /&gt;
find_package() и другие команды, необходимые для настройки среды окружения проекта.&lt;br /&gt;
&lt;br /&gt;
Чтобы собирать все цели одной командой CMake, мы добавляем&lt;br /&gt;
в корневую директорию ipc еще один файл CMakeLists.txt:&lt;br /&gt;
&amp;lt;pre&amp;gt;project(ipc)&lt;br /&gt;
cmake_minimum_required(VERSION 2.6)&lt;br /&gt;
set(wxWidgets_USE_LIBS base; core; net)&lt;br /&gt;
find_package(wxWidgets REQUIRED)&lt;br /&gt;
include(${wxWidgets_USE_FILE})&lt;br /&gt;
include_directories(${CMAKE_CURRENT_SOURCE_DIR})&lt;br /&gt;
add_subdirectory(client bin)&lt;br /&gt;
add_subdirectory(server bin)&amp;lt;/pre&amp;gt;&lt;br /&gt;
Как видите, команды find_package() и include(), как и объявление переменной wxWidgets_USE_LIBS, теперь перенесены в&lt;br /&gt;
корневой файл мета-проекта. В список необходимых модулей&lt;br /&gt;
wxWidgets, хранящийся в переменной wxWidgets_USE_LIBS, мы&lt;br /&gt;
добавили модуль net, отвечающий за сетевые взаимодействия.&lt;br /&gt;
Команда add_subdirectory() добавляет к мета-проекту сборки новую&lt;br /&gt;
поддиректорию.&lt;br /&gt;
&lt;br /&gt;
За всеми этими манипуляциями стоит довольно простая идеология: в проекте, состоящем из нескольких директорий и, соответственно, нескольких файлов CMakeLists.txt, эти файлы образуют&lt;br /&gt;
иерархическую структуру, а команда add_subdirectory() просто добавляет в нее новые элементы. Важная особенность иерархии сценариев&lt;br /&gt;
CMakeLists.txt заключается в том, что операции, выполненные в файле более высокого уровня, имеют силу и для файлов более низких&lt;br /&gt;
уровней. Благодаря этому мы можем выделить в файлах, управляющих сборкой каждой цели, общие элементы и перенести их в корневой&lt;br /&gt;
скрипт. Этот принцип иерархической структуры файлов мета-проектов&lt;br /&gt;
уже использовался нами неявно при загрузке расширений CMake.&lt;br /&gt;
&lt;br /&gt;
Обратим еще раз внимание на команду add_subdirectory().&lt;br /&gt;
Первым аргументом команды должно быть имя поддиректории, в&lt;br /&gt;
которой содержится файл сборки цели. Во втором, необязательном,&lt;br /&gt;
параметре команды мы передаем имя директории, в которой должен быть сохранен результат сборки. Таким образом, мы можем&lt;br /&gt;
указать одну и ту же директорию для сохранения результатов сборки всех целей (в нашем примере это bin).&lt;br /&gt;
&lt;br /&gt;
В корневом файле CMakeLists.txt присутствует еще одна команда, с которой мы раньше не встречались – include_directories(). Она&lt;br /&gt;
добавляет в список директорий заголовочных файлов дополнительные каталоги, помимо тех, что генерируются в результате загрузки&lt;br /&gt;
расширений CMake. В нашем примере обе цели сборки используют&lt;br /&gt;
заголовочный файл ipcsetup.h, который хранится в корневой директории проекта. С помощью команды include_directories() мы добавляем ее в вышеупомянутый список. Аргументом include_directories()&lt;br /&gt;
должно быть имя добавляемой директории (полное или относительное). Мы могли бы использовать и ./, но это выглядит не очень&lt;br /&gt;
кросс-платформенно, поэтому мы задействуем переменную CMake_CURRENT_SOURCE_DIR, возвращающую имя директории исходных&lt;br /&gt;
текстов для того файла CMakeLists.txt, в котором мы к ней обращаемся. Для корневого сценария CMakeLists.txt это будет, естественно,&lt;br /&gt;
корневая директория. Теперь для сборки всего проекта необходимо&lt;br /&gt;
просто скомандовать в корневом каталоге:&lt;br /&gt;
 cmake ./&lt;br /&gt;
 make&lt;br /&gt;
В результате в поддиректории bin появятся программы server и .&lt;br /&gt;
Понравилось? Тогда оставайтесь на связи: в следующий раз мы&lt;br /&gt;
рассмотрим более сложные аспекты использования CMake – установку приложений, комплексные проверки и написание собственных расширений.&lt;/div&gt;</summary>
		<author><name>Yaleks</name></author>	</entry>

	</feed>