Win32Compile Under Fedora
From a Fedora 64-bit install, you have two basic approaches if you want to build VLC from source.
|Cross-compile with Mingw in a virtual machine
using 32-bit Ubuntu.
|Preferred method that works "out of the box".|
|Cross-compile with Mingw under Fedora.||Produces some anomalies and requires some workarounds.|
If you are using Fedora 13, you might want to visit the Win32CompileFedora13 page.
Get the basics
The mingw32 cross-compile tools are available in the default repository.
$ sudo yum install \ mingw32-gcc-c++ \ mingw32-gcc \ mingw32-pthreads \ mingw32-w32api \ mingw32-binutils \ mingw32-runtime \ mingw32-filesystem \ mingw32-cpp \ mingw32-dlfcn-static
You'll also need several other packages for the build process.
sudo yum install \ libtool \ automake \ autoconf \ autopoint \ make \ gettext \ pkg-config \ git \ subversion
Next, change to a directory you will use for building. You must have write access to this directory. Then use git to get the source:
$ git clone git://git.videolan.org/vlc.git
This will give you the VLC trunk. Alternative branches (technically forks) are listed at the VLC Git repository. Scroll down to the
vlc.git line and click on the forks link at the extreme right. This will give you a list of alternatives, which are in the vlc directory. So, for example, to choose the 2.0 fork, the command is:
$ git clone git://git.videolan.org/vlc/vlc-2.0.git
Next, change into the newly installed
vlc-x.x directory. We will refer to this as the
$ cd vlc-* $ export VLCROOT=`pwd`
Prepare 3rd party libraries
Before compiling VLC, you need lots of other libraries. Here is how to get them:
$ mkdir -p contrib/win32 $ cd contrib/win32 $ ../bootstrap --host=i586-mingw32msvc $ make prebuilt $ cd .. $ ln -s i586-mingw32msvc i686-pc-mingw32
i686-pc-mingw32 is the current name of the "host" system for cross-compiling. You can verify that by:
$ rpm -ql mingw32-filesystem|grep -m1 lib|cut -d/ -f3
You also need to set two environment variables for
pkg-config. This is because the current Fedora MinGW
pkg-config is broken, and you need to tell the native one where to find the contribs.
$ export PKG_CONFIG_LIBDIR=../contrib/i686-pc-mingw32/lib/pkgconfig $ export PKG_CONFIG=/usr/bin/pkg-config
Install 32-bit Lua
To get the 32-bit compiled Lua files needed by 32-bit VLC, you need the 32-bit Lua byte compiler. (The 64-bit version produces 64-bit files and does not currently have an option to produce 32-bit files.)
By default, you will already have 64-bit Lua installed, because the Yum/RPM packaging system depends on it. As a result, you will not be able to remove the 64-bit version. Furthermore, Yum will install the 32-bit binary libraries, but it will NOT install the 32-bit binary executables (
luac) over the 64-bit ones. Here is how to work around that.
$ sudo yum install compat-readline5.i686 $ yumdownloader lua.i686 $ sudo yum localinstall ./lua*.rpm
This installs the 32-bit libraries but not the executables. You have to manually extract and install the 32-bit versions.
$ sudo yum install cpio $ rpm2cpio lua*.rpm | cpio -idmv
Now you will have the files from the RPM package as a tree in your local directory. They have the same names and (relative) locations as the 64-bit versions, which is why Yum refused to install them in the first place. So manually install them with the names
luac32 and get rid of your detritus.
$ sudo mv usr/bin/lua /usr/bin/lua32 $ sudo mv usr/bin/luac /usr/bin/luac32 $ rm -rf usr $ rm -f lua*.rpm
Tell the build system where to find the 32-bit versions.
$ export LUA=/usr/bin/lua32 $ export LUAC=/usr/bin/luac32
Install Qt and correct any version mismatch
qt-devel package, which gives you
rcc for both Qt3 and Qt4. The executables for Qt4 are named
rcc, so these need fixing.
$ sudo yum install qt-devel $ sudo ln -s /usr/bin/moc-qt4 /usr/local/bin/moc $ sudo ln -s /usr/bin/uic-qt4 /usr/local/bin/uic
Your version of
moc needs to match the version used in the contribs.
$ moc -v Qt Meta Object Compiler version 63 (Qt 4.8.0) $ grep "define Q_MOC" contrib/win32/i586-mingw32msvc/include/qt4/src/corelib/kernel/qobjectdefs.h #define Q_MOC_OUTPUT_REVISION 62
In this case, the installed
moc has a version of 63 (from Qt 4.8), but the contribs were built with version 62 (from Qt 4.7). To fix this:
$ cd contrib/win32 $ wget http://johnfreed.com/vlc/contrib/moc-`moc -v 2>&1|cut -d' ' -f6`.tar.bz2 $ tar xjvf moc-`moc -v 2>&1|cut -d' ' -f6`.tar.bz2 -C ../
Finally, you need to delete the executables supplied by the contribs.
$ rm -f contrib/i586-mingw32msvc/bin/moc contrib/i586-mingw32msvc/bin/uic contrib/i586-mingw32msvc/bin/rcc
Set the environment variables
You can add the four environment variables mentioned above to your
~/.bash_profile file. This will set them every time you start up a terminal. However, you might not want to override your normal variables. In that case, the following method will work.
- Copy your
~/.bash_profilefile to one called
~/.mingw_profileto add four lines:
export PKG_CONFIG_LIBDIR=../contrib/i686-pc-mingw32/lib/pkgconfig export PKG_CONFIG=/usr/bin/pkg-config export LUA=/usr/bin/lua32 export LUAC=/usr/bin/luac32
Now, to set those variables after you start a terminal:
$ exec bash --rcfile ~/.mingw_profile
Prepare the tree:
$ cd $VLCROOT $ ./bootstrap
The build needs two extra DLLs that Fedora keeps in places it doesn't expect. So create symlinks to solve that:
$ sudo ln -s /usr/i686-pc-mingw32/sys-root/mingw/bin/libgcc_s_sjlj-1.dll /usr/lib64/gcc/i686-pc-mingw32/4.6.1/ $ sudo ln -s /usr/i686-pc-mingw32/sys-root/mingw/bin/libstdc++-6.dll /usr/lib64/gcc/i686-pc-mingw32/4.6.1/
You can verify the destination directory with this command:
$ i686-pc-mingw32-g++ -v /dev/null 2>&1 | grep ^LIBRARY_PATH|cut -d= -f2|cut -d: -f1
Then you can to configure the build with the
./configure script. You will probably want to add the
--enable-dvbpsi option in addition to the standard ones.
$ mkdir win32 && cd win32 $ ../extras/package/win32/configure.sh --enable-dvbpsi --host=i686-pc-mingw32
Alternatively, you can run configure manually. There are a large number of options. See
'../configure --help' for more information.
$ ../configure --enable-dvbpsi --host=i686-pc-mingw32 \ --enable-update-check \ --enable-lua \ --enable-faad \ --enable-flac \ --enable-theora \ --enable-twolame \ --enable-quicktime \ --enable-avcodec --enable-merge-ffmpeg \ --enable-dca \ --enable-mpc \ --enable-libass \ --enable-x264 \ --enable-schroedinger \ --enable-realrtsp \ --enable-live555 \ --enable-dvdread \ --enable-shout \ --enable-goom \ --enable-caca \ --disable-portaudio \ --disable-sdl \ --enable-qt4 \ --enable-skins2 \ --enable-sse --enable-mmx \ --enable-libcddb \ --enable-zvbi --disable-telx \ --enable-sqlite \ --disable-dirac
Once configured, to build VLC, just run:
Once the compilation is done, you can build self-contained VLC packages.
Depending on what type of package you want, you may also need the zip, 7zip, or nsis tools. All three sets are needed for the
make package-win target.
$ sudo yum install \ zip \ p7zip \ mingw32-nsiswrapper mingw32-nsis
Use the following
||Creates a subdirectory named |
||Same as |
||Same as |
||Same as |
||Creates the web plugin.|
||Creates all of the above.|
||Same as |
Well done—you're ready to use VLC!