<html lang="en"> <head> <title>Compile-time vs Install-time - Stow</title> <meta http-equiv="Content-Type" content="text/html"> <meta name="description" content="Stow"> <meta name="generator" content="makeinfo 4.13"> <link title="Top" rel="start" href="index.html#Top"> <link rel="prev" href="Resource-Files.html#Resource-Files" title="Resource Files"> <link rel="next" href="Bootstrapping.html#Bootstrapping" title="Bootstrapping"> <link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage"> <!-- This manual describes GNU Stow version 2.2.2 (9 November 2015), a program for managing the installation of software packages. Software and documentation is copyrighted by the following: (C) 1993, 1994, 1995, 1996 Bob Glickstein <bobg+stow@zanshin.com> (C) 2000, 2001 Guillaume Morin <gmorin@gnu.org> (C) 2007 Kahlil (Kal) Hodgson <kahlil@internode.on.net> (C) 2011 Adam Spiers <stow@adamspiers.org> Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the section entitled ``GNU General Public License'' is included with the modified manual, and provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be stated in a translation approved by the Free Software Foundation. --> <meta http-equiv="Content-Style-Type" content="text/css"> <style type="text/css"><!-- pre.display { font-family:inherit } pre.format { font-family:inherit } pre.smalldisplay { font-family:inherit; font-size:smaller } pre.smallformat { font-family:inherit; font-size:smaller } pre.smallexample { font-size:smaller } pre.smalllisp { font-size:smaller } span.sc { font-variant:small-caps } span.roman { font-family:serif; font-weight:normal; } span.sansserif { font-family:sans-serif; font-weight:normal; } --></style> </head> <body> <div class="node"> <a name="Compile-time-vs-Install-time"></a> <a name="Compile_002dtime-vs-Install_002dtime"></a> <p> Next: <a rel="next" accesskey="n" href="Bootstrapping.html#Bootstrapping">Bootstrapping</a>, Previous: <a rel="previous" accesskey="p" href="Resource-Files.html#Resource-Files">Resource Files</a>, Up: <a rel="up" accesskey="u" href="index.html#Top">Top</a> <hr> </div> <h2 class="chapter">12 Compile-time vs Install-time</h2> <p>Software whose installation is managed with Stow needs to be installed in one place (the package directory, e.g. <samp><span class="file">/usr/local/stow/perl</span></samp>) but needs to appear to run in another place (the target tree, e.g., <samp><span class="file">/usr/local</span></samp>). Why is this important? What's wrong with Perl, for instance, looking for its files in <samp><span class="file">/usr/local/stow/perl</span></samp> instead of in <samp><span class="file">/usr/local</span></samp>? <p>The answer is that there may be another package, e.g., <samp><span class="file">/usr/local/stow/perl-extras</span></samp>, stowed under <samp><span class="file">/usr/local</span></samp>. If Perl is configured to find its files in <samp><span class="file">/usr/local/stow/perl</span></samp>, it will never find the extra files in the ‘<samp><span class="samp">perl-extras</span></samp>’ package, even though they're intended to be found by Perl. On the other hand, if Perl looks for its files in <samp><span class="file">/usr/local</span></samp>, then it will find the intermingled Perl and ‘<samp><span class="samp">perl-extras</span></samp>’ files. <p>This means that when you compile a package, you must tell it the location of the run-time, or target tree; but when you install it, you must place it in the stow tree. <h3 class="section">12.1 Advice on changing compilation and installation parameters</h3> <p>Some software packages allow you to specify, at compile-time, separate locations for installation and for run-time. Perl is one such package; see <a href="Perl-and-Perl-5-Modules.html#Perl-and-Perl-5-Modules">Perl and Perl 5 Modules</a>. Others allow you to compile the package, then give a different destination in the ‘<samp><span class="samp">make install</span></samp>’ step without causing the binaries or other files to get rebuilt. Most GNU software falls into this category; Emacs is a notable exception. See <a href="GNU-Emacs.html#GNU-Emacs">GNU Emacs</a>, and <a href="Other-FSF-Software.html#Other-FSF-Software">Other FSF Software</a>. <p>Still other software packages cannot abide the idea of separate installation and run-time locations at all. If you try to ‘<samp><span class="samp">make install prefix=/usr/local/stow/</span><var>foo</var></samp>’, then first the whole package will be recompiled to hardwire the <samp><span class="file">/usr/local/stow/</span><var>foo</var></samp> path. With these packages, it is best to compile normally, then run ‘<samp><span class="samp">make -n install</span></samp>’, which should report all the steps needed to install the just-built software. Place this output into a file, edit the commands in the file to remove recompilation steps and to reflect the Stow-based installation location, and execute the edited file as a shell script in place of ‘<samp><span class="samp">make install</span></samp>’. Be sure to execute the script using the same shell that ‘<samp><span class="samp">make install</span></samp>’ would have used. <p>(If you use GNU Make and a shell [such as GNU bash] that understands <samp><span class="command">pushd</span></samp> and <samp><span class="command">popd</span></samp>, you can do the following: <ol type=1 start=1> <li>Replace all lines matching ‘<samp><span class="samp">make[</span><var>n</var><span class="samp">]: Entering directory </span><var>dir</var></samp>’ with ‘<samp><span class="samp">pushd </span><var>dir</var></samp>’. <li>Replace all lines matching ‘<samp><span class="samp">make[</span><var>n</var><span class="samp">]: Leaving directory </span><var>dir</var></samp>’ with ‘<samp><span class="samp">popd</span></samp>’. <li>Delete all lines matching ‘<samp><span class="samp">make[</span><var>n</var><span class="samp">]: Nothing to be done for </span><var>rule</var></samp>’. </ol> <p>Then find other lines in the output containing <samp><span class="command">cd</span></samp> or <samp><span class="command">make</span></samp> commands and rewrite or delete them. In particular, you should be able to delete sections of the script that resemble this: <pre class="example"> for i in <var>dir_1</var> <var>dir_2</var> <span class="roman">...</span>; do \ (cd $i; make <var>args</var> <span class="roman">...</span>) \ done </pre> <p class="noindent">Note, that's “should be able to,” not “can.” Be sure to modulate these guidelines with plenty of your own intelligence. <p>The details of stowing some specific packages are described in the following sections. <ul class="menu"> <li><a accesskey="1" href="GNU-Emacs.html#GNU-Emacs">GNU Emacs</a> <li><a accesskey="2" href="Other-FSF-Software.html#Other-FSF-Software">Other FSF Software</a> <li><a accesskey="3" href="Cygnus-Software.html#Cygnus-Software">Cygnus Software</a> <li><a accesskey="4" href="Perl-and-Perl-5-Modules.html#Perl-and-Perl-5-Modules">Perl and Perl 5 Modules</a> </ul> <!-- --> </body></html>