use automake and libtool

This commits replaces the handwritten makefile with automake+libtool.
There is some hackery needed for the LD_PRELOAD shared library,
but apart from that there is nothing special and it is a large gain in
portability and standardization.

The spec file is modified as little as is needed to properly build
the RPMs.
This commit is contained in:
Paolo Bonzini
2011-10-28 14:29:43 +02:00
parent d56fa027ff
commit 17319072b1
10 changed files with 127 additions and 152 deletions

16
.gitignore vendored
View File

@@ -1,13 +1,25 @@
/autom4te.cache
/depcomp
/aclocal.m4
/missing
/config.guess
/config.sub
/install-sh
/configure
/config.h.in
/Makefile.in
/Makefile
.deps
.libs
/stamp-h1
*.o
*.a
*.so*
*.lo
*.la
bin
/config.h
/config.log
/config.status
.dirstamp
/libtool
/ltmain.sh
libiscsi-*.tar.gz

78
Makefile.am Normal file
View File

@@ -0,0 +1,78 @@
# Generic definitions
ACLOCAL_AMFLAGS =-I m4
AUTOMAKE_OPTIONS = foreign subdir-objects
AM_CPPFLAGS=-I. -I$(srcdir)/include "-D_U_=__attribute__((unused))"
AM_CFLAGS=$(WARN_CFLAGS)
LDADD = lib/libiscsi.la -lpopt
EXTRA_DIST = autogen.sh COPYING.LESSER \
packaging/RPM/libiscsi.spec.in packaging/RPM/makerpms.sh
# libiscsi shared library
iscsi_includedir = $(includedir)/iscsi
dist_iscsi_include_HEADERS = include/iscsi.h include/scsi-lowlevel.h
dist_noinst_HEADERS = include/iscsi-private.h include/md5.h include/slist.h
lib_LTLIBRARIES = lib/libiscsi.la
lib_libiscsi_la_SOURCES = \
lib/connect.c lib/crc32c.c lib/discovery.c lib/init.c \
lib/login.c lib/md5.c lib/nop.c lib/pdu.c lib/scsi-command.c \
lib/scsi-lowlevel.c lib/socket.c lib/sync.c lib/task_mgmt.c
SONAME=$(firstword $(subst ., ,$(VERSION)))
SOREL=$(shell printf "%d%02d%02d" $(subst ., ,$(VERSION)))
lib_libiscsi_la_LDFLAGS = \
-version-info $(SONAME):$(SOREL):0 -bindir $(bindir) -no-undefined
# libiscsi utilities
bin_PROGRAMS = bin/iscsi-inq bin/iscsi-ls
bin_iscsi_inq_SOURCES = src/iscsi-inq.c
bin_iscsi_ls_SOURCES = src/iscsi-ls.c
# Other examples
noinst_PROGRAMS = bin/iscsiclient
bin_iscsiclient_SOURCES = examples/iscsiclient.c
EXTRA_PROGRAMS = bin/iscsi-dd
bin_iscsi_dd_SOURCES = examples/iscsi-dd.c
# libiscsi test tool
noinst_PROGRAMS += bin/iscsi-test
dist_noinst_HEADERS += test-tool/iscsi-test.h
bin_iscsi_test_CPPFLAGS = $(AM_CPPFLAGS) -I$(srcdir)/test-tool
bin_iscsi_test_SOURCES = test-tool/iscsi-test.c \
test-tool/0100_read10_simple.c test-tool/0101_read10_beyond_eol.c \
test-tool/0102_read10_0blocks.c test-tool/0103_read10_rdprotect.c \
test-tool/0104_read10_flags.c test-tool/0105_read10_invalid.c \
test-tool/0110_readcapacity10_simple.c \
test-tool/0111_readcapacity10_pmi.c test-tool/0120_read6_simple.c \
test-tool/0121_read6_beyond_eol.c test-tool/0122_read6_invalid.c
# LD_PRELOAD library.
if LD_ISCSI
EXTRA_PROGRAMS += bin/ld_iscsi
CLEANFILES = bin/ld_iscsi.o bin/ld_iscsi.so
# This gets a bit messy:
#
# 1) let automake compile the sources
bin_ld_iscsi_SOURCES = src/ld_iscsi.c
bin_ld_iscsi_CFLAGS = $(AM_CFLAGS) -fPIC
# 2) let libtool link in the static version of the library
noinst_LTLIBRARIES = lib/libiscsi_convenience.la
lib_libiscsi_convenience_la_SOURCES = $(lib_libiscsi_la_SOURCES)
bin/ld_iscsi.o: src/bin_ld_iscsi-ld_iscsi.o lib/libiscsi_convenience.la
$(LIBTOOL) --mode=link $(CC) -o $@ $^
# 3) Manually create the .so file.
bin_SCRIPTS = bin/ld_iscsi.so
bin/ld_iscsi.so: bin/ld_iscsi.o
$(CC) -shared -o bin/ld_iscsi.so bin/ld_iscsi.o -ldl
endif

