X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=doc%2Farm-crosscompile-howto.sgml;h=81a44d805a0d56d367798c12af5f1cf2303c9bfc;hb=7686840e5c2b384eab661455a5e532a97c669e96;hp=8c2b8f89b00fd912e4c37612d1a593b266339fdf;hpb=d06ab64d1cf157a2fc4225817e503b1ab2bb7da1;p=vlc diff --git a/doc/arm-crosscompile-howto.sgml b/doc/arm-crosscompile-howto.sgml index 8c2b8f89b0..81a44d805a 100644 --- a/doc/arm-crosscompile-howto.sgml +++ b/doc/arm-crosscompile-howto.sgml @@ -3,7 +3,8 @@ Cross compiling VLC for ARM-Linux based platforms Marc Ariberti - v0.0.1, 13 march 2003 + Jean-Paul Saman + v0.0.2, 19 march 2004 This document describes all the steps to cross compile vlc for ARM based platforms. It describes how to build a cross compilation toolchain, how to @@ -15,15 +16,20 @@ Introduction +

+ This document is only a first draft. It does not intend to cover all the + subject. You may still have some problems at some steps or find better + way to do them. If you have any comment do not hesitate to contact us. +

Which platforms are targeted ?

I will describe here how to compile vlc for an ARM based PDA running linux. It includes for example : - Compaq - iPaq (H36xx, H38xx,...), using + Compaq - iPaq (H36xx, H38xx,...), using Familiar Linux - Familiar linux + GNU Portable Environment (GPE) Opie @@ -58,25 +64,52 @@ Prerequisite - + Importants paths

- During this section, we will use the following variables : - - ${PREFIX} will designate where you want to install - your toolchain (eg: /usr/local/arm/2.95.3). - ${SRCDIR} will designate the directory where - sources will be uncompressed - (eg: /usr/src or /home/foobar/cross-arm). - + During this section, we will use the following paths :

+

I would personally advise to compile everything as a normal user and + then install everything as root.

+ + ${SRCDIR} +

+ This is where the sources will be located and where the compilation + will be done. + (eg: /usr/src or /home/foobar/arm-src). +

+
+ + ${PREFIX} +

This is where you want to install your cross compilation toolchain. + It can be either installed system-wide (in /usr/local/arm/2.95.3 for example). Installation steps (i.e. make install) will have + to be done as root. + Or it can be installed in user-land, for the user's own use (/home/foobar/arm/2.95.3 for example). + In this paper, the chosen prefix is /usr/local/arm/2.95.3, + you will have to adapt the commands to what you choose.. +

+
Files needed -

Download the following files and put them in the ${SRCDIR} : +

Download the following files and put them in the ${SRCDIR}. + Most of them are available on the . binutils-2.11.2.tar.gz linux-2.4.19.tar.bz2 patch-2.4.19-rmk4.bz2 + gcc-2.95.3.tar.gz + gcc-2.95.3.diff.bz2 + gcc-2.95.3.diffbis.bz2 + gcc-2.95.3.diff2 + glibc-2.2.5.tar.gz + glibc-linuxthreads-2.2.5.tar.gz + SDL-1.2.5.tar.gz + glib-1.2.10.tar.gz + ffmpeg.tar.gz + mad-0.14.2b.tar.gz + flac-1.1.0.tar.gz + libdvbpsi-0.1.2.tar.gz + a52dec-0.7.4.tar.gz

@@ -85,12 +118,11 @@ Binutils

Compiling binutils is pretty simple : -% tar xzf binutils-2.11.2.tar.gz -% cd binutils-2.11.2 -% ./configure --target=arm-linux --prefix=/usr/local/arm/2.95.3 -% make -% su -# make install +tar -xzf binutils-2.11.2.tar.gz +cd binutils-2.11.2 +./configure --target=arm-linux --prefix=/usr/local/arm/2.95.3 +make +make install

@@ -98,35 +130,41 @@ Preparing linux kernel

