This is the mail archive of the
automake@gnu.org
mailing list for the automake project.
[patch] Changes to automake to properly update read-only source files
- To: "Automake mailing list (Adresse de messagerie)" <automake at gnu dot org>
- Subject: [patch] Changes to automake to properly update read-only source files
- From: Bernard Dautrevaux <Dautrevaux at microprocess dot com>
- Date: Tue, 12 Sep 2000 19:36:45 +0200
Hi there,
Installing automake in an environment where all my source files are
read-only, I get some small problems as automake expect in a lot of cases to
be able to overwrite some of the distributed files that I get read-only in
my environment (as they are in fact symbolic links to shared sources).
I thus had to change a few things in automake.
---------------------------------------------
in "automake.in:"
=================
The rule to generate aclocal.m4 must ensure that it can overwrite it, so I
rename the original aclocal.m4 as aclocal.m4.bak and re-create a writable
version of aclocal.m4 by using "cat" from the backup file.
When regenerating Makefile.in I use the same trick to ensure that
Makefile.in can be written, while creating a backup file.
in "remake.am":
===============
I again take care to be able to write configure before calling autoconf,
although I've also submitted a patch to remove configure just before
re-creating it :-)
in "sanity.m4":
===============
I just remove "conftestfile" before creating it.
in "texi-vers.am":
==================
I remove both the version file and the time stamp just before creating them.
in "subdir4.test":
==================
I removed "depcomp" before touching it; I'm not sure why this is done at all
as "defs" already copies $srcdir/depcomp in the test directory (and this
file is then read-only here). Perhaps one may just not touch the local
depcomp file? I had anyway to do something as otherwise the test failed and
prevent automatically installing on all my machines.
------------------------------------
in "header.m4":
===============
Just by security I removed the various stamp files before creating them, but
I do not put this in tha patch below for two reasons:
I'm not sure the stamp files are distributed; if they are'nt then removing
them should never be needed (only distributed files are usually found
read-only). (BTW there is also a java class.$dir.stamp file I consider in
automake.in; I don't remove it because I think it will not be distributed,
but I can't check as I do not yet have automake'd any java package).
After doing that I looked at the generated code (in config.status) and don't
understand at all what it does :-(, so I prefer not to change anything. My
main concern is that "$am_file" in the second argument to AC_OUTPUT_COMMANDS
seem to be expanded by configure, while the for loop is executed only by
config.status (and then am_file is only given a value in config.status, not
in configure)...
Any hint on this code would be welcome, even if it is just out of curiosity
:-)
------------------------------------
To solve the first points, I propose the following patch against
CVS-automake:
Changelog:
----------8<----------------------------------------------------------------
--
2000-09-12 Bernard Dautrevaux <dautrevaux@objectlive.com>
* automake.in: make a backup and a writable copy of aclocal.m4
before
calling aclocal; idem for Makefile.in before calling automake
* remake.am: make a backup and a writable copy of configure before
calling autoconf
* sanity.m4: remove conftestfile before creating it, in case it is
read-only
* texi-vers.am: remove both version.texi and the stamp file before
creating them
* subdir4.test: remove the "depcomp" copied by "defs" befroe
touching it, in
case it is read-only.
----------8<----------------------------------------------------------------
--
The patch:
----------8<----------------------------------------------------------------
--
*** old/automake.in 2000/09/11 11:26:14 1.1.1.3
--- new/automake.in 2000/09/11 17:41:52
***************
*** 3196,3205 ****
&pretty_print_rule ("\$(ACLOCAL_M4):", "\t\t", @ac_deps);
!
! $output_rules .= ("\t"
! . 'cd $(srcdir) && $(ACLOCAL)'
! . (&variable_defined ('ACLOCAL_AMFLAGS')
? ' $(ACLOCAL_AMFLAGS)' : '')
! . "\n");
}
}
--- 3196,3210 ----
&pretty_print_rule ("\$(ACLOCAL_M4):", "\t\t", @ac_deps);
!
! $output_rules .= ( "\tif test -r \$(ACLOCAL_M4); then \\\n"
! . "\t rm -f \$(ACLOCAL_M4).bak; \\\n"
! . "\t mv \$(ACLOCAL_M4) \$(ACLOCAL_M4).bak &&
\\\n"
! . "\t cat \$(ACLOCAL_M4).bak >
\$(ACLOCAL_M4); \\\n"
! . "\tfi\n"
! . "\tcd \$(srcdir) && \\\n"
! . "\t \$(ACLOCAL)"
! . (&variable_defined ('ACLOCAL_AMFLAGS')
? ' $(ACLOCAL_AMFLAGS)' : '')
! . "\n");
}
}
***************
*** 3275,3282 ****
. ' ' . join (' ', @include_stack)
. "\n"
! . "\tcd \$(top_srcdir) && \$(AUTOMAKE) "
. ($cygnus_mode ? '--cygnus' : ('--' .
$strictness_name))
! . ($cmdline_use_dependencies ? '' : ' --ignore-deps')
! . ' ' . $input . $colon_infile . "\n\n");
# This rule remakes the Makefile.
--- 3280,3295 ----
. ' ' . join (' ', @include_stack)
. "\n"
! . "\tcd \$(top_srcdir) \\\n"
! . "\t && ( \\\n"
! . "\t if test -r " . $input . $colon_infile .
".in; then \\\n"
! . "\t rm -f " . $input . $colon_infile .
".in.bak; \\\n"
! . "\t mv " . $input . $colon_infile . ".in "
. $input . $colon_infile . ".in.bak && \\\n"
! . "\t cat " . $input . $colon_infile .
".in.bak > " . $input . $colon_infile . ".in; \\\n"
! . "\t fi; \\\n"
! . "\t \$(AUTOMAKE) "
. ($cygnus_mode ? '--cygnus' : ('--' .
$strictness_name))
! . ($cmdline_use_dependencies ? '' : ' --include-deps')
! . " " . $input . $colon_infile . " \\\n"
! . "\t )\n\n" );
# This rule remakes the Makefile.
*** old/remake.am 1999/01/07 15:06:03 1.1.1.1
--- new/remake.am 2000/09/11 17:42:01
***************
*** 22,24 ****
## Explicitly look in srcdir for benefit of non-GNU makes.
$(srcdir)/configure: @MAINTAINER_MODE_TRUE@$(srcdir)/configure.in
$(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
! cd $(srcdir) && $(AUTOCONF)
--- 22,30 ----
## Explicitly look in srcdir for benefit of non-GNU makes.
$(srcdir)/configure: @MAINTAINER_MODE_TRUE@$(srcdir)/configure.in
$(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
! if test -r $(srcdir)/configure; then \
! rm -f $(srcdir)/configure.bak; \
! mv $(srcdir)/configure $(srcdir)/configure.bak && \
! cat $(srcdir)/configure.bak > $(srcdir)/configure; \
! fi
! cd $(srcdir) && \
! ($(AUTOCONF) || cat $(srcdir)/configure.bak >
$(srcdir)/configure)
*** old/m4/sanity.m4 2000/09/11 11:27:10 1.1.1.1
--- new/m4/sanity.m4 2000/09/11 17:41:56
***************
*** 7,10 ****
--- 7,11 ----
# Just in case
sleep 1
+ rm -f conftestfile
echo timestamp > conftestfile
# Do `set' in a subshell so we don't clobber the current shell's
*** old/texi-vers.am 2000/09/11 11:26:48 1.1.1.3
--- new/texi-vers.am 2000/09/11 17:42:02
***************
*** 33,39 ****
@cmp -s @VTI@.tmp $(srcdir)/@VTEXI@ \
|| (echo "Updating $(srcdir)/@VTEXI@"; \
cp @VTI@.tmp $(srcdir)/@VTEXI@)
-@rm -f @VTI@.tmp
! @cp $(srcdir)/@VTEXI@ $@
mostlyclean-@VTI@:
--- 33,40 ----
@cmp -s @VTI@.tmp $(srcdir)/@VTEXI@ \
|| (echo "Updating $(srcdir)/@VTEXI@"; \
+ rm -f $(srcdir)/@VTEXI@ && \
cp @VTI@.tmp $(srcdir)/@VTEXI@)
-@rm -f @VTI@.tmp
! @rm -f $@ && cp $(srcdir)/@VTEXI@ $@
mostlyclean-@VTI@:
*** old/tests/subdir4.test 2000/09/11 11:28:55 1.1
--- new/tests/subdir4.test 2000/09/12 08:35:33
***************
*** 31,34 ****
--- 31,35 ----
# would mistakenly give the following diagnostic:
# automake: configure.in: required file `lib/depcomp' not found
+ rm -f depcomp
: > depcomp
----------8<----------------------------------------------------------------
--
As usual all comments are welcome.
TIA
Bernard
PS: Does this kind of patches have to be sent on this list or is there an
automake-patches list that would be more appropriate? there isn't any
described on www.gnu.org, but as I do not find *any* -patches list there
that doesn't prove anything :-)
--------------------------------------------
Bernard Dautrevaux
Microprocess Ingenierie
97 bis, rue de Colombes
92400 COURBEVOIE
FRANCE
Tel: +33 (0) 1 47 68 80 80
Fax: +33 (0) 1 47 88 97 85
e-mail: dautrevaux@microprocess.com
b.dautrevaux@usa.net
--------------------------------------------