View File

@@ -1,72 +0,0 @@
prefix = $(DESTDIR)
ifeq ($(prefix),)
prefix = @prefix@
endif
exec_prefix = @exec_prefix@
libdir = $(LIBDIR)
ifeq ($(libdir),)
libdir = @libdir@
endif
bindir = @bindir@
LIBS=-lpopt @LIBS@
CC=gcc
CFLAGS=-g -O2 -fPIC -Wall -W -I. -I./include "-D_U_=__attribute__((unused))"
LIBISCSI_OBJ = lib/connect.o lib/crc32c.o lib/discovery.o lib/init.o lib/login.o lib/md5.o lib/nop.o lib/pdu.o lib/scsi-command.o lib/scsi-lowlevel.o lib/socket.o lib/sync.o lib/task_mgmt.o
INSTALLCMD = @install@ -c
LIBISCSI_SO_NAME=libiscsi.so.1
VERSION=1.0.0
LIBISCSI_SO=libiscsi.so.$(VERSION)
all: bin/iscsi-inq bin/iscsi-ls lib/$(LIBISCSI_SO) @ld_iscsi@
bin/ld_iscsi.so: src/ld_iscsi.o lib/libiscsi.a
mkdir -p bin
ld -shared -o $@ src/ld_iscsi.o lib/libiscsi.a -ldl
bin/iscsi-ls: src/iscsi-ls.c lib/libiscsi.a
mkdir -p bin
$(CC) $(CFLAGS) -o $@ src/iscsi-ls.c lib/libiscsi.a $(LIBS)
bin/iscsi-inq: src/iscsi-inq.c lib/libiscsi.a
mkdir -p bin
$(CC) $(CFLAGS) -o $@ src/iscsi-inq.c lib/libiscsi.a $(LIBS)
lib/$(LIBISCSI_SO): $(LIBISCSI_OBJ)
@echo Creating shared library $@
$(CC) -shared -Wl,-soname=$(LIBISCSI_SO_NAME) -o $@ $(LIBISCSI_OBJ)
lib/libiscsi.a: $(LIBISCSI_OBJ)
@echo Creating library $@
ar r lib/libiscsi.a $(LIBISCSI_OBJ)
ranlib lib/libiscsi.a
examples: bin/iscsiclient
bin/iscsiclient: examples/iscsiclient.c lib/libiscsi.a
mkdir -p bin
$(CC) $(CFLAGS) -o $@ examples/iscsiclient.c lib/libiscsi.a $(LIBS)
install: lib/libiscsi.a lib/$(LIBISCSI_SO) bin/iscsi-ls bin/iscsi-inq
$(INSTALLCMD) -m 755 lib/$(LIBISCSI_SO) $(libdir)
$(INSTALLCMD) -m 755 lib/libiscsi.a $(libdir)
$(INSTALLCMD) -m 755 bin/iscsi-ls $(bindir)
$(INSTALLCMD) -m 755 bin/iscsi-inq $(bindir)
mkdir -p $(exec_prefix)/include/iscsi
$(INSTALLCMD) -m 644 include/iscsi.h $(exec_prefix)/include/iscsi
$(INSTALLCMD) -m 644 include/scsi-lowlevel.h $(exec_prefix)/include/iscsi
iscsi-test: lib/libiscsi.a
make -C test-tool
distclean: clean
rm -f config.h config.log config.status configure Makefile
clean:
rm -f lib/*.o src/*.o examples/*.o
rm -f bin/*
rm -f lib/libiscsi.so*
rm -f lib/libiscsi.a
rm -f iscsi-inq iscsi-ls
make -C test-tool clean

View File

@@ -1,13 +1,13 @@
#!/bin/sh
rm -rf autom4te.cache
rm -f configure config.h.in libiscsi.pc
IPATHS="-I ./include -I ../include"
autoheader $IPATHS || exit 1
autoconf $IPATHS || exit 1
rm -f depcomp aclocal.m4 missing config.guess config.sub install-sh
rm -f configure config.h.in config.h.in~ m4/libtool.m4 m4/lt*.m4 Makefile.in
autoreconf -fvi
(cd m4 && for i in libtool.m4 lt*.m4; do
echo /$i
done) > m4/.gitignore
rm -rf autom4te.cache
echo "Now run ./configure and then make."

View File

@@ -1,7 +1,11 @@
AC_PREREQ(2.50)
AC_INIT(libiscsi, m4_esyscmd([grep 'Version:' ./packaging/RPM/libiscsi.spec.in 2>/dev/null | head -1 | sed -e 's/[ \t]*Version:[ \t]*\([^ \t]*\)[ \t]*.*/\1/' | tr -d '\n']))
AC_CONFIG_SRCDIR([lib/init.c])
AC_CONFIG_MACRO_DIR([m4])
AM_INIT_AUTOMAKE
AM_SILENT_RULES
LT_INIT
if test "${libdir}" = '${exec_prefix}/lib'; then
case `uname -m` in
x86_64|ppc64|powerpc64)
@@ -13,33 +17,14 @@ if test "${libdir}" = '${exec_prefix}/lib'; then
esac
fi
is_solaris="no"
install="/usr/bin/install"
ldconfig="ldconfig"
ld_iscsi=""
case `uname` in
Linux*)
ld_iscsi="bin/ld_iscsi.so"
;;
AIX*)
;;
SunOS)
is_solaris="yes"
install="ginstall"
ldconfig="echo no ldconfig on solaris"
LIBS="$LIBS -lsocket -lnsl"
;;
CYGWIN*)
ldconfig="echo no ldconfig on cygwin"
;;
*)
;;
esac
AC_CANONICAL_HOST
AM_CONDITIONAL(LD_ISCSI,
[case $host_os in linux*) ;; *) AS_SET_STATUS(1);; esac ])
if test "$ac_cv_prog_gcc" = yes; then
CFLAGS="$CFLAGS -Wall -Wshadow -Wstrict-prototypes -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings"
WARN_CFLAGS="-Wall -W -Wshadow -Wstrict-prototypes -Wpointer-arith -Wcast-align -Wwrite-strings"
fi
AC_SUBST(WARN_CFLAGS)
LOGDIR='${localstatedir}/log'
AC_ARG_WITH([logdir],
@@ -54,11 +39,6 @@ AC_SUBST(LOGDIR)
AC_CONFIG_HEADER(config.h)
EXTRA_OBJ=""
#AC_CHECK_HEADERS(sched.h)
#AC_CHECK_FUNCS(mlockall)
AC_CACHE_CHECK([for sin_len in sock],libiscsi_cv_HAVE_SOCK_SIN_LEN,[
AC_TRY_COMPILE([#include <sys/types.h>
#include <sys/socket.h>
@@ -121,10 +101,5 @@ else
exit
fi
AC_SUBST(libdir)
AC_SUBST(install)
AC_SUBST(ldconfig)
AC_SUBST(ld_iscsi)
#AC_SUBST(LIBISCSI_LDFLAGS)
AC_OUTPUT(Makefile)
AC_CONFIG_FILES(Makefile)
AC_OUTPUT

5
m4/.gitignore vendored Normal file
View File

@@ -0,0 +1,5 @@
/libtool.m4
/lt~obsolete.m4
/ltoptions.m4
/ltsugar.m4
/ltversion.m4

1
packaging/RPM/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/*.spec

View File

@@ -40,25 +40,13 @@ export CC
## always run autogen.sh
./autogen.sh
CFLAGS="$RPM_OPT_FLAGS $EXTRA -O0" ./configure \
--prefix=%{_prefix} \
--sysconfdir=%{_sysconfdir} \
--mandir=%{_mandir} \
--localstatedir="/var"
%configure
make
%install
# Clean up in case there is trash left from a previous build
rm -rf $RPM_BUILD_ROOT
# Create the target build directory hierarchy
mkdir -p $RPM_BUILD_ROOT%{_bindir}
mkdir -p $RPM_BUILD_ROOT%{_libdir}
mkdir -p $RPM_BUILD_ROOT%{_includedir}
mkdir -p $RPM_BUILD_ROOT%{_includedir}/iscsi
#
make DESTDIR=$RPM_BUILD_ROOT%{_prefix} LIBDIR=$RPM_BUILD_ROOT%{_libdir} install
make DESTDIR=$RPM_BUILD_ROOT install
# Remove "*.old" files
find $RPM_BUILD_ROOT -name "*.old" -exec rm -f {} \;
@@ -73,10 +61,10 @@ rm -rf $RPM_BUILD_ROOT
%files
%defattr(-,root,root)
%{_bindir}/ld_iscsi.so
%{_bindir}/iscsi-ls
%{_bindir}/iscsi-inq
%{_libdir}/libiscsi.so.1.0.0
%{_libdir}/libiscsi.so.*
%package devel
Summary: iSCSI client development libraries
@@ -90,6 +78,8 @@ development libraries for iSCSI
%{_includedir}/iscsi/iscsi.h
%{_includedir}/iscsi/scsi-lowlevel.h
%{_libdir}/libiscsi.a
%{_libdir}/libiscsi.la
%{_libdir}/libiscsi.so
%changelog
* Sat Dec 4 2010 : Version 1.0.0

View File

@@ -58,14 +58,15 @@ VERSION=$(grep ^Version ${DIRNAME}/${SPECFILE} | sed -e 's/^Version:\ \+//')
RELEASE=$(grep ^Release ${DIRNAME}/${SPECFILE} | sed -e 's/^Release:\ \+//')
if echo | gzip -c --rsyncable - > /dev/null 2>&1 ; then
GZIP="gzip -9 --rsyncable"
GZIP_ENV="-9 --rsyncable"
else
GZIP="gzip -9"
GZIP_ENV="-9"
fi
pushd ${TOPDIR}
echo -n "Creating libiscsi-${VERSION}.tar.gz ... "
git archive --prefix=libiscsi-${VERSION}/ HEAD | ${GZIP} > ${SRCDIR}/libiscsi-${VERSION}.tar.gz
sh autogen.sh
make dist GZIP_ENV="\"$GZIP_ENV\""
RC=$?
popd
echo "Done."
@@ -79,6 +80,7 @@ fi
##
## copy additional source files
##
cp -p ${TOPDIR}/libiscsi-${VERSION}.tar.gz ${SRCDIR}
cp -p ${DIRNAME}/${SPECFILE} ${SPECDIR}
##

View File

@@ -1,16 +0,0 @@
LIBS=-lpopt
CC=gcc
CFLAGS=-g -O0 -fPIC -Wall -W -I. -I./include -I../include "-D_U_=__attribute__((unused))"
TESTS=0100_read10_simple.o 0101_read10_beyond_eol.o 0102_read10_0blocks.o \
0103_read10_rdprotect.o 0104_read10_flags.o 0105_read10_invalid.o \
0110_readcapacity10_simple.o 0111_readcapacity10_pmi.o \
0120_read6_simple.o 0121_read6_beyond_eol.o 0122_read6_invalid.o
all: iscsi-test
iscsi-test: iscsi-test.c $(TESTS)
$(CC) $(CFLAGS) iscsi-test.c -o iscsi-test $(TESTS) ../lib/libiscsi.a $(LIBS)
clean:
rm -f *.o
rm -f iscsi-test