Macro: am_rpm_init

Back to the Main Page. | # am_rpm_init | Download the M4 Source.

Synopsis

  `AM_RPM_INIT`

Version

  1.1.1.1 (2001/07/26) Installed_Packages @ ac-archive-0.5.39

Author

  Dale K. Hawkins <dhawkins@cdrgts.com>

Description

  Setup variables for creation of rpms. It will define several variables useful for creating rpms on a system where rpms are supported. Currently, I requires changes to Makefile.am to function properly (see the example below).

  Also note that I do not use any non-UNIX OSs (and for the most part, I only use RedHat), so this is probably generally not useful for other systems.

  Required setup:

  In configure.in:

  `dnl For my rpm.m4 macros`
  `RPM_RELEASE=1`
  `AC_SUBST(RPM_RELEASE)`

  `AM_RPM_INIT`
  `dnl Enable or disable the rpm making rules in Makefile.am`
  `AM_CONDITIONAL(MAKE_RPMS, test x$make_rpms = xtrue)`

  Furthermore, the %GNUconfigure rpm macro has a problem in that it does not define CXXFLAGS for the target system correctly, so for compiling C++ code, add the following line _before_ calling AC_PROG_CXX:

  `dnl This is a little hack to make this work with rpm better (see mysql++.spec.in)`
  `test -z "$CXXFLAGS" && CXXFLAGS="${CFLAGS}"`

  Changes to Makefile.am (I am trying to get rid of this step; suggestions invited):

  `if MAKE_RPMS`
  `rpm: @RPM_TARGET@`

  `.PHONY: rpm`

  `$(RPM_TARGET): $(DISTFILES)`
  `${MAKE} dist`
  `-mkdir -p $(RPM_DIR)/SRPMS`
  `-mkdir -p `dirname $(RPM_TARGET)``
  `$(RPM_PROG) $(RPM_ARGS) $(RPM_TARBALL)`
  `@echo Congratulations, $(RPM_TARGET) "(and friends)" should now exist.`
  `else`
  `endif`

  Also, it works best with a XXXX.spec.in file like the following (this is way down on the wishlist, but a program to generate the skeleton spec.in much like autoscan would just kick butt!):

  `---------- 8< ----------`
  `# -*- Mode:rpm-spec -*-`
  `# mysql++.spec.in`
  `Summary: Your package description goes here`
  `%define rel @RPM_RELEASE@`

  `%define version @VERSION@`
  `%define pkgname @PACKAGE@`
  `%define prefix /usr`

  `%define lt_release @LT_RELEASE@`
  `%define lt_version @LT_CURRENT@.@LT_REVISION@.@LT_AGE@`

  `# This is a hack until I can figure out how to better handle replacing`
  `# autoconf macros... (gotta love autoconf...)`
  `%define __aclocal aclocal || aclocal -I ./macros`
  `%define configure_args @RPM_CONFIGURE_ARGS@`

  `Name: %{pkgname}`
  `Version: %{version}`
  `Release: %{rel}`

  `Copyright: LGPL`
  `Group: # your group name goes here`
  `Source: %{pkgname}-%{version}.tar.gz`
  `Requires: # additional requirements`
  `Buildroot: /tmp/%{pkgname}-root`
  `URL: http://yoururl.go.here`
  `Prefix: %{prefix}`
  `BuildArchitectures: # Target platforms, i.e., i586`
  `Packager: Your Name <youremail@your.address>`

  `%description`
  `Your package description`

  `%changelog`

  `%prep`
  `%setup`
  `#%patch`

  `%build`
  `%GNUconfigure %{configure_args}`
  `# This is why we copy the CFLAGS to the CXXFLAGS in configure.in`
  `# CFLAGS="%{optflags}" CXXFLAGS="%{optflags}" ./configure %{_target_platform} --prefix=%{prefix}`
  `make`

  `%install`
  `# To make things work with BUILDROOT`
  `if [ "$RPM_BUILD_ROOT" != "/tmp/%{pkgname}-root" ]`
  `then`
  `echo`
  `echo @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@`
  `echo @ @`
  `echo @ RPM_BUILD_ROOT is not what I expected. Please clean it yourself. @`
  `echo @ @`
  `echo @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@`
  `echo`
  `else`
  `echo Cleaning RPM_BUILD_ROOT: "$RPM_BUILD_ROOT"`
  `rm -rf "$RPM_BUILD_ROOT"`
  `fi`
  `make DESTDIR="$RPM_BUILD_ROOT" install`

  `%clean`
  `# Call me paranoid, but I do not want to be responsible for nuking`
  `# someone's harddrive!`
  `if [ "$RPM_BUILD_ROOT" != "/tmp/%{pkgname}-root" ]`
  `then`
  `echo`
  `echo @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@`
  `echo @ @`
  `echo @ RPM_BUILD_ROOT is not what I expected. Please clean it yourself. @`
  `echo @ @`
  `echo @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@`
  `echo`
  `else`
  `echo Cleaning RPM_BUILD_ROOT: "$RPM_BUILD_ROOT"`
  `rm -rf "$RPM_BUILD_ROOT"`
  `fi`

  `%files`
  `%defattr(-, root, root)`
  `# Your application file list goes here`
  `# %{prefix}/lib/lib*.so*`
  `%doc COPYRIGHT ChangeLog README AUTHORS NEWS`
  `%doc doc/*`

  `# If you install a library`
  `%post -p /sbin/ldconfig`

  `# If you install a library`
  `%postun -p /sbin/ldconfig`

  `%package devel`
  `Summary: Development files for %{pkgname}`
  `Group: Applications/Databases`
  `%description devel`
  `Development files for %{pkgname}.`

  `%files devel`
  `%defattr(-, root, root)`
  `# Your development files go here`
  `# Programmers documentation goes here`
  `%doc doc`

  `# end of file`
  `---------- >8 ----------`

