pan-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Pan-users] [OT] Compiling question for KHaley and Heinrich (and eve


From: Duncan
Subject: Re: [Pan-users] [OT] Compiling question for KHaley and Heinrich (and everybody)
Date: Sat, 2 Jul 2011 02:04:28 +0000 (UTC)
User-agent: Pan/0.135 (Tomorrow I'll Wake Up and Scald Myself with Tea; GIT 275cfc3 branch-testing)

walt posted on Fri, 01 Jul 2011 15:37:07 -0700 as excerpted:

> I just pulled from both git repositories and compiled as usual in each
> repository.  My build completed in KHaley's repo but stopped prematurely
> in Heinrich's repo.
> 
> Let me explain:
> 
> Maybe I'm a bit different from most (just ask my wife) but I *hate*
> compiling sources in the source directory itself, i.e. compiling
> "in-tree".
> 
> Instead, I always mkdir obj; cd obj; ../configure --prefix=$HOME so I
> install in my home directory and I don't leave compiler droppings on the
> clean white carpet ;)

> So, my question is how to make sure that a project will compile
> "out-of-tree" (in an obj or build directory)?

Since we're talking about git, here, there's actually (at least) two ways 
to handle this.

1) Make your remote repo clone "--bare" or "--mirror" (see the git-clone 
manpage for the difference, mirror's good if you don't intend to do any 
modifications of your own), that is, clone the administrative files only, 
without creating a working directory and doing a checkout.  That will 
save you the room taken by the working dir checkout when you're not using 
it (instead of putting the admin files in <dir>/.git, they go in <dir> 
itself, so there's no place to put the checkout, you just have all the 
information about the repo that's normally found in .git).  You can't /
get/ cleaner than not having a working directory at all! =:^)

To get a working dir, then, you use git clone again, but this time 
against the bare repo on the local machine, using the --local and
--shared options and without --bare.  This effectively creates your 
working dir, with the objects in its .git hard-linked (if possible, keep 
it on the same partition, as it would naturally be if you had used the 
non-bare clone it's replacing, and it should be possible) to the original 
bare clone, thus saving space (and making the clone faster since it's not 
copying all that data, only hardlinking it) over a regular clone.

You can then blow away the --shared working copy any time you want 
(creating a new one each time you build, for instance), without affecting 
the original bare/mirror clone.  Do note, however, the warnings under the 
--shared option -- if you delete branches, etc, in a --shared clone, it 
CAN affect the original clone (if the branch is in the original, if you 
just created it in the shared, it won't be), altho if your intent is 
simply to follow the upstream repo, not do development of your own, no 
big deal since the next pull will straighten things out again (and you'd 
be unlikely to be doing stuff like deleting branches found in the 
original clone in that case anyway, since that's the sort of actions devs 
would do, not users simply following the upstream repo).

A good read of the git-clone manpage, or git help clone (the result is 
the same), should clear up most questions about the git clone options and 
their effects, exact command syntax to use, etc.

(FWIW, while I'm gradually getting more comfortable with git, since I'm 
on Gentoo I was able to "cheat" on this, by looking at what the gentoo 
git-2.eclass ebuild helper library did.  It uses this approach to bare-
clone a repo into the package sources area, then shared-clone the bare-
clone into the temporary build area used to build packages.  The shared-
clone is thus single-use, then blown away along with the whole temporary 
package build when it's done.  As I have my temporary build area as a 
tmpfs mount, the whole shared clone and build is effectively done in 
memory, meaning it really *IS* as temporary as anything in memory is.  
But the package sources area bare-clone remains and is auto-pull-updated 
the next time the git-repo-sourced package is built.)

2) Using a normal non-bare clone, you can do a simple rm * (not .*, so it 
doesn't remove the .git subdir) and blow away the whole checkout, 
including all the "compiler droppings" (nice metaphor, BTW), then simply 
do a new checkout --force to build a new clean working tree.

Of course, those options are provided by git, over and above anything 
provided by the build system (like the Linux kernel's make clean and make 
mrproper, and the KBUILD_OUTPUT variable it honors -- I use the latter 
here to build in a subdir, while using .git/info/exclude to exclude that 
subdir in my local kernel git tree).

Assuming a traditional autotools based build, ./configure (or in your 
case ../configure) --help gives its options.  --srcdir=DIR looks 
interesting, here.  It also looks like copying/linking the configure into 
your working subdir might work, as it checks its parent dir 
automatically.  However, I've not actually tried either one with pan to 
see if it actually works.

You can also play various games with links.  If you create a dir and then 
either hard- or sym-link the sources tree into it (being sure to create 
actual subdirs and link only files, not dirs), again, you effectively 
create a working dir which you can blow away without blowing away the 
original sources dir and its contents, but where any "droppings" will 
remain in the working copy.  Obviously you'd create a script to do this 
for you, then simply run it when you want to build something, then blow 
away the resulting working dir, afterward.  I believe this actually used 
to be very common, when people built from tarballs much more frequently 
than they do in this age of binary packages, and SCMs that make checking 
out clean versions from their live trees a routine thing.  As such, 
there's probably pre-built scripts around for it, but I'm not sure what 
they'd be called or how one would go about finding them.  But building 
your own shouldn't be /too/ difficult, if you're at all handy with shell 
scripting.

-- 
Duncan - List replies preferred.   No HTML msgs.
"Every nonfree program has a lord, a master --
and if you use the program, he is your master."  Richard Stallman




reply via email to

[Prev in Thread] Current Thread [Next in Thread]