threads / patch / 9089

patchMakefile: create an install-symlinks target

Subject: [PATCH] Makefile: create an install-symlinks target

## tl;dr

8 messages between Jul 18, 2007 and Jul 18, 2007. Diffs are folded; open one to read it.

replies: 7people: 4as markdown or json

David Kastrup· Jul 18, 2007, 10:41 UTC · lore
Use this, for example, to do
rm -rf /opt/git
make prefix=/opt/git install
make symlinkprefix=/usr/local prefix=/opt/git install-symlinks
---
 Makefile |    9 ++++++++-
 1 files changed, 8 insertions(+), 1 deletions(-)
Show changes to Makefile +8 −1
diff --git a/Makefile b/Makefile
index 73b487f..df2fe8d 100644
--- a/Makefile
+++ b/Makefile
@@ -142,6 +142,7 @@ ALL_LDFLAGS = $(LDFLAGS)
 STRIP ?= strip
 
 prefix = $(HOME)
+symlinkprefix = /usr/local
 bindir = $(prefix)/bin
 gitexecdir = $(bindir)
 sharedir = $(prefix)/share
@@ -996,7 +997,13 @@ install-doc:
 quick-install-doc:
 	$(MAKE) -C Documentation quick-install
 
-
+# The somewhat strange looking lines start with an ignored $(MAKE) in
+# order to be executed also in make -n calls.
+install-symlinks:
+	@: $(MAKE) && cd '$(prefix_SQ)' && find . -mindepth 1 -type d ! \( -iname 'git*' -prune -exec echo rm -rf '$(symlinkprefix)/{}' \; \) -exec echo $(INSTALL) -m 755 -d '$(symlinkprefix)/{}' \;
+	@cd '$(prefix_SQ)' && find . -mindepth 1 -type d ! \( -iname 'git*' -prune -exec rm -rf '$(symlinkprefix)/{}' \; \) -exec $(INSTALL) -m 755 -d '$(symlinkprefix)/{}' \;
+	@: $(MAKE) && cd '$(prefix_SQ)' && find . -mindepth 1 \( -type d -iname 'git*' -prune -o ! -type d \) -exec echo ln -snf '$(prefix_SQ)/{}' '$(symlinkprefix)/{}' \;
+	@cd '$(prefix_SQ)' && find . -mindepth 1 \( -type d -iname 'git*' -prune -o ! -type d \) -exec ln -snf '$(prefix_SQ)/{}' '$(symlinkprefix)/{}' \;
 
 ### Maintainer's dist rules
 
-- 
1.5.3.rc2.41.gb47b1
David Kastrup· Jul 18, 2007, 12:41 UTC · re: David Kastrup · lore

Re: [PATCH] Makefile: create an install-symlinks target

David Kastrup <dak@gnu.org> writes:
Show 7 quoted lines
> Use this, for example, to do
> rm -rf /opt/git
> make prefix=/opt/git install
> make symlinkprefix=/usr/local prefix=/opt/git install-symlinks
> ---
>  Makefile |    9 ++++++++-
>  1 files changed, 8 insertions(+), 1 deletions(-)

Oh, by the way: I got _crazy_ when I first committed this, then found a mistake and corrected it, and then repeatedly did git add config/emacs/Makefile git-commit --amend

and got the
>  Makefile |    9 ++++++++-
>  1 files changed, 8 insertions(+), 1 deletions(-)

message again and again, while nothing at all changed. Of course, this was because I added the wrong Makefile.

I am not sure how git could be more helpful here. Just wanted to report it. Maybe it could have noticed that my "amendment" was empty? On the other hand, I might have wanted to amend the commit message. Sigh.

-- 
David Kastrup
Johannes Schindelin· Jul 18, 2007, 12:48 UTC · re: David Kastrup · lore

Re: [PATCH] Makefile: create an install-symlinks target

Hi,
On Wed, 18 Jul 2007, David Kastrup wrote:
> Use this, for example, to do
> rm -rf /opt/git
> make prefix=/opt/git install
> make symlinkprefix=/usr/local prefix=/opt/git install-symlinks
You mean
	This target allows you to have git installed in one location,
	and have symbolic links to all of the programs installed in 
	another	location.  For example, if git was installed to /opt/git
	with
		make prefix=/opt/git install
	you can install symbolic links in /usr/local/bin with
		make symlinkprefix=/usr/local prefix=/opt/git \
			install-symlinks

Hmm. Why not install it with a proper package manager in the correct place to begin with? Somehow I find so many symbolic links ugly.

Ciao, Dscho

Peter Baumann· Jul 18, 2007, 14:33 UTC · re: Johannes Schindelin · lore

Re: [PATCH] Makefile: create an install-symlinks target