- % tar xzf linux-2.4.19.tar.bz2 - % bunzip2 patch-2.4.19-rmk4.bz2 - % cd linux-2.4.19 - % patch -p1 < ../patch-2.4.19-rmk4.bz2 - % make clean ARCH=arm CROSS_COMPILE=arm-linux- - % make ARCH=arm h3600_config - !!! don't forget to save the configuration even if no changes are made - % make ARCH=arm menuconfig - % make symlinks ARCH=arm CROSS_COMPILE=arm-linux- - % mkdir -p /usr/local/arm/2.95.3/arm-linux/include - % cp -Rf include/asm include/asm-arm include/linux /usr/local/arm/2.95.3/arm-linux/include - % cd /usr/local/arm/2.95.3/arm-linux - % ln -s include sys-linux - +tar -xzf linux-2.4.19.tar.bz2 +bunzip2 patch-2.4.19-rmk4.bz2 +cd linux-2.4.19 +patch -p1 < ../patch-2.4.19-rmk4.bz2 +make clean ARCH=arm CROSS_COMPILE=arm-linux- +make ARCH=arm h3600_config + + Do not forget to save the configuration even if no changes + are made ! + +make ARCH=arm menuconfig +make symlinks ARCH=arm CROSS_COMPILE=arm-linux- +mkdir -p /usr/local/arm/2.95.3/arm-linux/include +cp -Rf include/asm include/asm-arm include/linux \ + /usr/local/arm/2.95.3/arm-linux/include +cd /usr/local/arm/2.95.3/arm-linux +ln -s include sys-linux

Basic cross compiler (gcc)

- tar xvzf gcc-2.95.3.tar.gz - bunzip2 gcc-2.95.3.diff.bz2 - bunzip2 gcc-2.95.3.diffbis.bz2 - patch -p1 -d gcc-2.95.3 < gcc-2.95.3.diff - patch -p1 -d gcc-2.95.3 < gcc-2.95.3.diffbis - cd gcc-2.95.3 - ./configure --target=arm-linux --disable-threads --enable-languages=c --prefix=/usr/local/arm/2.95.3 --with-headers=linux-2.4.19/include - make - make install + +tar -xvzf gcc-2.95.3.tar.gz +bunzip2 gcc-2.95.3.diff.bz2 +bunzip2 gcc-2.95.3.diffbis.bz2 +patch -p1 -d gcc-2.95.3 < gcc-2.95.3.diff +patch -p1 -d gcc-2.95.3 < gcc-2.95.3.diffbis +cd gcc-2.95.3 +./configure --target=arm-linux --disable-threads --enable-languages=c \ + --prefix=/usr/local/arm/2.95.3 --with-headers=linux-2.4.19/include +make +make install +

@@ -134,177 +172,341 @@ Compiling glibc

Depending on your target, you may choose another glibc version (eg: 2.1.3 for linupy 1.4) - tar xvzf glibc-2.2.5.tar.gz - cd glibc-2.2.5 - tar xvzf ../glibc-linuxthreads-2.2.5.tar.gz - CC=arm-linux-gcc ./configure arm-linux --target=arm-linux --prefix=/usr/local/arm/2.95.3/arm-linux --enable-add-ons - - The following step is quite long ! - - CC=arm-linux-gcc make + +tar -xvzf glibc-2.2.5.tar.gz +cd glibc-2.2.5 +tar -xvzf ../glibc-linuxthreads-2.2.5.tar.gz +CC=arm-linux-gcc ./configure arm-linux --target=arm-linux \ + --prefix=/usr/local/arm/2.95.3/arm-linux --enable-add-ons + - If you have problems compiling glibc due to pread/pwrite, edit sysdeps/unix/sysv/linux/kernel-features.h - and turn __ASSUME_PREAD_SYSCALL and __ASSUME_PWRITE_SYSCALL from 1 to 0. - - CC=arm-linux-gcc make install +The following step is quite long ! + + +CC=arm-linux-gcc make + + +If you have problems compiling glibc due to pread/pwrite, edit sysdeps/unix/sysv/linux/kernel-features.h +and turn __ASSUME_PREAD_SYSCALL and +__ASSUME_PWRITE_SYSCALL from 1 to 0. + + +CC=arm-linux-gcc make install +

Full cross compiler (gcc) - rm -Rf gcc-2.95.3 - tar xvzf gcc-2.95.3.tar.gz - patch -p1 -d gcc-2.95.3 < gcc-2.95.3.diff - patch -p1 -d gcc-2.95.3 < gcc-2.95.3.diff2 - cd gcc-2.95.3 - ./configure --target=arm-linux --prefix=/usr/local/arm/2.95.3 - make - make install +

+ +rm -Rf gcc-2.95.3 +tar -xvzf gcc-2.95.3.tar.gz +patch -p1 -d gcc-2.95.3 < gcc-2.95.3.diff +patch -p1 -d gcc-2.95.3 < gcc-2.95.3.diff2 +cd gcc-2.95.3 +./configure --target=arm-linux --prefix=/usr/local/arm/2.95.3 +make +make install + +

+
+ + Compiling linux kernel Misc - Add /usr/local/arm/2.95.3/bin to your PATH. Add the following line (depends on your shell) +