M4 Source Code

      dnl AM_RPM_INIT
      dnl Figure out how to create rpms for this system and setup for an
      dnl automake target

      AC_DEFUN([AM_RPM_INIT],
      [dnl
      AC_REQUIRE([AC_CANONICAL_HOST])
      dnl Find the RPM program
      AC_ARG_WITH(rpm-prog,[  --with-rpm-prog=PROG   Which rpm to use (optional)],
                  rpm_prog="$withval", rpm_prog="")

      AC_ARG_ENABLE(rpm-rules, [  --enable-rpm-rules       Try to create rpm make rules (defaults to yes for Linux)],
                      enable_rpm_rules="$withval",enable_rpm_rules=no)

      AC_ARG_WITH(rpm-extra-args, [  --with-rpm-extra-args=ARGS       Run rpm with extra arguments (defaults to none)],
                      rpm_extra_args="$withval", rpm_extra_args="")

      dnl AC_ARG_ENABLE(rpm-topdir, [  --enable-rpm       Try to create rpm make rules (defaults to yes for Linux)],
      dnl             enable_rpm_rules="$withval",no)

      dnl echo enable_rpm_rules is $enable_rpm_rules
      dnl echo rpm_prog is $rpm_prog

        RPM_TARGET=""

        if test x$enable_rpm_rules = xno ; then
           echo "Not trying to build rpms for your system (use --enable-rpm-rules to override) "
           no_rpm=yes
        else
          if test x$rpm_prog != x ; then
             if test x${RPM_PROG+set} != xset ; then
                RPM_PROG=$rpm_prog
             fi
          fi

          AC_PATH_PROG(RPM_PROG, rpm, no)
          no_rpm=no
          if test "$RPM_PROG" = "no" ; then
      echo *** RPM Configuration Failed
      echo *** Failed to find the rpm program.  If you want to build rpm packages
      echo *** indicate the path to the rpm program using  --with-rpm-prog=PROG
            no_rpm=yes
            RPM_MAKE_RULES=""
          else
            AC_MSG_CHECKING(how rpm sets %{_rpmdir})
            rpmdir=`rpm --eval %{_rpmdir}`
            if test x$rpmdir = x"%{_rpmdir}" ; then
              AC_MSG_RESULT([not set (cannot build rpms?)])
              echo *** Could not determine the value of %{_rpmdir}
              echo *** This could be because it is not set, or your version of rpm does not set it
              echo *** It must be set in order to generate the correct rpm generation commands
              echo ***
              echo *** You might still be able to create rpms, but I could not automate it for you
              echo *** BTW, if you know this is wrong, please help to improve the rpm.m4 module
              echo *** Send corrections, updates and fixes to dhawkins@cdrgts.com.  Thanks.
            else
              AC_MSG_RESULT([$rpmdir])
            fi
            AC_MSG_CHECKING(how rpm sets %{_rpmfilename})
            rpmfilename=$rpmdir/`rpm --eval %{_rpmfilename} | sed "s/%{ARCH}/${host_cpu}/g" | sed "s/%{NAME}/$PACKAGE/g" | sed "s/%{VERSION}/${VERSION}/g" | sed "s/%{RELEASE}/${RPM_RELEASE}/g"`
            AC_MSG_RESULT([$rpmfilename])

            RPM_DIR=${rpmdir}
            RPM_TARGET=$rpmfilename
            RPM_ARGS="-ta $rpm_extra_args"
            RPM_TARBALL=${PACKAGE}-${VERSION}.tar.gz
          fi
        fi

        case "${no_rpm}" in
          yes) make_rpms=false;;
          no) make_rpms=true;;
          *) AC_MSG_WARN([bad value ${no_rpm} for no_rpm (not making rpms)])
             make_rpms=false;;
        esac
        AC_SUBST(RPM_DIR)
        AC_SUBST(RPM_TARGET)
        AC_SUBST(RPM_ARGS)
        AC_SUBST(RPM_TARBALL)

        RPM_CONFIGURE_ARGS=${ac_configure_args}
        AC_SUBST(RPM_CONFIGURE_ARGS)
      ])