On Wed, Jul 18, 2007 at 01:48:21PM +0100, Johannes Schindelin wrote:
Show 26 quoted lines
> Hi,
> 
> On Wed, 18 Jul 2007, David Kastrup wrote:
> 
> > Use this, for example, to do
> > rm -rf /opt/git
> > make prefix=/opt/git install
> > make symlinkprefix=/usr/local prefix=/opt/git install-symlinks
> 
> You mean
> 
> 	This target allows you to have git installed in one location,
> 	and have symbolic links to all of the programs installed in 
> 	another	location.  For example, if git was installed to /opt/git
> 	with
> 
> 		make prefix=/opt/git install
> 
> 	you can install symbolic links in /usr/local/bin with
> 
> 		make symlinkprefix=/usr/local prefix=/opt/git \
> 			install-symlinks
> 
> Hmm.  Why not install it with a proper package manager in the correct 
> place to begin with?  Somehow I find so many symbolic links ugly.
> 

Seeing this excellent explantion from Dscho, this sound exactly like a perfect use case for xstow [1].

It allows you to install your application into e.g. /usr/local/stow/git and by running 'xstow git' in /usr/local/stow it would create all the necessary links in /usr/local/{bin,share,doc} or any other place you want.

-Peter
[1]: http://xstow.sourceforge.net/
Alex Riesen· Jul 18, 2007, 13:08 UTC · re: David Kastrup · lore

Re: [PATCH] Makefile: create an install-symlinks target

On 7/18/07, David Kastrup <dak@gnu.org> wrote:
> +       @: $(MAKE) && cd '$(prefix_SQ)' && find . -mindepth 1 ...

Sometime about now you'll need to define $(FIND) or even $(GNUFIND) for find. There are proprietary systems where find is not available or does not do what you want it to. There is often a gfind installed somewhere on these systems.

David Kastrup· Jul 18, 2007, 14:06 UTC · re: Alex Riesen · lore

Re: [PATCH] Makefile: create an install-symlinks target

"Alex Riesen" <raa.lkml@gmail.com> writes:
Show 7 quoted lines
> On 7/18/07, David Kastrup <dak@gnu.org> wrote:
>> +       @: $(MAKE) && cd '$(prefix_SQ)' && find . -mindepth 1 ...
>
> Sometime about now you'll need to define $(FIND) or even $(GNUFIND)
> for find. There are proprietary systems where find is not available or
> does not do what you want it to. There is often a gfind installed somewhere
> on these systems.

I think that the install-symlinks target is rather more specialized than the tags and TAGS targets, yet those use just "find". I think I'll be able to throw out the -mindepth, however. It was necessary in a version that used find $(prefix), since /opt/git matched -type d -name git* but with find . this should not be relevant.

I'll amend that patch and prepare a separate one that uses $(FIND) everywhere.

-- 
David Kastrup
David Kastrup· Jul 18, 2007, 10:41 UTC · re: David Kastrup · lore

[PATCH 1/2] Makefile: create an install-symlinks target

This target allows you to have git installed in one location, and have symbolic links to all of the programs installed in another location. For example, if git was installed to /opt/git with

	make prefix=/opt/git install
you can install symbolic links in /usr/local/bin with
	make symlinkprefix=/usr/local prefix=/opt/git \
		install-symlinks
This makes it reasonably easy to remove such a package, by doing
	rm -rf /opt/git
and then removing stale links with
	find /usr/local -xtype l -print0|xargs -0 rm
(be sure to first see whether you indeed get only stale links listed).

This works by copying the directory hierarchy of $prefix to $symlinkprefix (not copying or descending to any directories of the name git* matched case-insensitively), then linking all the rest.

Signed-off-by: David Kastrup <dak@gnu.org>
---
 Makefile |    9 ++++++++-
 1 files changed, 8 insertions(+), 1 deletions(-)
Show changes to Makefile +8 −1
diff --git a/Makefile b/Makefile
index 73b487f..7e53378 100644
--- a/Makefile
+++ b/Makefile
@@ -142,6 +142,7 @@ ALL_LDFLAGS = $(LDFLAGS)
 STRIP ?= strip
 
 prefix = $(HOME)
+symlinkprefix = /usr/local
 bindir = $(prefix)/bin
 gitexecdir = $(bindir)
 sharedir = $(prefix)/share
@@ -996,7 +997,13 @@ install-doc:
 quick-install-doc:
 	$(MAKE) -C Documentation quick-install
 