+ Add /usr/local/arm/2.95.3/bin to your PATH. Add the following line (depends on your shell) to your shell's configuration file : - export PATH=/usr/local/arm/2.95.3/bin:$PATH + +export PATH=/usr/local/arm/2.95.3/bin:$PATH + + I would advise you to completely log out and then log in again, so that + the change would be taken into account. You can now check that when you + type arm-linux-gcc, it launches the cross-compiler. +

- cp libgcc_s.so.1 /usr/local/arm/2.95.3-new/arm-linux/lib +

+ Next are some packages that you may compile by yourself, but I found + it was easier to use the precompiled packages. You can take them + at . + You may find packages with other version numbers which should not be + a problem. + + libgcc1_3.1.1-1_arm.ipk + This provides libgcc.so.1 which is needed to compile some libraries. + xlibs_4.1-5_arm.ipk, xlibs-dev_4.1.0-16_arm.ipk + Those are the libraries ans the development files for X windows. + zlib1g_1.1.4-3_arm.ipk, zlib1g-dev_1.1.3-fam1_arm.ipk + These libraries are needed by some libraries to compile. + - Install theses packages on your compiler box in /usr/local/arm/2.95.3/arm-linux - xlibs_4.1-5_arm.ipk - xlibs-dev_4.1.0-16_arm.ipk - zlib1g_1.1.4-3_arm.ipk - zlib1g-dev_1.1.3-fam1_arm.ipk + Install these packages on your compiler box in /usr/local/arm/2.95.3/arm-linux : + You can use the script install.sh : + +#!/bin/sh +# script to install .ipk into the arm-toolchain +# usage : ./install.sh foobar.ipk + +if ! tar -xvzf $1 2> /dev/null +then + ar xv $1 2> /dev/null +fi +cp data.tar.gz /usr/local/arm/2.95.3/arm-linux +cd /usr/local/arm/2.95.3/arm-linux +tar -xvzf data.tar.gz + +

+ + Setting up Opie cross-compile environment +

Download the Opie SDK from the website +using the menuitem "Download Opie SDK" or try the direct link here: . +Download all files to your ${SOURCES}/opie directory. +

+ + Opie SDK +

The Opie SDK does not come with a README file or installation instructions. +I give them here instead. There are two tar files in the download a OpieSDK.tar.gz2 and a kdevelop_src.tar.bz2. +The last file is a modified kdevelop for use with the OpieSDK. In this tutorial we will not use that. +Unpack OpieSDK.tar.bz2 in your sources cd ${SOURCES}/opie directory. + +cd ${SOURCES}/opie +tar -xjvf OpieSdk.tar.bz2 + + It creates a directories structure ${SOURCES}/opie/opt/OpieSDK. Inside that directory a script is present to +start_kdevelop. Modify this script so that it uses the correct paths for you setup. + +#!/bin/sh +source ${SOURCES}/opie/opt/OpieSdk/dev_env +export KDEDIR=${SOURCES}/opie/opt/OpieSdk/kde +export PATH=${SOURCES}/opie/opt/OpieSdk/kde/bin:$PATH +kbuildsycoca +kdevelop + + Save the script. Do the same with the script arm_source + +source ${SOURCES}/opie/opt/OpieSdk/dev_env +export QTDIR=$QTDIR_ARM +export OPIEDIR=$OPIEDIR_ARM + + Save the script and modify the script host_source in the same manner as above. + +source ${SOURCES}/opie/opt/OpieSdk/dev_env +export QTDIR=$QTDIR_NAT +export OPIEDIR=$OPIEDIR_NAT + + Save the script and modify the script dev_env in the same manner as above. + +export PYTHONPATH=${SOURCES}/opie/opt/OpieSdk/python/opie:${SOURCES}/opie/opt/OpieSdk/python/sip +export PATH=/usr/local/arm/2.95.3/bin:/opt/OpieSdk/host_tools:${SOURCES}/opie/opt/OpieSdk/opie/x86/qt-2.3.7/bin:$PATH +export PATH=${SOURCES}/opie/opt/OpieSdk/opie/x86/qmake:$PATH +export QTDIR_NAT=${SOURCES}/opie/opt/OpieSdk/opie/x86/qt-2.3.7 +export OPIEDIR_NAT=${SOURCES}/opie/opt/OpieSdk/opie/x86/sdk +export QTDIR_ARM=${SOURCES}/opie/opt/OpieSdk/opie/arm/qt-2.3.7 +export OPIEDIR_ARM=${SOURCES}/opie/opt/OpieSdk/opie/arm/sdk +export OPIE_SDK_BASE=${SOURCES}/opie/opt/OpieSdk/ +export OPIE_SDK_QMAKE_BASE=${SOURCES}/opie/opt/OpieSdk/opie/x86/sdk/mkspecs/qws/ +export OPIE_DOC=${SOURCES}/opie/opt/OpieSdk/apidocs - +export LD_LIBRARY_PATH=${SOURCES}/opie/opt/OpieSdk/sip/lib:$OPIEDIR_NAT/lib:$QTDIR_NAT/lib:$LD_LIBRARY_PATH +export OPIE_LANGUAGES=de:en:cz:da:dk:es:fr:hu:it:ja:ko:lv:mk:nl:no:pl:pt:pt_BR:ru:sl:zh_CN:zh_TW + + The symbolic linke to the tool qmake points now to the wrong place. We need to fix this symbolic link. +Here is the way to do that. + +cd host_tools +ln -sf /home/jpsaman/src/opie/opt/OpieSdk/opie/x86/sdk/qmake/qmake qmake +cd ../ + + Now it is time to fire up our development environment and start hacking in Opie. +

