4
<meta http-equiv="content-type" content="text/html;charset=utf-8">
6
<link rel="stylesheet" href="http://sharpie.github.com/TeXworks/resources/docs.css">
10
<div id="background"></div>
13
<div id="fadeout"></div>
15
<a id="title" href="#top"><h1>CMake/packaging/mac/MacPackagingTasks.cmake.in</h1></a>
17
<div class="navigation about">
21
<div class="contents">
22
<p>This documentation was built using Ryan Tomayko's <strong>Rocco</strong> tool:</p>
23
<a href="http://rtomayko.github.com/rocco">rtomayko.github.com/rocco</a>
25
<p>Which is based on <strong>Docco</strong> by Jeremy Ashkenas:</p>
26
<a href="http://jashkenas.github.com/docco">jashkenas.github.com/docco</a>
28
<p>The code from this navigation bar was borrowed from the <strong>CoffeeScript</strong> project, also by Jeremy:</p>
29
<a href="http://jashkenas.github.com/coffee-script">jashkenas.github.com/coffee-script</a>
31
<p>The templates used to create this page may be found on GitHub:</p>
32
<a href="http://github.com/Sharpie/TeXworks/tree/master/CMake/docs">github.com/Sharpie/TeXworks</a>
37
<div class="navigation toc">
41
<div class="contents menu">
42
<a class="source" href="../CMakeLists.html">CMake/packaging/CMakeLists.txt</a>
43
<a class="source" href="MacPackagingTasks.cmake.html">CMake/packaging/mac/MacPackagingTasks.cmake.in</a>
44
<a class="source" href="../../../CMakeLists.html">CMakeLists.txt</a>
45
<a class="source" href="../../../plugins-src/TWLuaPlugin/CMakeLists.html">plugins-src/TWLuaPlugin/CMakeLists.txt</a>
46
<a class="source" href="../../../plugins-src/TWPythonPlugin/CMakeLists.html">plugins-src/TWPythonPlugin/CMakeLists.txt</a>
47
<a class="source" href="../../../src/CMakeLists.html">src/CMakeLists.txt</a>
50
<div id="error" style="display:none;"></div>
54
<span class="bookmark" id="top"></span>
56
<table cellspacing=0 cellpadding=0>
59
<th class=docs><h1>CMake/packaging/mac/MacPackagingTasks.cmake.in</h1></th>
67
<a class="pilcrow" href="#section-1">¶</a>
68
<span class="bookmark" id="section-1"></span>
70
<p>OS X packaging tasks</p>
73
<div class='highlight'><pre></pre></div>
79
<a class="pilcrow" href="#section-2">¶</a>
80
<span class="bookmark" id="section-2"></span>
82
<p>This file is processed by <code>CONFIGURE_FILE</code> in <code>../CMakeLists.txt</code> which inserts
83
values for <code>@VARIABLE@</code> declarations. This is done to import values for some
84
variables that would otherwise be undefined when CPack is running.</p>
87
<div class='highlight'><pre><span class="nb">SET</span><span class="p">(</span><span class="s">PROJECT_NAME</span> <span class="s">@PROJECT_NAME@</span><span class="p">)</span>
88
<span class="nb">SET</span><span class="p">(</span><span class="s">PROJECT_SOURCE_DIR</span> <span class="s">@PROJECT_SOURCE_DIR@</span><span class="p">)</span>
89
<span class="nb">SET</span><span class="p">(</span><span class="s">PROJECT_BINARY_DIR</span> <span class="s">@PROJECT_BINARY_DIR@</span><span class="p">)</span>
90
<span class="nb">SET</span><span class="p">(</span><span class="s">TeXworks_LIB_DIRS</span> <span class="s">@TeXworks_LIB_DIRS@</span><span class="p">)</span>
91
<span class="nb">SET</span><span class="p">(</span><span class="s">CMAKE_SHARED_LIBRARY_SUFFIX</span> <span class="s">@CMAKE_SHARED_LIBRARY_SUFFIX@</span><span class="p">)</span>
92
<span class="nb">SET</span><span class="p">(</span><span class="s">QT_PLUGINS</span> <span class="s">@QT_PLUGINS@</span><span class="p">)</span></pre></div>
98
<a class="pilcrow" href="#section-3">¶</a>
99
<span class="bookmark" id="section-3"></span>
101
<p>This <code>IF</code> statement ensures that the following commands are executed only when
102
CPack is running—-i.e. when a user executes <code>make package</code> but not <code>make install</code></p>
105
<div class='highlight'><pre><span class="nb">IF</span> <span class="p">(</span> <span class="o">${</span><span class="nv">CMAKE_INSTALL_PREFIX</span><span class="o">}</span> <span class="s">MATCHES</span> <span class="s">.*/_CPack_Packages/.*</span> <span class="p">)</span></pre></div>
110
<div class="pilwrap">
111
<a class="pilcrow" href="#section-Download_and_install_Poppler_data">¶</a>
112
<span class="bookmark" id="section-Download_and_install_Poppler_data"></span>
114
<h2>Download and install Poppler data</h2>
117
<div class='highlight'><pre> <span class="nb">IF</span> <span class="p">(</span> <span class="s">NOT</span> <span class="s">EXISTS</span> <span class="o">${</span><span class="nv">PROJECT_SOURCE_DIR</span><span class="o">}</span><span class="s">/poppler-data-0.4.4.tar.gz</span> <span class="p">)</span>
118
<span class="nb">MESSAGE</span><span class="p">(</span><span class="s">STATUS</span> <span class="s2">"Downloading Poppler data files"</span><span class="p">)</span>
119
<span class="nb">FILE</span><span class="p">(</span><span class="s">DOWNLOAD</span> <span class="s2">"http://poppler.freedesktop.org/poppler-data-0.4.4.tar.gz"</span>
120
<span class="o">${</span><span class="nv">PROJECT_SOURCE_DIR</span><span class="o">}</span><span class="s">/poppler-data-0.4.4.tar.gz</span>
121
<span class="s">EXPECTED_MD5</span> <span class="s">f3a1afa9218386b50ffd262c00b35b31</span>
122
<span class="s">SHOW_PROGRESS</span>
123
<span class="p">)</span>
124
<span class="nb">ENDIF</span> <span class="p">()</span>
126
<span class="nb">IF</span> <span class="p">(</span> <span class="s">NOT</span> <span class="s">EXISTS</span> <span class="o">${</span><span class="nv">PROJECT_SOURCE_DIR</span><span class="o">}</span><span class="s">/poppler-data-0.4.4</span> <span class="p">)</span>
127
<span class="nb">EXECUTE_PROCESS</span><span class="p">(</span><span class="s">COMMAND</span> <span class="s">tar</span> <span class="s">xzf</span> <span class="o">${</span><span class="nv">PROJECT_SOURCE_DIR</span><span class="o">}</span><span class="s">/poppler-data-0.4.4.tar.gz</span>
128
<span class="s">WORKING_DIRECTORY</span> <span class="o">${</span><span class="nv">PROJECT_SOURCE_DIR</span><span class="o">}</span>
129
<span class="p">)</span>
130
<span class="nb">ENDIF</span> <span class="p">()</span>
132
<span class="nb">FILE</span><span class="p">(</span><span class="s">INSTALL</span> <span class="o">${</span><span class="nv">PROJECT_SOURCE_DIR</span><span class="o">}</span><span class="s">/poppler-data-0.4.4/</span>
133
<span class="s">DESTINATION</span> <span class="o">${</span><span class="nv">CMAKE_INSTALL_PREFIX</span><span class="o">}</span><span class="s">/</span><span class="o">${</span><span class="nv">PROJECT_NAME</span><span class="o">}</span><span class="s">.app/Contents/poppler-data</span>
134
<span class="s">PATTERN</span> <span class="s">CMakeLists.txt</span> <span class="s">EXCLUDE</span>
135
<span class="s">PATTERN</span> <span class="s">Makefile</span> <span class="s">EXCLUDE</span>
136
<span class="p">)</span></pre></div>
141
<div class="pilwrap">
142
<a class="pilcrow" href="#section-Download_and_install_TeXworks_manual">¶</a>
143
<span class="bookmark" id="section-Download_and_install_TeXworks_manual"></span>
145
<h2>Download and install TeXworks manual</h2>
148
<div class='highlight'><pre> <span class="nb">IF</span> <span class="p">(</span> <span class="s">NOT</span> <span class="s">EXISTS</span> <span class="o">${</span><span class="nv">PROJECT_SOURCE_DIR</span><span class="o">}</span><span class="s">/TeXworks-manual-html-r814.zip</span> <span class="p">)</span>
149
<span class="nb">MESSAGE</span><span class="p">(</span><span class="s">STATUS</span> <span class="s2">"Downloading TeXworks HTML manual"</span><span class="p">)</span>
150
<span class="nb">FILE</span><span class="p">(</span><span class="s">DOWNLOAD</span> <span class="s2">"http://texworks.googlecode.com/files/TeXworks-manual-html-r814.zip"</span>
151
<span class="o">${</span><span class="nv">PROJECT_SOURCE_DIR</span><span class="o">}</span><span class="s">/TeXworks-manual-html-r814.zip</span>
152
<span class="s">EXPECTED_MD5</span> <span class="s">2894969a6ac4bba31953264e04553717</span>
153
<span class="s">SHOW_PROGRESS</span>
154
<span class="p">)</span>
155
<span class="nb">ENDIF</span> <span class="p">()</span>
157
<span class="nb">IF</span> <span class="p">(</span> <span class="s">NOT</span> <span class="s">EXISTS</span> <span class="o">${</span><span class="nv">PROJECT_SOURCE_DIR</span><span class="o">}</span><span class="s">/TeXworks-manual</span> <span class="p">)</span>
158
<span class="nb">EXECUTE_PROCESS</span><span class="p">(</span><span class="s">COMMAND</span> <span class="s">unzip</span> <span class="o">${</span><span class="nv">PROJECT_SOURCE_DIR</span><span class="o">}</span><span class="s">/TeXworks-manual-html-r814.zip</span>
159
<span class="s">WORKING_DIRECTORY</span> <span class="o">${</span><span class="nv">PROJECT_SOURCE_DIR</span><span class="o">}</span>
160
<span class="p">)</span>
161
<span class="nb">ENDIF</span> <span class="p">()</span>
163
<span class="nb">FILE</span><span class="p">(</span><span class="s">INSTALL</span> <span class="o">${</span><span class="nv">PROJECT_SOURCE_DIR</span><span class="o">}</span><span class="s">/TeXworks-manual</span>
164
<span class="s">DESTINATION</span> <span class="o">${</span><span class="nv">CMAKE_INSTALL_PREFIX</span><span class="o">}</span><span class="s">/</span><span class="o">${</span><span class="nv">PROJECT_NAME</span><span class="o">}</span><span class="s">.app/Contents/texworks-help/</span>
165
<span class="p">)</span></pre></div>
170
<div class="pilwrap">
171
<a class="pilcrow" href="#section-Copy_all_runtime_dependencies_and_rewrite_loader_paths">¶</a>
172
<span class="bookmark" id="section-Copy_all_runtime_dependencies_and_rewrite_loader_paths"></span>
174
<h2>Copy all runtime dependencies and rewrite loader paths</h2>
177
<div class='highlight'><pre></pre></div>
182
<div class="pilwrap">
183
<a class="pilcrow" href="#section-7">¶</a>
184
<span class="bookmark" id="section-7"></span>
186
<p>Bring in <code>DeployQt4</code> a CMake module taken from the Charm application:</p>
188
<p><a href="https://github.com/KDAB/Charm">https://github.com/KDAB/Charm</a></p>
190
<p>This module offers the <code>FIXUP_QT4_BUNDLE</code> function which wraps
191
<code>FIXUP_BUNDLE</code> from CMake’s <code>BundleUtilities</code> module and extends it with
192
additional Qt4-specific goodies—-such as installing Qt4 plugins.</p>
194
<p><code>FIXUP_BUNDLE</code> is a wonderful function that examines an executable, finds
195
all non-system libraries it depends on, copies them into the <code>.app</code> bundle
196
and then re-writes the necessary loader paths.</p>
199
<div class='highlight'><pre> <span class="nb">SET</span><span class="p">(</span><span class="s">CMAKE_MODULE_PATH</span> <span class="s">@CMAKE_MODULE_PATH@</span><span class="p">)</span>
200
<span class="nb">INCLUDE</span><span class="p">(</span><span class="s">DeployQt4</span><span class="p">)</span></pre></div>
205
<div class="pilwrap">
206
<a class="pilcrow" href="#section-8">¶</a>
207
<span class="bookmark" id="section-8"></span>
209
<p>Gather all TeXworks Plugin libraries.</p>
212
<div class='highlight'><pre> <span class="nb">FILE</span><span class="p">(</span><span class="s">GLOB</span> <span class="s">TeXworks_PLUGINS</span>
213
<span class="o">${</span><span class="nv">CMAKE_INSTALL_PREFIX</span><span class="o">}</span><span class="s">/</span><span class="o">${</span><span class="nv">PROJECT_NAME</span><span class="o">}</span><span class="s">.app/Contents/PlugIns/*</span><span class="o">${</span><span class="nv">CMAKE_SHARED_LIBRARY_SUFFIX</span><span class="o">}</span><span class="p">)</span></pre></div>
218
<div class="pilwrap">
219
<a class="pilcrow" href="#section-9">¶</a>
220
<span class="bookmark" id="section-9"></span>
222
<p>If <code>BU_CHMOD_BUNDLE_ITEMS</code> is not set, <code>install_name_tool</code> will fail to
223
re-write some loader paths due to insufficiant permissions.</p>
226
<div class='highlight'><pre> <span class="nb">SET</span><span class="p">(</span><span class="s">BU_CHMOD_BUNDLE_ITEMS</span> <span class="s">ON</span><span class="p">)</span>
228
<span class="err">FIXUP_QT4_BUNDLE(${CMAKE_INSTALL_PREFIX}/${PROJECT_NAME}.app</span> <span class="err">"${QT_PLUGINS}"</span> <span class="err">"${TeXworks_PLUGINS}"</span> <span class="err">"${TeXworks_LIB_DIRS}")</span></pre></div>
233
<div class="pilwrap">
234
<a class="pilcrow" href="#section-Remove_unecessary_architectures_from_universal_binaries">¶</a>
235
<span class="bookmark" id="section-Remove_unecessary_architectures_from_universal_binaries"></span>
237
<h2>Remove unecessary architectures from universal binaries</h2>
240
<div class='highlight'><pre></pre></div>
245
<div class="pilwrap">
246
<a class="pilcrow" href="#section-11">¶</a>
247
<span class="bookmark" id="section-11"></span>
249
<p>Some libraries copied from the OS X system, such as X11 libraries, may
250
contain up to 4 different architectures. Here we will iterate over these
251
libraries and use <code>lipo</code> to strip out un-needed architectures.</p>
254
<div class='highlight'><pre></pre></div>
259
<div class="pilwrap">
260
<a class="pilcrow" href="#section-12">¶</a>
261
<span class="bookmark" id="section-12"></span>
263
<p>Another useful function from <code>BundleUtilities</code>.</p>
266
<div class='highlight'><pre> <span class="nb">GET_BUNDLE_MAIN_EXECUTABLE</span><span class="p">(</span><span class="o">${</span><span class="nv">CMAKE_INSTALL_PREFIX</span><span class="o">}</span><span class="s">/</span><span class="o">${</span><span class="nv">PROJECT_NAME</span><span class="o">}</span><span class="s">.app</span> <span class="s">APP_MAIN</span><span class="p">)</span></pre></div>
271
<div class="pilwrap">
272
<a class="pilcrow" href="#section-13">¶</a>
273
<span class="bookmark" id="section-13"></span>
275
<p>We look at the TeXworks binary that was built rather than consulting the
276
value of the <code>CMAKE_OSX_ARCHITECTURES</code> because if the user did not set
277
<code>CMAKE_OSX_ARCHITECTURES</code>, then the variable will be an empty string and the
278
format of the resulting binary will depend on the versions of OS X and
282
<div class='highlight'><pre> <span class="nb">MESSAGE</span><span class="p">(</span><span class="s">STATUS</span> <span class="s2">"Reducing the size of bundled libraries."</span><span class="p">)</span>
283
<span class="nb">MESSAGE</span><span class="p">(</span><span class="s">STATUS</span> <span class="s2">"Scanning architectures of: ${APP_MAIN}"</span><span class="p">)</span>
284
<span class="nb">EXECUTE_PROCESS</span><span class="p">(</span></pre></div>
289
<div class="pilwrap">
290
<a class="pilcrow" href="#section-14">¶</a>
291
<span class="bookmark" id="section-14"></span>
293
<p><code>lipo -info</code> returns a list of the form:</p>
295
<pre><code><is universal binary?>: <program name>: <list of architectures>
298
<p>Piping this output to <code>cut -d : -f 3-</code> allows us to extract just the list
299
of architectures.</p>
302
<div class='highlight'><pre> <span class="s">COMMAND</span> <span class="s">lipo</span> <span class="s">-info</span> <span class="o">${</span><span class="nv">APP_MAIN</span><span class="o">}</span>
303
<span class="s">COMMAND</span> <span class="s">cut</span> <span class="s">-d</span> <span class="s">:</span> <span class="s">-f</span> <span class="s">3-</span>
304
<span class="s">OUTPUT_VARIABLE</span> <span class="s">APP_ARCHS</span>
305
<span class="p">)</span></pre></div>
310
<div class="pilwrap">
311
<a class="pilcrow" href="#section-15">¶</a>
312
<span class="bookmark" id="section-15"></span>
314
<p>Strip leading and trailing whitespace.</p>
317
<div class='highlight'><pre> <span class="nb">STRING</span><span class="p">(</span><span class="s">STRIP</span> <span class="o">${</span><span class="nv">APP_ARCHS</span><span class="o">}</span> <span class="s">APP_ARCHS</span><span class="p">)</span></pre></div>
322
<div class="pilwrap">
323
<a class="pilcrow" href="#section-16">¶</a>
324
<span class="bookmark" id="section-16"></span>
326
<p>Convert spaces to semicolons so CMake will interpret the string as a list.</p>
329
<div class='highlight'><pre> <span class="nb">STRING</span><span class="p">(</span><span class="s">REPLACE</span> <span class="s2">" "</span> <span class="s2">";"</span> <span class="s">APP_ARCHS</span> <span class="o">${</span><span class="nv">APP_ARCHS</span><span class="o">}</span><span class="p">)</span>
331
<span class="nb">MESSAGE</span><span class="p">(</span><span class="s">STATUS</span> <span class="s2">"Will reduce bundled libraries to: ${APP_ARCHS}"</span><span class="p">)</span>
333
<span class="nb">FOREACH</span><span class="p">(</span><span class="s">ARCH</span> <span class="s">IN</span> <span class="s">LISTS</span> <span class="s">APP_ARCHS</span><span class="p">)</span>
334
<span class="nb">SET</span><span class="p">(</span><span class="s">ARCHS_TO_EXTRACT</span> <span class="s2">"${ARCHS_TO_EXTRACT} -extract ${ARCH}"</span><span class="p">)</span>
335
<span class="nb">ENDFOREACH</span> <span class="p">()</span></pre></div>
340
<div class="pilwrap">
341
<a class="pilcrow" href="#section-17">¶</a>
342
<span class="bookmark" id="section-17"></span>
344
<p><strong>NOTE:</strong> This will not process any dylibs from Frameworks copied by
345
<code>FIXUP_BUNDLE</code>, hence it may not touch any of the Qt libraries. Something to
346
fix in the future.</p>
349
<div class='highlight'><pre> <span class="nb">FILE</span><span class="p">(</span><span class="s">GLOB</span> <span class="s">BUNDLED_DYLIBS</span>
350
<span class="o">${</span><span class="nv">CMAKE_INSTALL_PREFIX</span><span class="o">}</span><span class="s">/</span><span class="o">${</span><span class="nv">PROJECT_NAME</span><span class="o">}</span><span class="s">.app/Contents/MacOS/*</span><span class="o">${</span><span class="nv">CMAKE_SHARED_LIBRARY_SUFFIX</span><span class="o">}</span><span class="p">)</span>
352
<span class="nb">FOREACH</span><span class="p">(</span><span class="s">DYLIB</span> <span class="s">IN</span> <span class="s">LISTS</span> <span class="s">BUNDLED_DYLIBS</span><span class="p">)</span>
353
<span class="nb">MESSAGE</span><span class="p">(</span><span class="s">STATUS</span> <span class="s2">"Processing included library: ${DYLIB}"</span><span class="p">)</span></pre></div>
358
<div class="pilwrap">
359
<a class="pilcrow" href="#section-18">¶</a>
360
<span class="bookmark" id="section-18"></span>
362
<p><code>lipo</code> is very very anal about how arguments get passed to it. So we
363
execute through bash to side-step the issue.</p>
367
<div class='highlight'><pre> <span class="nb">EXECUTE_PROCESS</span><span class="p">(</span><span class="s">COMMAND</span> <span class="s">bash</span> <span class="s">-c</span> <span class="s2">"lipo ${ARCHS_TO_EXTRACT} ${DYLIB} -output ${DYLIB}"</span><span class="p">)</span>
368
<span class="nb">ENDFOREACH</span> <span class="p">()</span>
370
<span class="nb">MESSAGE</span><span class="p">(</span><span class="s">STATUS</span> <span class="s2">"Finished stripping architectures from bundled libraries."</span><span class="p">)</span>
372
<span class="nb">ENDIF</span> <span class="p">()</span></pre></div>
378
<!-- Navbar Scripting -->
379
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
380
<script type="text/javascript">
382
closeMenus = function() {
383
return $('.navigation.active').removeClass('active');
385
$('.navigation').click(function(e) {
386
if (e.target.tagName.toLowerCase() === 'a') {
389
if ($(e.target).closest('.repl_wrapper').length) {
392
if ($(this).hasClass('active')) {
396
$(this).addClass('active');