Problemy w budowaniu modułów okołokernelowych ze specy

Bartosz Świątek swiatek w informatik.hu-berlin.de
Pią, 21 Kwi 2006, 13:33:11 CEST


Dnia piątek, 21 kwietnia 2006 12:59, Arkadiusz Miskiewicz napisał(a):
> On Friday 21 April 2006 12:46, Bartosz Świątek wrote:
> > Witam,
> >
> > Pisałem o tym już kiedyś, ale nie zaszkodzi jeszcze raz.
> > Oprę się na przykładzie btsco.spec bo akurat jego przed chwilą
> > przerabiałem. Problem polega na tym gdy buduje się speca z opcją
> > --without dist_kernel dlatego, że już na wstępie jest burak. Kto o
> > zdrowym umyśle ma w drzewku jądra config-nondist ? Nikt.
>
> Nie nikt tylko masz go tam zrobić jak chcesz --without dist_kernel używać.

Po co ? Da rade i bez.

>
> > Więc, żeby zbudować speca trzeba
> > zrobić symlinka do .config. Nie lepiej w specu od razu podać, że ma
> > patrzyć do .config ? Lepiej. Druga sprawa to linkowanie.
> >
> > for cfg in %{?with_dist_kernel:%{?with_smp:smp}
> > up}%{!?with_dist_kernel:nondist}; do
> >         if [ ! -r "%{_kernelsrcdir}/config-$cfg" ]; then
> >                 exit 1
> >         fi
> >         install -d o/include/linux
> >         ln -sf %{_kernelsrcdir}/config-$cfg o/.config
> >
> > Dlaczego scrypt najpierw sprawdza czy jest config-nondist (znaczy wywala
> > się bo ze względów oczywistych go nie ma) a dopiero później kiedy on już
> > ma istnieć probuje go tworzyć robiąc symlinka do .config ? :) paranoja.
>
> Jak to dlaczego? Bo potrzebujesz mieć ten konfig w katalogu o/, a nie
> w /usr/src/costam.

Jeśli robie czysty make to nie potrzebuje go w o/.

>
> > W
> > ogóle całe linkowanie np. Module.symvers jest zbędne dla jajek
> > niepldowych.
>
> Dlaczego zbędne? Bez tego nie generują się zależności pomiędzy modułami.

Generują, mówimy tu o kernelu niedystrybucyjnym, czyli ktoś musiał go 
kompilować, są też na pewno źródła. Modules.symvers istnieje w drzewku. 
Mówie, że niepotrzebne jest linkowanie typu Modules.symvers-nondist -> 
Modules.symvers.

>
> > Następna sprawa to już makro %{__make} z opcjami. Dzięki opcji M=$PWD
> > O=$PWD/o budowa się wywala bo nie może rozpoznać wersji jądra.
>
> Przykład podaj.
>
> > Z powodu
> > innych opcji budowa też się wywala (głównie z powodu braku praw zapisu w
> > drzewku jądra).
>
> Po to są te opcje by w drzewku jądra się nic nie musiało zapisywać.

Nie zrozumieliśmy się. Właśnie kiedy są te opcje to probuje coś zapisywać w 
drzewku jądra.

>
> > Najlogiczniejszym krokiem jest więc pójść za radą autorów
> > danego modułu (tutaj btsco) i zrobić czyste %{__make} bez niczego. Paczka
> > się wtedy buduje bez problemu.
>
> Jednym tak, innym nie.
>
> > Należałoby przemyśleć jeszcze raz sposób
> > budowania takich specy dla kernelów niedystrybucyjnych, a sposób dla
> > jądra pldowego zostawić jak jest skoro działa.
>
> Z tym budowaniem zawsze były jazdy. Konkretnie coś zaproponuj to się
> popatrzy. Jakiś spec przerobiony wg Twojej ideii itp.
>
> Obecne budowanie pewnie ma jakieś wady ale problemów jest sporo:
> - czyste /usr/src/linux vs częściowo mielone /usr/src/linux
> - budowanie modułów gdy /usr/src/linux jest read only
> - budowanie kilku modułów poza /usr/src/linux ale tak by się odpowiednie
> zależności pomiędzy tymi modułami generowały (np. np paczka ieeecostam
> generująca na raz kilka *.ko zależnych od siebie)
> - budowanie modułu X z zależnościami od drugiego zewnętrznego moduły Y
> również z osobnej paczki (trzeba dostarczać Module.symver z budowania Y)
> - budowanie UP/SMP na raz
> - o czymś pewnie zapomniałem
>