+
+
Cross compiling libraries needed by vlc +

Download ipaq-config.site to ${SOURCES}. When downloading source tarballs copy them to your ${SOURCES} directory. Each section is supposed to begin with cd ${SOURCES}. +

SDL - !!!! beurk but did not found a better working method ¡¡¡¡ - tar xvzf SDL-1.2.5.tar.gz - cd SDL-1.2.5 +

+ It is not clean at all but did not found a better working method. + Using config.site + it compiles well, but when linking with vlc there are problems ! +

+

+ /usr/local/arm/2.95.3/arm-linux/bin should contain the cross + compiler without the prefix arm-linux-. + + +tar -xvzf SDL-1.2.5.tar.gz +cd SDL-1.2.5 ./configure --enable-release --target=arm-linux --host=arm-linux \ - --disable-esd \ - --prefix=/usr/local/arm/2.95.3/arm-linux/usr \ - --x-includes=/usr/local/arm/2.95.3/arm-linux/usr/X11R6/include \ - --x-libraries=/usr/local/arm/2.95.3/arm-linux/usr/X11R6/lib \ - --disable-video-opengl + --disable-esd \ + --prefix=/usr/local/arm/2.95.3/arm-linux/usr \ + --x-includes=/usr/local/arm/2.95.3/arm-linux/usr/X11R6/include \ + --x-libraries=/usr/local/arm/2.95.3/arm-linux/usr/X11R6/lib \ + --disable-video-opengl + export PATH=/usr/local/arm/2.95.3/arm-linux/bin:$PATH - make && make install - + +

Glib/GTK+ - tar xvzf glib-1.2.10.tar.gz - cd glib-1.2.10 - CONFIG_SITE=../ipaq-config.site ./configure --prefix=/usr/local/arm/2.95.3/arm-linux/usr - make - make install - cd .. - tar xvzf gtk+-1.2.10.tar.gz - cd gtk+-1.2.10 - CONFIG_SITE=../ipaq-config.site ./configure --prefix=/usr/local/arm/2.95.3/arm-linux/usr --with-glib=../glib-1.2.10 - make - make install +

+ +tar -xvzf glib-1.2.10.tar.gz +cd glib-1.2.10 +CONFIG_SITE=../ipaq-config.site ./configure \ + --prefix=/usr/local/arm/2.95.3/arm-linux/usr +make +make install +cd .. +tar -xvzf gtk+-1.2.10.tar.gz +cd gtk+-1.2.10 +CONFIG_SITE=../ipaq-config.site ./configure \ + --prefix=/usr/local/arm/2.95.3/arm-linux/usr --with-glib=../glib-1.2.10 +make +make install + +

ffmpeg - tar xvzf ffmpeg.tar.gz - cd ffmpeg - ./configure --cpu=armv4l --cc=arm-linux-gcc --disable-mmx --prefix=/usr/local/arm/2.95.3/arm-linux/usr --enable-shared - cd libavcodec - make +

+ +tar -xvzf ffmpeg.tar.gz +cd ffmpeg +./configure --cpu=armv4l --cc=arm-linux-gcc --disable-mmx \ + --prefix=/usr/local/arm/2.95.3/arm-linux/usr --enable-shared +cd libavcodec +make + Vlc does not require that you install ffmpeg. +

mad - tar xvzf mad-0.14.2b.tar.gz - cd mad-0.14.2b +

