## This package understands the following switches:
## --without fedora     ...   disable fedora specific parts

## Fedora Extras specific customization below...
%bcond_without       	fedora
##


%global	username	gnunet
%global uid		32
%global plugindir	%_libdir/GNUnet
%global homedir		%_var/lib/%name
%global logdir		%_var/log/%name
%global rundir		%_var/run/%name

%{!?release_func:%global release_func() %1%{?dist}}

Name:		gnunet
Version:	0.8.0c
Release:	%release_func 3
Summary:	Secure and non-centralized peer-to-peer networking framework

Group:		Applications/Internet
License:	GPL
URL:		http://gnunet.org/
Source0:	http://gnunet.org/download/GNUnet-%version.tar.bz2
Patch0:		GNUnet-0.8.0c-paths.patch
BuildRoot:	%_tmppath/%name-%version-%release-root

BuildRequires:	libextractor-devel guile-devel libgcrypt-devel
BuildRequires:	gmp-devel libtool-ltdl-devel
BuildRequires:	adns-devel
BuildRequires:	gettext gawk
Obsoletes:	GNUnet

%package lib
Summary:	Libraries for GNUnet
Group:		System Environment/Libraries
Requires:	%name-transports
Obsoletes:	GNUnet-lib

%package modules
Summary:	Module meta package
Group:		System Environment/Libraries
Requires:	%name-modules-base   = %version-%release
Requires:	%name-modules-curl   = %version-%release
Requires:	%name-modules-sqlite = %version-%release
Requires:	%name-modules-mysql  = %version-%release
Requires:	%name-setup-text     = %version-%release
Requires:	%name-setup-gtk      = %version-%release
Requires:	%name-setup-qt       = %version-%release
Requires:	%name-transports     = %version-%release
Obsoletes:	GNUnet-modules

%package transports
Summary:	Transport modules for GNUnet
Group:		System Environment/Libraries
Requires:	%name-lib = %version-%release
# Ensure correct (de)installation order
Requires(pre):		%name-lib
Requires(postun):	%name-lib
Obsoletes:		GNUnet-transports

%package setup-gtk
Summary:	Module for GTK based setup
Group:		System Environment/Libraries
Requires:	%name-lib = %version-%release
Provides:	module-setup(%name) = gtk
BuildRequires:	libglade2-devel gtk2-devel
Obsoletes:	GNUnet-setup-gtk

%package setup-text
Summary:	Module for text based setup
Group:		System Environment/Libraries
Requires:	%name-lib = %version-%release
Provides:	module-setup(%name) = text
BuildRequires:	dialog dialog-devel
Obsoletes:	GNUnet-setup-text

%package setup-qt
Summary:	Module for Qt based setup
Group:		System Environment/Libraries
Requires:	%name-lib = %version-%release
Provides:	module-setup(%name) = qt
BuildRequires:	qt4-devel
Obsoletes:	GNUnet-setup-qt

%package modules-base
Summary:	Base modules for GNUnet
Group:		System Environment/Libraries
Requires:	%name-lib = %version-%release
Obsoletes:	GNUnet-modules-base

%package modules-curl
Summary:	Curl backend module for GNUnet
Group:		System Environment/Libraries
Requires:	%name-lib = %version-%release
BuildRequires:	curl-devel
Obsoletes:	GNUnet-modules-curl

%package modules-sqlite
Summary:	SQLite backend module for GNUnet
Group:		System Environment/Libraries
Requires:	%name-lib = %version-%release
Provides:	module-storage(%name) = sqlite
BuildRequires:	sqlite-devel
Obsoletes:	GNUnet-modules-sqlite

%package modules-mysql
Summary:	MySQL backend module for GNUnet
Group:		System Environment/Libraries
Requires:	%name-lib = %version-%release
Provides:	module-storage(%name) = mysql
BuildRequires:	mysql-devel
Obsoletes:	GNUnet-modules-mysql

%package modules-pgsql
Summary:	PostgreSQL backend module for GNUnet
Group:		System Environment/Libraries
Requires:	%name-lib = %version-%release
Provides:	module-storage(%name) = pgsql
BuildRequires:	postgresql-devel

%package devel
Summary:	Headers and other files required to develop GNUnet based applications
Requires:	%name-lib = %version-%release
Group:		Development/Libraries
Obsoletes:	GNUnet-devel

%package server
Summary:	GNUnet daemon
Group:		System Environment/Daemons
Source10:	gnunetd.sysv
Obsoletes:	GNUnet-server
Requires:		%name-server-core  = %version-%release
Requires(pre):		%name-server-core
Requires(postun):	%name-server-core