-
+# The somewhat strange looking lines start with an ignored $(MAKE) in
+# order to be executed also in make -n calls.
+install-symlinks:
+	@: $(MAKE) && cd '$(prefix_SQ)' && find . -type d ! \( -iname 'git*' -prune \) -exec echo $(INSTALL) -m 755 -d '$(symlinkprefix)/{}' \;
+	@cd '$(prefix_SQ)' && find . -type d ! \( -iname 'git*' -prune \) -exec $(INSTALL) -m 755 -d '$(symlinkprefix)/{}' \;
+	@: $(MAKE) && cd '$(prefix_SQ)' && find . \( -type d -iname 'git*' -prune -o ! -type d \) -exec echo $(RM) -r '$(symlinkprefix)/{}' \; -exec echo ln -s '$(prefix_SQ)/{}' '$(symlinkprefix)/{}' \;
+	@cd '$(prefix_SQ)' && find . \( -type d -iname 'git*' -prune -o ! -type d \) -exec $(RM) -r '$(symlinkprefix)/{}' \; -exec ln -s '$(prefix_SQ)/{}' '$(symlinkprefix)/{}' \;
 
 ### Maintainer's dist rules
 
-- 
1.5.3.rc2.41.gb47b1
David Kastrup· Jul 18, 2007, 14:45 UTC · re: David Kastrup · lore

[PATCH 2/2] Makefile: use $(FIND) instead of find

Some people might prefer to be able to specify the find utility to use, in particular for the more complicated usage in the install-symlinks target.

Signed-off-by: David Kastrup <dak@gnu.org>
---
 Makefile |   13 +++++++------
 1 files changed, 7 insertions(+), 6 deletions(-)
Show changes to Makefile +7 −6
diff --git a/Makefile b/Makefile
index 7e53378..cf72327 100644
--- a/Makefile
+++ b/Makefile
@@ -178,6 +178,7 @@ AR = ar
 RM = rm -f
 TAR = tar
 INSTALL = install
+FIND = find
 RPMBUILD = rpmbuild
 TCL_PATH = tclsh
 TCLTK_PATH = wish
@@ -904,11 +905,11 @@ doc:
 
 TAGS:
 	$(RM) TAGS
-	find . -name '*.[hcS]' -print | xargs etags -a
+	$(FIND) . -name '*.[hcS]' -print | xargs etags -a
 
 tags:
 	$(RM) tags
-	find . -name '*.[hcS]' -print | xargs ctags -a
+	$(FIND) . -name '*.[hcS]' -print | xargs ctags -a
 
 ### Detect prefix changes
 TRACK_CFLAGS = $(subst ','\'',$(ALL_CFLAGS)):\
@@ -1000,10 +1001,10 @@ quick-install-doc:
 # The somewhat strange looking lines start with an ignored $(MAKE) in
 # order to be executed also in make -n calls.
 install-symlinks:
-	@: $(MAKE) && cd '$(prefix_SQ)' && find . -type d ! \( -iname 'git*' -prune \) -exec echo $(INSTALL) -m 755 -d '$(symlinkprefix)/{}' \;
-	@cd '$(prefix_SQ)' && find . -type d ! \( -iname 'git*' -prune \) -exec $(INSTALL) -m 755 -d '$(symlinkprefix)/{}' \;
-	@: $(MAKE) && cd '$(prefix_SQ)' && find . \( -type d -iname 'git*' -prune -o ! -type d \) -exec echo $(RM) -r '$(symlinkprefix)/{}' \; -exec echo ln -s '$(prefix_SQ)/{}' '$(symlinkprefix)/{}' \;
-	@cd '$(prefix_SQ)' && find . \( -type d -iname 'git*' -prune -o ! -type d \) -exec $(RM) -r '$(symlinkprefix)/{}' \; -exec ln -s '$(prefix_SQ)/{}' '$(symlinkprefix)/{}' \;
+	@: $(MAKE) && cd '$(prefix_SQ)' && $(FIND) . -type d ! \( -iname 'git*' -prune \) -exec echo $(INSTALL) -m 755 -d '$(symlinkprefix)/{}' \;
+	@cd '$(prefix_SQ)' && $(FIND) . -type d ! \( -iname 'git*' -prune \) -exec $(INSTALL) -m 755 -d '$(symlinkprefix)/{}' \;
+	@: $(MAKE) && cd '$(prefix_SQ)' && $(FIND) . \( -type d -iname 'git*' -prune -o ! -type d \) -exec echo $(RM) -r '$(symlinkprefix)/{}' \; -exec echo ln -s '$(prefix_SQ)/{}' '$(symlinkprefix)/{}' \;
+	@cd '$(prefix_SQ)' && $(FIND) . \( -type d -iname 'git*' -prune -o ! -type d \) -exec $(RM) -r '$(symlinkprefix)/{}' \; -exec ln -s '$(prefix_SQ)/{}' '$(symlinkprefix)/{}' \;
 
 ### Maintainer's dist rules
 
-- 
1.5.3.rc2.41.gb47b1

← back to recent threads