Moja propozycja wygląda tak (patrz załączony btsco.spec). Nie jest ostateczna 
i chętnie popolemizuję nad jej zmianami. Jakoś trzeba to zmienić, żeby to 
działało w dwie strony. W obecnej wersji buduje się u mnie bez konieczności 
jakiegokolwiek linkowania czegokolwiek.
-------------- następna część ---------
# $Revision: 1.8 $, $Date: 2006/04/12 12:15:40 $
#
# Conditional build:
%bcond_without	dist_kernel	# without kernel from distribution
%bcond_without	kernel		# don't build kernel modules
%bcond_without	userspace	# don't build userspace utilities
%bcond_without	smp		# don't build SMP module
%bcond_with	verbose		# verbose build (V=1)
#
%define	rel	2
Summary:	Bluetooth-alsa Project
Summary(pl):	Projekt Bluetooth-alsa
Name:		btsco
Version:	0.41
Release:	%{rel}
License:	GPL
Group:		Applications/Sound
Source0:	http://dl.sourceforge.net/bluetooth-alsa/%{name}-%{version}.tar.gz
# Source0-md5:	111efb0f7092c92c4dd376eec96aa2e7
Patch0:		%{name}-readme-pl.diff
URL:		http://sourceforge.net/projects/bluetooth-alsa/
%if %{with kernel}
%{?with_dist_kernel:BuildRequires:	kernel-module-build}
%endif
%if %{with userspace}
BuildRequires:	alsa-driver-devel >= 1.0.9-1
BuildRequires:	alsa-lib-devel >= 1.0.9-1
BuildRequires:	autoconf
BuildRequires:	automake
BuildRequires:	bluez-libs-devel >= 2.21-1
BuildRequires:	libao-devel >= 0.8.6-1
%endif
BuildRoot:	%{tmpdir}/%{name}-%{version}-root-%(id -u -n)

%description
This project provides a way to use a bluetooth headset with Linux. We
do this currently by making an alsa kernel driver which uses bluez to
reach the headset. It works well enough now to get voice-quality audio
to and from most headsets.

%description -l pl
Dzięki temu oprogramowaniu można używać zestawów słuchawkowych
Bluetooth Headset z Linuksem. Osiągnięto to dzięki zbudowaniu alsowego
modułu do jądra, który to używa systemu bluez do komunikacji z takim
zestawem. Współpracuje z większością zestawów, ograniczeniem w
komunikacji jest często urządzenie USB, które to może mieć
nieobsługiwane częściowo protokoły, wskazówka: hciconfig hciXXX
revision. W skrajnym wypadku można próbować użyć innego urządzenia
USB.

%package -n kernel-char-btsco
Summary:	Linux ALSA kernel driver for Bluetooth Headset
Summary(pl):	Sterownik ALSA do jądra Linuksa dla Bluetooth Headset
Release:	%{rel}@%{_kernel_ver_str}
Group:		Base/Kernel
%{?with_dist_kernel:%requires_releq_kernel_up}
Requires(post,postun):	/sbin/depmod
Requires:	kernel-sound-alsa

%description -n kernel-char-btsco
Linux ALSA kernel driver for Bluetooth Headset named snd_bt_sco.

%description -n kernel-char-btsco -l pl
Sterownik ALSA do jądra Linuksa dla Bluetooth Headset o nazwie
snd_bt_sco.

%package -n kernel-smp-char-btsco
Summary:	Linux ALSA kernel driver for Bluetooth Headset (SMP)
Summary(pl):	Sterownik ALSA do jądra Linuksa dla Bluetooth Headset (SMP)
Release:	%{rel}@%{_kernel_ver_str}
Group:		Base/Kernel
%{?with_dist_kernel:%requires_releq_kernel_smp}
Requires(post,postun):	/sbin/depmod
Requires:	kernel-smp-sound-alsa

%description -n kernel-smp-char-btsco
Linux ALSA kernel (SMP) driver for Bluetooth Headset named snd_bt_sco.

%description -n kernel-smp-char-btsco -l pl
Sterownik ALSA do jądra Linuksa SMP dla Bluetooth Headset o nazwie
snd_bt_sco.

%prep
%setup -q
%patch0 -p1

%build
%if %{with userspace}
%{__aclocal}
%{__autoconf}
%{__autoheader}
%{__automake}
%configure

%{__make}
%endif

%if %{with kernel}
%if %{with dist_kernel}
cd kernel
# kernel module(s)
for cfg in %{?with_dist_kernel:%{?with_smp:smp} up}%; do
	if [ ! -r "%{_kernelsrcdir}/config-$cfg" ]; then
		exit 1
	fi
	install -d o/include/linux
	ln -sf %{_kernelsrcdir}/config-$cfg o/.config
	ln -sf %{_kernelsrcdir}/Module.symvers-$cfg o/Module.symvers
	ln -sf %{_kernelsrcdir}/include/linux/autoconf-$cfg.h o/include/linux/autoconf.h
%if %{with dist_kernel}
	%{__make} -C %{_kernelsrcdir} O=$PWD/o prepare scripts
%else
	install -d o/include/config
	touch o/include/config/MARKER
	ln -sf %{_kernelsrcdir}/scripts o/scripts