+ +tar -xvzf mad-0.14.2b.tar.gz +cd mad-0.14.2b ./configure --enable-release --target=arm-linux --host=arm-linux \ - --disable-esd \ - --prefix=/usr/local/arm/2.95.3/arm-linux/usr \ - --x-includes=/usr/local/arm/2.95.3/arm-linux/usr/X11R6/include \ - --x-libraries=/usr/local/arm/2.95.3/arm-linux/usr/X11R6/lib \ - --disable-video-opengl + --disable-esd \ + --prefix=/usr/local/arm/2.95.3/arm-linux/usr \ + --x-includes=/usr/local/arm/2.95.3/arm-linux/usr/X11R6/include \ + --x-libraries=/usr/local/arm/2.95.3/arm-linux/usr/X11R6/lib \ + --disable-video-opengl export PATH=/usr/local/arm/2.95.3/arm-linux/bin:$PATH - make - +make + +

gpe - %%%%%%%%%%%%%%%%%%%%%%% - First get Tremor and ogg sources from xiph.org (through CVS for example). -Then for each them, do : -% ./configure --enable-release --prefix=/usr/local/arm/2.95.3/arm-linux -% export PATH=/usr/local/arm/2.95.3/arm-linux/bin:$PATH -% make -% su -# make install - -I know it is not clean, but --host or --target switches does not work. -The PATH I include, contains all the gcc utils for cross compilation -without the arm-linux- prefix. - -If you want to link them statically : edit the libvorbisidec.a and remove -from the archive bitwise.o and framing.o (conflict with libogg.a) - -For flac, get the source tarball (from the videolan website for example) -% ./configure --enable-release --host=arm-linux --target=arm-linux ---prefix=/usr/local/arm/2.95.3/arm-linux -% make --> will fail (xmms plugin), but not a problem, continue installation by hand -% su -# cp -Rf include/FLAC /usr/local/arm/2.95.3/arm-linux/include -# cd src/libFLAC -# make install - -When compiling vlc, add to the ./configure : - --enable-ogg - --enable-tremor - --enable-flac -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% tremor +

+ Tremor is an integer decoder for the vorbis audio codec. Download the + source through CVS at the website. +

+

+ Log into CVS using the password : anoncvs. + +cvs -d :pserver:anoncvs@xiph.org:/usr/local/cvsroot login +cvs -d :pserver:anoncvs@xiph.org:/usr/local/cvsroot co Tremor +cd Tremor +CONFIG_SITE=../ipaq-config.site ./configure \ + --prefix=/usr/local/arm/2.95.3/arm-linux/usr +make + +

ogg +

+ For ogg, it is the same as Tremor. + +cvs -d :pserver:anoncvs@xiph.org:/usr/local/cvsroot login +cvs -d :pserver:anoncvs@xiph.org:/usr/local/cvsroot co ogg +cd ogg +CONFIG_SITE=../ipaq-config.site ./configure \ + --prefix=/usr/local/arm/2.95.3/arm-linux/usr +make + +

flac +

+ +tar -xvzf flac-1.1.0.tar.gz +cd flac-1.1.0 +./configure --enable-release --host=arm-linux --target=arm-linux \ + --prefix=/usr/local/arm/2.95.3/arm-linux/usr + + It will probably fail (due to the xmms plugin), but it is not a problem, + we will continue installation by hand. + +cp -Rf include/FLAC /usr/local/arm/2.95.3/arm-linux/include +cd src/libFLAC +make install + +

libdvbpsi - tar xvzf libdvbpsi-0.1.2.tar.gz - cd libdvbpsi-0.1.2 - ./bootstrap - ./configure --target=arm-linux --host=arm-linux - make - +

+ +tar -xvzf libdvbpsi-0.1.2.tar.gz +cd libdvbpsi-0.1.2 +./bootstrap +./configure --target=arm-linux --host=arm-linux +make + +

a52 - tar xvzf a52dec-0.7.4.tar.gz - cd a52dec-0.7.4 - ./configure --enable-release --host=arm-linux --target=arm-linux --prefix=/usr/local/arm/2.95.3/arm-linux - make && make install - +

+ +tar -xvzf a52dec-0.7.4.tar.gz +cd a52dec-0.7.4 +./configure --enable-release --host=arm-linux --target=arm-linux \ + --prefix=/usr/local/arm/2.95.3/arm-linux/usr +make && make install + +

Cross compiling vlc itself - have a look à rules.* in the ipkg directory. +

+ First of all, run the ./bootstrap script. + Then run one of the ipkg/rules.*, according to what you want to compile. + Finally you just have to type make and you'll get a stand alone vlc. +

+

+ Run arm-linux-strip to remove symbols and so the size of the file, + and now you can test it easily on your PDA. +

+

+ Enjoy ! +

+