%package server-core
Summary:	GNUnet daemon core files
Group:		System Environment/Daemons
Requires:	%name-lib          = %version-%release
Requires:	%name-modules-base = %version-%release
Requires:	gnunet-transports
Requires:	module-storage(%name)
BuildRequires:	fedora-usermgmt-devel
Provides:	user(%username)
Provides:	group(%username)
%{?FE_USERADD_REQ}

%description
GNUnet is a framework for secure peer-to-peer networking that does not
use any centralized or otherwise trusted services. A first service
implemented on top of the networking layer allows anonymous
censorship-resistant file-sharing.  GNUnet uses a simple, excess-based
economic model to allocate resources.  Peers in GNUnet monitor each
others behavior with respect to resource usage; peers that contribute
to the network are rewarded with better service.


%description devel
GNUnet is a framework for secure peer-to-peer networking that does not
use any centralized or otherwise trusted services.

This package contains headers and other files which are required to
develop GNUnet based applications.

%description lib
GNUnet is a framework for secure peer-to-peer networking that does not
use any centralized or otherwise trusted services.

This package contains libraries which are required by GNUnet applications.


%description server
GNUnet is a framework for secure peer-to-peer networking that does not
use any centralized or otherwise trusted services.


%description server-core
GNUnet is a framework for secure peer-to-peer networking that does not
use any centralized or otherwise trusted services.

This package contains the 'gnunetd' daemon.


%description modules
GNUnet is a framework for secure peer-to-peer networking that does not
use any centralized or otherwise trusted services.

This is a metapackage which brings in all supported modules.

%description modules-base
GNUnet is a framework for secure peer-to-peer networking that does not
use any centralized or otherwise trusted services.

%description setup-text
%description setup-gtk
%description setup-qt
%description modules-sqlite
%description modules-curl
%description modules-mysql
%description modules-pgsql
%description transports

%prep
%setup -q -n GNUnet-%version
%patch0 -p1 -b .paths

cat << "EOF" >> src/util/os/Makefile.in
AM_CPPFLAGS += \
	-D PREFIX=\"$(prefix)\" -D BINDIR=\"$(bindir)\" \
	-D DATADIR=\"$(datadir)\"  			\
	-D PKG_LIBDIR=\"$(pkglibdir)\"			\
	-D PKG_DATADIR=\"$(pkgdatadir)\"
EOF

sed -i -e '
	s!^\(USER\|GROUP\) =[ a-z]*$!\1 = %username!g;
	s!^LOGFILE =.*!LOGFILE = %logdir/daemon-logs!g;
	s!^PIDFILE =.*!PIDFILE = %rundir/gnunetd.pid!g;

' \
	contrib/gnunetd.conf

touch --reference=configure .stamp
sed -i -e 's!SQLITE\(_.*FLAGS=.*postgres\)!POSTGRES\1!g' configure
touch --reference=.stamp configure

for i in src/setup/ncurses/Makefile.{am,in}; do
	touch --reference "$i" .sed-stamp
	sed -i \
		-e '/^libgnunetsetup_curses_la_LIBADD =/a\'	\
		-e ' -ldialog -lncursesw -lm \\'		\
		"$i"
	touch --reference .sed-stamp "$i"
done

mkdir -p _dialog _postgresql/include
ln -s %_includedir/dialog _dialog/include
ln -s %_includedir        _postgresql/include/postgresql


%build
# put qt4 stuff into $PATH
p=`pkg-config --variable=bindir Qt`
PATH=$p:/usr/bin:/bin

%configure --disable-static			\
	--disable-rpath				\
	--with-dialog=`pwd`/_dialog		\
	--with-qt				\
	--with-guile				\
	--with-gmp				\
	--with-sqlite				\
	--with-mysql				\
	--with-postgres=`pwd`/_postgresql	\
	--with-extractor			\
	--with-adns				\
	LDFLAGS='-Wl,--as-needed'

# build with --as-needed and disable rpath
sed -i \
	-e 's! -shared ! -Wl,--as-needed\0!g' 					\
	-e '/sys_lib_dlsearch_path_spec=\"\/lib \/usr\/lib /s!\"\/lib \/usr\/lib !/\"/%_lib /usr/%_lib !g'	\
	libtool

# not SMP safe
make


%install
rm -rf $RPM_BUILD_ROOT
make install DESTDIR=$RPM_BUILD_ROOT

find $RPM_BUILD_ROOT%_libdir -name '*.la' -print0 | xargs -0 rm -f
mkdir -p $RPM_BUILD_ROOT{%homedir,%logdir,%_initrddir,%rundir}