%endif

	# patching/creating makefile(s) (optional)
	%{__make} -C %{_kernelsrcdir} clean \
		RCS_FIND_IGNORE="-name '*.ko' -o" \
		SYSSRC=%{_kernelsrcdir} \
		SYSOUT=$PWD/o \
		M=$PWD O=$PWD/o \
		%{?with_verbose:V=1}

	%{__make} -C %{_kernelsrcdir} modules \
		CC="%{__cc}" CPP="%{__cpp}" \
		SYSSRC=%{_kernelsrcdir} \
		SYSOUT=$PWD/o \
		M=$PWD O=$PWD/o \
		%{?with_verbose:V=1}

       for mod in *.ko; do
                mod=$(echo "$mod" | sed -e 's#\.ko##g')
                mv $mod.ko ../$mod-$cfg.ko
        done
done

%else
cd kernel

%{__make}

%endif

%endif

%install
rm -rf $RPM_BUILD_ROOT

%if %{with userspace}
install -d $RPM_BUILD_ROOT%{_bindir}

for file in avdtp/avtest sbc/rcplay sbc/sbcenc sbc/sbcinfo a2play btsco2 btsco ; do
	install $file $RPM_BUILD_ROOT%{_bindir}
done
%endif

%if %{with kernel}
install -d $RPM_BUILD_ROOT/lib/modules/%{_kernel_ver}{,smp}/misc
	%if %{without dist_kernel}
	for mod in *.ko; do
		#nmod=$(echo "$mod" | sed -e 's#-nondist##g')
		pwd
		install kernel/$mod $RPM_BUILD_ROOT/lib/modules/%{_kernel_ver}/misc/$nmod
	done
	%else
	for mod in *-up.ko; do
		nmod=$(echo "$mod" | sed -e 's#-up##g')
		pwd
		install $mod $RPM_BUILD_ROOT/lib/modules/%{_kernel_ver}/misc/$nmod
	done
	%endif

	%if %{with smp}
	for mod in *-smp.ko; do
		nmod=$(echo "$mod" | sed -e 's#-smp##g')
		pwd
		install $mod $RPM_BUILD_ROOT/lib/modules/%{_kernel_ver}smp/misc/$nmod
	done
	%endif
%endif

%clean
rm -rf $RPM_BUILD_ROOT

%post -n kernel-char-btsco
%depmod %{_kernel_ver}
echo "after install this package, remember add lines like this:"
echo "alias snd-card-1 snd-bt-sco"
echo "alias sound-slot-1 snd-bt-sco"
echo "to %{_sysconfdir}/modprobe.conf"

%postun -n kernel-char-btsco
%depmod %{_kernel_ver}

%post -n kernel-smp-char-btsco
%depmod %{_kernel_ver}smp
echo "after install this package, remember add lines like this:"
echo "alias snd-card-1 snd-bt-sco"
echo "alias sound-slot-1 snd-bt-sco"
echo "to %{_sysconfdir}/modprobe.conf"

%postun -n kernel-smp-char-btsco
%depmod %{_kernel_ver}smp

%if %{with userspace}
%files
%defattr(644,root,root,755)
%doc README README.PL.txt
%attr(755,root,root) %{_bindir}/*
%endif

%if %{with kernel}
%files -n kernel-char-btsco
%defattr(644,root,root,755)
/lib/modules/%{_kernel_ver}/misc/snd-bt-sco.ko.gz
%endif

%if %{with smp}
%files -n kernel-smp-char-btsco
%defattr(644,root,root,755)
/lib/modules/%{_kernel_ver}smp/misc/snd-bt-sco.ko.gz
%endif

%define date	%(echo `LC_ALL="C" date +"%a %b %d %Y"`)
%changelog
* %{date} PLD Team <feedback w pld-linux.org>
All persons listed below can be reached at <cvs_login>@pld-linux.org

$Log: btsco.spec,v $
Revision 1.8  2006/04/12 12:15:40  glen
- add kernel epoch, adapterized

Revision 1.7  2006/04/09 09:44:45  aflinta
- fixed smp scripts, release 2

Revision 1.6  2006/04/04 05:24:32  wolvverine
- up to 0.41

Revision 1.5  2006/04/04 00:52:17  wolvverine
- correct log

Revision 1.4  2006/04/04 00:47:52  wolvverine
- patch from Lukasz Masko ed <at> yen <dot> ipipan <dot> waw <dot> pl

Revision 1.3  2005/12/03 10:39:19  qboosh
- revised docs and userspace build
- I don't see any reason for ExclusiveArch

Revision 1.2  2005/12/03 10:04:45  qboosh
- userspace bcond, cosmetics

Revision 1.1  2005/11/28 19:26:46  abram
- initial
- works on i686, but i can not test it on other platforms


Więcej informacji o liście dyskusyjnej pld-devel-pl