Tom Howard <tomhoward@users.sf.net>
AllPermissive
Copying and distribution of this file, with or
without modification, are permitted in any medium without royalty provided the copyright
notice and this notice are preserved. Users of this software should generally follow the
principles of the
MIT License includings its disclaimer.
Adds support cvs targets within your Makefile.
Branching and releasing relies on you using the following version
format:
MAJOR.MINOR.POINT
where MAJOR is the major version number, MINOR is the minor version
number and POINT is the point release number.
make update
performs a cvs update
make commitlog
Generates a ChangeLog template with the modifed, added
and removed files and opens it up for editing. This is
not normally used directly, but is instad called by
commit. It is usefull however if you want to document
the work you have done, but don't want to commit just
yet.
make commit
performs a cvs commit after first performing a cvs
update and generating a commit log.
make cvs-rm FILES="file1 file2 ..."
removes a file or files specified by the FILES
variable from the file system and from cvs. It will
interactively ask you to confirm the file removal,
unless the file does not exist on the file system.
make cvs-add FILES="file1 file2 ..."
adds a file or files specified by the FILES variable
to cvs.
make branch-major
creates a branch based on the major version number,
increments the major version number, sets the minor
and point versions to zero and checks out the branch
into a new directory.
make branch-minor
creates a branch based on the minor version number,
increments the minor version, sets the point version
to zero number and checks out the branch into a new
directory.
make release
performs a cvs update, followed by a distcheck, then
creates a release for the current version, increaments
the point release number and checks out the release
into a new direcory
make quick-release
same as release, but distcheck is not performed
AC_DEFUN([AX_CVS],
[
AC_REQUIRE([AX_SPLIT_VERSION])
AC_SUBST([ANON_CVSROOT], [$1])
AC_MSG_CHECKING([ANON_CVSROOT])
if test "x$ANON_CVSROOT" != "x"; then
AC_MSG_RESULT([$ANON_CVSROOT])
else
AC_MSG_RESULT([not found])
AC_MSG_ERROR([An anonymous CVSROOT must be specified to enable CVS support])
fi
AC_ARG_ENABLE(cvs-support,
AS_HELP_STRING(--enable-cvs-support[=ARG],
[enable cvs support. Used by the $PACKAGE developers.
ARG can be "yes" or "no". If the CVSROOT is found,
then the default is yes,
otherwise the default is no.]),
AX_USING_CVS=$enableval )
if test "x$AX_USING_CVS" != "xno"; then
AC_ARG_VAR(CVS, [cvs executable to use])
if test "x$CVS" = "x"; then
AC_CHECK_PROGS(CVS,[cvs])
fi
if test "x$CVS" = "x"; then
if test "x$AX_USING_CVS" = "x"; then
AX_USING_CVS=no
else
AC_MSG_ERROR([CVS support cannot be enabled: cvs executable not found])
fi
fi
fi
if test "x$AX_USING_CVS" != "xno"; then
AC_ARG_VAR(GAWK, [gawk executable to use])
if test "x$GAWK" = "x"; then
AC_CHECK_PROGS(GAWK,[gawk])
fi
if test "x$GAWK" = "x"; then
if test "x$AX_USING_CVS" = "x"; then
AX_USING_CVS=no
else
AC_MSG_ERROR([CVS support cannot be enabled: gawk could not be found])
fi
fi
fi
if test "x$AX_USING_CVS" != "xno"; then
AC_ARG_VAR(CVSEDITOR, [text editor to use for cvs])
if test "x$CVSEDITOR" = "x"; then
if test "x$EDITOR" = "x"; then
AC_CHECK_PROGS(CVSEDITOR,[vim vi emacs])
else
AC_CHECK_PROGS(CVSEDITOR,[$EDITOR vim vi emacs])
fi
fi
if test "x$CVSEDITOR" = "x"; then
if test "x$AX_USING_CVS" = "x"; then
AX_USING_CVS=no
else
AC_MSG_ERROR([CVS support cannot be enabled: CVSEDITOR not set and editor not found])
fi
fi
fi
if test "x$AX_USING_CVS" != "xno"; then
AC_ARG_VAR(CVSROOT, [the CVSROOT to use])
AC_MSG_CHECKING([CVSROOT])
if test -e "$srcdir/CVS/Root"; then
CVSROOT=`cat $srcdir/CVS/Root`;
AC_MSG_RESULT([$CVSROOT])
else
AC_MSG_RESULT([not found])
if test "x$AX_USING_CVS" = "x"; then
AX_USING_CVS=no
else
AC_MSG_ERROR([CVS support cannot be enabled: CVSROOT not found. Did you check out from CVS?])
fi
fi
fi
if test "x$AX_USING_CVS" != "xno"; then
AC_MSG_CHECKING([USERNAME])
if test "x$USERNAME" != "x"; then
AC_MSG_RESULT([$USERNAME])
else
AC_MSG_RESULT([not set])
if test "x$AX_USING_CVS" = "x"; then
AX_USING_CVS=no
else
AC_MSG_ERROR([CVS support cannot be enabled: USERNAME enviorment variable not set])
fi
fi
fi
if test "x$AX_USING_CVS" != "xno"; then
AC_MSG_CHECKING([USEREMAIL])
if test "x$USERNAME" != "x"; then
AC_MSG_RESULT([$USEREMAIL])
else
AC_MSG_RESULT([not set])
if test "x$AX_USING_CVS" = "x"; then
AX_USING_CVS=no
else
AC_MSG_ERROR([CVS support cannot be enabled: USEREMAIL enviorment variable not set])
fi
fi
fi
if test "x$AX_USING_CVS" != "xno"; then
AC_MSG_NOTICE([cvs support enabled])
m4_pattern_allow([AC_INIT])
AX_PRINT_TO_FILE([ax_cvs_rel.awk],[[
BEGIN {
if( change <= 0 )
exit -1;
}
/AC_INIT/ {
if( ${AX_DOLLAR}2 ~ /\\)${AX_DOLLAR}/ )
{
ver = substr( ${AX_DOLLAR}2, 0, length( ${AX_DOLLAR}2 ) - 1 );
tail=\")\";
}
else
ver = ${AX_DOLLAR}2;
if( ${AX_DOLLAR}2 ~ /${AX_BS}${AX_SRB}${AX_DOLLAR}/ )
{
ver = substr( ${AX_DOLLAR}2, 0, length( ${AX_DOLLAR}2 ) - 1 );
tail=\"${AX_SRB}\";
}
else
ver = ${AX_DOLLAR}2;
if( ${AX_DOLLAR}2 ~ /\\,${AX_DOLLAR}/ )
{
ver = substr( ${AX_DOLLAR}2, 0, length( ${AX_DOLLAR}2 ) - 1 );
tail=\",\";
}
else
ver = ${AX_DOLLAR}2;
n = split( ver, ver_array, \".\" );
while( change > n )
ver_array[ ++n ] = 0;
ver_array[ change ]++;
while( ++change <= n )
ver_array[ change ] = 0;
${AX_DOLLAR}2 = \"\";
for( i = 1; i < n; ++i )
${AX_DOLLAR}2 = ${AX_DOLLAR}2 ver_array[ i ] \".\";
${AX_DOLLAR}2 = ${AX_DOLLAR}2 ver_array[ n ];
if( tail )
${AX_DOLLAR}2 = ${AX_DOLLAR}2 tail;
}
{ print ${AX_DOLLAR}0; }
]])
AX_ADD_AM_MACRO([[
update:
@cd \"${AX_DOLLAR}(srcdir)\" && $CVS -z9 update
cvsalways:
${AX_DOLLAR}(top_builddir)/commitlog: cvsalways
@(CURR=\`pwd\`; cd \"${AX_DOLLAR}(top_srcdir)\"; $CVS -z9 diff -u --brief 2>&1 | \\
$GAWK \\
\'/^Index/ { print \"\\\\t* ./\" ${AX_DOLLAR}${AX_DOLLAR}2; } \\
/^cvs diff: .* was removed/ { print \"\\\\t* ./\" ${AX_DOLLAR}${AX_DOLLAR}3 \" (removed)\"; } \\
/^cvs diff: .* is a new entry/ { print \"\\\\t* ./\" ${AX_DOLLAR}${AX_DOLLAR}3 \" (added)\"; }\' \\
> \"${AX_DOLLAR}${AX_DOLLAR}CURR/commitlog.tmp\")
@if test -s commitlog.tmp; then \\
echo \"\" >> commitlog.tmp; \\
if test -f ${AX_DOLLAR}(top_builddir)/commitlog; then \\
cat ${AX_DOLLAR}(top_builddir)/commitlog >> commitlog.tmp; \\
fi; \\
echo \"/* -*-change-log-*- */\" > ${AX_DOLLAR}(top_builddir)/commitlog; \\
DATE=\`date +\"%%Y-%%m-%%d\"\`; \\
echo \"${AX_DOLLAR}${AX_DOLLAR}DATE ${USERNAME} <${USEREMAIL}>\" >> ${AX_DOLLAR}(top_builddir)/commitlog; \\
echo \"\" >> ${AX_DOLLAR}(top_builddir)/commitlog; \\
cat commitlog.tmp >> ${AX_DOLLAR}(top_builddir)/commitlog; \\
rm -f commitlog.tmp; \\
$CVSEDITOR ${AX_DOLLAR}(top_builddir)/commitlog; \\
$GAWK \'BEGIN { blank=0; } \\
/\\\\/\\\\* -\\\\*-change-log-\\\\*- \\\\*\\\\// { getline; } \\
/^[[:blank:]]*\$\$/ { if( !blank ) { blank = 1; print; } } \\
/[[:alnum:]]/ { print; blank = 0; } \\
END{ if( !blank ) print \"\"; }\' \\
${AX_DOLLAR}(top_builddir)/commitlog > commitlog.tmp; \\
mv commitlog.tmp ${AX_DOLLAR}(top_builddir)/commitlog; \\
else \\
echo \"no changes found\";\\
fi
commit: update ${AX_DOLLAR}(top_builddir)/commitlog
@if test -f ${AX_DOLLAR}(top_builddir)/commitlog; then \\
cat ${AX_DOLLAR}(top_builddir)/commitlog \"\$(top_srcdir)/ChangeLog\" > ChangeLog.tmp; \\
mv ChangeLog.tmp \"\$(top_srcdir)/ChangeLog\"; \\
CURR=\`(cd \"${AX_DOLLAR}(top_builddir)\"; pwd )\`; \\
(cd \"\$(top_srcdir)\"; $CVS -z9 commit -F \"${AX_DOLLAR}${AX_DOLLAR}CURR/commitlog\" ); \\
rm -f ${AX_DOLLAR}(top_builddir)/commitlog; \\
fi
cvs-rm:
@echo \"Removing files from CVS\"
@if test \"x\$(FILES)\" != \"x\"; then \\
NEWFILES=\"\"; \\
for FILE in \$(FILES); do \\
if test -e \"${AX_DOLLAR}${AX_DOLLAR}FILE\"; then \\
rm -i \"${AX_DOLLAR}${AX_DOLLAR}FILE\"; \\
fi; \\
if test ! -e \"${AX_DOLLAR}${AX_DOLLAR}FILE\"; then \\
if test \"\$(srcdir)\" != \".\"; then \\
FILE=\`echo \"${AX_DOLLAR}${AX_DOLLAR}FILE\" | $SED -e \'s|^\$(srcdir)|.|\'\`; \\
fi; \\
NEWFILES=\"${AX_DOLLAR}${AX_DOLLAR}NEWFILES ${AX_DOLLAR}${AX_DOLLAR}FILE\"; \\
fi; \\
done; \\
if test \"x${AX_DOLLAR}${AX_DOLLAR}NEWFILES\" != \"x\"; then \\
(cd \"\$(srddir)\"; $CVS remove ${AX_DOLLAR}${AX_DOLLAR}NEWFILES; ); \\
fi; \\
else \\
echo \"You must specify the file(s) you want to remove from cvs by using\"; \\
echo \"the FILES environment variable. For example:\"; \\
echo \" make cvs-rm FILES=\'foo bar\'\"; \\
echo \"\"; \\
exit 1; \\
fi
cvs-add:
@echo \"Adding files to CVS\"
@if test \"x${AX_DOLLAR}(FILES)\" != \"x\"; then \\
NEWFILES=\"\"; \\
for FILE in ${AX_DOLLAR}(FILES); do \\
if test -e \"${AX_DOLLAR}${AX_DOLLAR}FILE\"; then \\
if test \"${AX_DOLLAR}(srcdir)\" != \".\"; then \\
FILE=\`echo \"${AX_DOLLAR}${AX_DOLLAR}FILE\" | sed -e \'s|^${AX_DOLLAR}(srcdir)|.|\'\`; \\
fi; \\
fi; \\
NEWFILES=\"${AX_DOLLAR}${AX_DOLLAR}NEWFILES ${AX_DOLLAR}${AX_DOLLAR}FILE\"; \\
done; \\
if test \"x${AX_DOLLAR}${AX_DOLLAR}NEWFILES\" != \"x\"; then \\
cd \"${AX_DOLLAR}(srcdir)\"; $CVS add ${AX_DOLLAR}${AX_DOLLAR}NEWFILES; \\
fi; \\
else \\
echo \"You must specify the file(s) you want to add to cvs by using\"; \\
echo \"the FILES environment variable. For example:\"; \\
echo \" make cvs-add FILES=\'foo bar\'\"; \\
echo \"\"; \\
exit 1; \\
fi
branch-major:
@tag=\"$PACKAGE-${AX_MAJOR_VERSION}\"; \\
echo \"\"; \\
echo \"Creating major brach: ${AX_DOLLAR}${AX_DOLLAR}tag\"; \\
(cd \"${AX_DOLLAR}(top_srcdir)\"; $CVS tag -b \"${AX_DOLLAR}${AX_DOLLAR}tag\"; ); \\
$GAWK -f ax_cvs_rel.awk -v change=1 \"${AX_DOLLAR}(top_srcdir)/configure.ac\" > configure.tmp; \\
touch ${AX_DOLLAR}(top_builddir)/commitlog; \\
DATE=\`date +\"%%Y-%%m-%%d\"\`; \\
echo \"${AX_DOLLAR}${AX_DOLLAR}DATE $USERNAME <$USEREMAIL>\" > commitlog.tmp ; \\
echo \"\" >> commitlog.tmp; \\
echo \" * ./configure.ac\" >> commitlog.tmp; \\
echo \" Created major branch: ${AX_DOLLAR}${AX_DOLLAR}tag\" >> commitlog.tmp; \\
echo \" Use:\" >> commitlog.tmp; \\
echo \" \\\\\`cvs -d$ANON_CVSROOT login\\\\\`\" >> commitlog.tmp; \\
echo \" \\\\\`cvs -d$ANON_CVSROOT co -r ${AX_DOLLAR}${AX_DOLLAR}tag $PACKAGE\\\\\`\" >> commitlog.tmp; \\
echo \" to access the branch\" >> commitlog.tmp; \\
echo \"\" >> commitlog.tmp; \\
cat ${AX_DOLLAR}(top_builddir)/commitlog >> commitlog.tmp; \\
mv commitlog.tmp ${AX_DOLLAR}(top_builddir)/commitlog; \\
cat ${AX_DOLLAR}(top_builddir)/commitlog \"${AX_DOLLAR}(top_srcdir)/ChangeLog\" > ChangeLog.tmp; \\
mv ChangeLog.tmp \"${AX_DOLLAR}(top_srcdir)/ChangeLog\"; \\
mv configure.tmp \"${AX_DOLLAR}(top_srcdir)/configure.ac\"; \\
CURR=\`(cd \"${AX_DOLLAR}(top_builddir)\"; pwd )\`; \\
(cd \"${AX_DOLLAR}(top_srcdir)\"; $CVS -z9 commit -F \"${AX_DOLLAR}${AX_DOLLAR}CURR/commitlog\"; ); \\
rm -f ${AX_DOLLAR}(top_builddir)/commitlog; \\
$CVS -z9 -d${AX_DOLLAR}(CVSROOT) co -r ${AX_DOLLAR}${AX_DOLLAR}tag -d ${AX_DOLLAR}${AX_DOLLAR}tag $PACKAGE; \\
echo \"The branch is now available in the ${AX_DOLLAR}${AX_DOLLAR}tag directory\"; \\
echo \"\"
branch-minor:
@tag=\"$PACKAGE-${AX_MAJOR_VERSION}_${AX_MINOR_VERSION}\"; \\
echo \"\"; \\
echo \"Creating minor brach: ${AX_DOLLAR}${AX_DOLLAR}tag\"; \\
(cd \"${AX_DOLLAR}(top_srcdir)\"; $CVS tag -b \"${AX_DOLLAR}${AX_DOLLAR}tag\"; ); \\
$GAWK -f ax_cvs_rel.awk -v change=1 \"${AX_DOLLAR}(top_srcdir)/configure.ac\" > configure.tmp; \\
touch ${AX_DOLLAR}(top_builddir)/commitlog; \\
DATE=\`date +\"%%Y-%%m-%%d\"\`; \\
echo \"${AX_DOLLAR}${AX_DOLLAR}DATE $USERNAME <$USEREMAIL>\" > commitlog.tmp ; \\
echo \"\" >> commitlog.tmp; \\
echo \" * ./configure.ac\" >> commitlog.tmp; \\
echo \" Created minor branch: ${AX_DOLLAR}${AX_DOLLAR}tag\" >> commitlog.tmp; \\
echo \" Use:\" >> commitlog.tmp; \\
echo \" \\\\\`cvs -d$ANON_CVSROOT login\\\\\`\" >> commitlog.tmp; \\
echo \" \\\\\`cvs -d$ANON_CVSROOT co -r ${AX_DOLLAR}${AX_DOLLAR}tag $PACKAGE\\\\\`\" >> commitlog.tmp; \\
echo \" to access the branch\" >> commitlog.tmp; \\
echo \"\" >> commitlog.tmp; \\
cat ${AX_DOLLAR}(top_builddir)/commitlog >> commitlog.tmp; \\
mv commitlog.tmp ${AX_DOLLAR}(top_builddir)/commitlog; \\
cat ${AX_DOLLAR}(top_builddir)/commitlog \"${AX_DOLLAR}(top_srcdir)/ChangeLog\" > ChangeLog.tmp; \\
mv ChangeLog.tmp \"${AX_DOLLAR}(top_srcdir)/ChangeLog\"; \\
mv configure.tmp \"${AX_DOLLAR}(top_srcdir)/configure.ac\"; \\
CURR=\`(cd \"${AX_DOLLAR}(top_builddir)\"; pwd )\`; \\
(cd \"${AX_DOLLAR}(top_srcdir)\"; $CVS -z9 commit -F \"${AX_DOLLAR}${AX_DOLLAR}CURR/commitlog\"; ); \\
rm -f ${AX_DOLLAR}(top_builddir)/commitlog; \\
$CVS -z9 -d${AX_DOLLAR}(CVSROOT) co -r ${AX_DOLLAR}${AX_DOLLAR}tag -d ${AX_DOLLAR}${AX_DOLLAR}tag $PACKAGE; \\
echo \"The branch is now available in the ${AX_DOLLAR}${AX_DOLLAR}tag directory\"; \\
echo \"\"
add_rel:
@touch \"${AX_DOLLAR}(top_builddir)/commitlog\"
@DATE=\`date +\"%%Y-%%m-%%d\"\`; \\
echo \"${AX_DOLLAR}${AX_DOLLAR}DATE $USERNAME <$USEREMAIL>\" > commitlog.tmp
@echo \"\" >> commitlog.tmp
@echo \" * ./configure.ac\" >> commitlog.tmp
@echo \" Released $PACKAGE-$VERSION\" >> commitlog.tmp
@echo \" You can access this release by running:\" >> commitlog.tmp
@echo \" \\\\\`cvs -d$ANON_CVSROOT login\\\\\`\" >> commitlog.tmp
@tag=\"$PACKAGE-${AX_MAJOR_VERSION}_${AX_MINOR_VERSION}_${AX_POINT_VERSION}\"; \\
echo \" \\\\\`cvs -d$ANON_CVSROOT co -r ${AX_DOLLAR}${AX_DOLLAR}tag -d $PACKAGE-$VERSION $PACKAGE\\\\\`\" >> commitlog.tmp
@echo \" The release will then be available in the $PACKAGE-$VERSION directory\" >> commitlog.tmp
@echo \"\" >> commitlog.tmp
@cat \"${AX_DOLLAR}(top_builddir)/commitlog\" >> commitlog.tmp
@mv commitlog.tmp \"${AX_DOLLAR}(top_builddir)/commitlog\"
@cat \"${AX_DOLLAR}(top_builddir)/commitlog\" \"\$(top_srcdir)/ChangeLog\" > ChangeLog.tmp
@mv ChangeLog.tmp \"\$(top_srcdir)/ChangeLog\"
@CURR=\`(cd \"${AX_DOLLAR}(top_builddir)\"; pwd )\`; \\
(cd \"\$(top_srcdir)\"; $CVS -z9 commit -F \"${AX_DOLLAR}${AX_DOLLAR}CURR/commitlog\"; )
@rm -f ${AX_DOLLAR}(top_builddir)/commitlog
do_tag:
@tag=\"$PACKAGE-${AX_MAJOR_VERSION}_${AX_MINOR_VERSION}_${AX_POINT_VERSION}\"; \\
echo \"tagging release with ${AX_DOLLAR}${AX_DOLLAR}tag\"; \\
(cd \"\$(top_srcdir)\"; $CVS tag -b \"${AX_DOLLAR}${AX_DOLLAR}tag\"; ); \\
$CVS -z9 -d$CVSROOT co -r ${AX_DOLLAR}${AX_DOLLAR}tag -d ${AX_DOLLAR}${AX_DOLLAR}tag $PACKAGE; \\
echo \"The release is now available in the ${AX_DOLLAR}${AX_DOLLAR}tag directory\"; \\
echo \"\"
inc_rel:
@$GAWK -f ax_cvs_rel.awk -v change=3 \"\$(top_srcdir)/configure.ac\" > configure.tmp;
@mv configure.tmp \"\$(top_srcdir)/configure.ac\"
@touch \"\$(top_builddir)/commitlog\"
@DATE=\`date +\"%%Y-%%m-%%d\"\`; \\
echo \"${AX_DOLLAR}${AX_DOLLAR}DATE $USERNAME <$USEREMAIL>\" > commitlog.tmp ; \\
echo \"\" >> commitlog.tmp; \\
echo \" * ./configure.ac\" >> commitlog.tmp; \\
echo \" Update version number\" >> commitlog.tmp; \\
echo \"\" >> commitlog.tmp; \\
cat ${AX_DOLLAR}(top_builddir)/commitlog >> commitlog.tmp; \\
mv commitlog.tmp ${AX_DOLLAR}(top_builddir)/commitlog; \\
cat ${AX_DOLLAR}(top_builddir)/commitlog \"${AX_DOLLAR}(top_srcdir)/ChangeLog\" > ChangeLog.tmp; \\
mv ChangeLog.tmp \"${AX_DOLLAR}(top_srcdir)/ChangeLog\"; \\
CURR=\`(cd \"${AX_DOLLAR}(top_builddir)\"; pwd )\`; \\
(cd \"${AX_DOLLAR}(top_srcdir)\"; $CVS -z9 commit -F \"${AX_DOLLAR}${AX_DOLLAR}CURR/commitlog\"; ); \\
rm -f ${AX_DOLLAR}(top_builddir)/commitlog;
tag: do_tag inc_rel
# creates a release for the current version, increaments the point
# release number and checkout the release into a new direcory
release: update distcheck add_rel tag
# same as release, but distcheck is not performed before releasing
quick-release: update add_rel tag
]])
fi
])