install -pm0755 %SOURCE10            $RPM_BUILD_ROOT%_initrddir/gnunetd
install -pm0640 contrib/gnunetd.conf $RPM_BUILD_ROOT%_sysconfdir/gnunetd.conf

# broken
rm -f $RPM_BUILD_ROOT%_bindir/gnunet-download-manager.scm

# non existing
rm -f $RPM_BUILD_ROOT%_mandir/*/gnunet-{download-manager,testbed}.1*

for i in base sqlite curl mysql core server; do
	echo '%defattr(-,root,root,-)' > filelists.$i
done

for i in $RPM_BUILD_ROOT%plugindir/libgnunetmodule*.so; do
	readelf -a "$i" | \
	sed '/(NEEDED)/s!.*\[\(.*\)\].*!\1!p;d' | {
		target=base
		is_sqlite=
		is_curl=
		is_mysql=
		is_pgsql=
		fname=${i##$RPM_BUILD_ROOT}
		while read lib; do
			lib=${lib%%.so*}
			case $lib in
				(libgnunet*|libc|libm|libpthread)	;;
				(libsqlite*)	is_sqlite=1; target=sqlite;;
				(libcurl)	is_curl=1;   target=curl;;
				(libmysql*)	is_mysql=1;  target=mysql;;
				(libpq*)	is_pgsql=1;  target=pgsql;;
				(*)
					target=other
					echo "$fname -> $lib"
					;;
			esac
		done

		case $target in
			(base)	echo "$fname" >> filelists.base;;
			(other) ;;
			(*)     test "$is_sqlite$is_curl$is_mysql$is_pgsql" = 1 || {
					echo "too much foreign libraries"  >&2
					exit 1
				}
				echo "$fname" >> filelists.$target
				;;
		esac
	} || exit 1
done


for i in $RPM_BUILD_ROOT%_bindir/*; do
	fname=${i##$RPM_BUILD_ROOT}
	b=${fname##%_bindir/}
	case $b in
	(gnunet-peer-info|gnunet-transport-check|gnunet-update|gnunet-chat|gnunetd)
		dst=server
		;;
	(remotetest)
		echo $fname >> filelists.server
		continue
		;;
	(*)
		dst=core
		;;
	esac

	echo $fname            >> filelists.$dst
	echo "%_mandir/*/$b.*" >> filelists.$dst
done


%find_lang GNUnet


%clean
rm -rf $RPM_BUILD_ROOT


%post   lib -p /sbin/ldconfig
%postun lib -p /sbin/ldconfig

%pre server-core
%__fe_groupadd %uid -r %username &>/dev/null || :
%__fe_useradd  %uid -r -s /sbin/nologin -d %homedir -M          \
                    -c 'The gnunet daemon user' -g %username %username &>/dev/null || :

%postun server-core
%__fe_userdel  %username &>/dev/null || :
%__fe_groupdel %username &>/dev/null || :


%files -f filelists.core
%defattr(-,root,root,-)
%doc AUTHORS COPYING ChangeLog README UPDATING
%lang(fr) %doc README.fr
%_datadir/GNUnet

%files devel
%defattr(-,root,root,-)
%_includedir/GNUnet
%_libdir/*.so

%files lib -f GNUnet.lang
%defattr(-,root,root,-)
%_libdir/*.so.*
%dir %plugindir
%_mandir/man5/*

%files server -f filelists.server
%defattr(-,root,root,-)
%config %_initrddir/gnunetd

%files server-core
%defattr(-,root,root,-)
%_bindir/gnunetd
%_mandir/man*/gnunetd*
%config(noreplace) %_sysconfdir/gnunetd.conf
%dir %attr(0700,%username,%username) %homedir
%dir %attr(0730,root,%username)      %logdir
%dir %attr(0775,root,%username)      %rundir


%files modules
%files modules-base   -f filelists.base
%files modules-sqlite -f filelists.sqlite
%files modules-curl   -f filelists.curl

%files modules-mysql  -f filelists.mysql
%attr(-,root,root) %doc doc/README.mysql

%files modules-pgsql  -f filelists.pgsql
%attr(-,root,root) %doc doc/README.postgres

%files setup-text
%defattr(-,root,root,-)
%plugindir/libgnunetsetup_text.so
%plugindir/libgnunetsetup_curses.so

%files setup-gtk
%defattr(-,root,root,-)
%plugindir/libgnunetsetup_gtk.so

%files setup-qt
%defattr(-,root,root,-)
%plugindir/libgnunetsetup_qt.so


%files transports
%defattr(-,root,root,-)
%plugindir/libgnunettransport_*.so


%changelog
