Macro: am_rpm_init

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

# am_rpm_init

## Synopsis

`AM_RPM_INIT`

## Version

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

## 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)
    ])