From 6c25ce3fef1029f62a6fd43c66618379a9192f14 Mon Sep 17 00:00:00 2001 From: Kern Sibbald Date: Tue, 25 Apr 2006 13:42:16 +0000 Subject: [PATCH] Get pthreads built and build bacula-fd.exe git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@2965 91ce42f0-d328-0410-95d8-f526ca767f89 --- bacula/src/win32/.cvsignore | 1 + bacula/src/win32/Makefile.in | 10 +- bacula/src/win32/build-win32-cross-tools | 457 +++++++++++++++++++++++ 3 files changed, 466 insertions(+), 2 deletions(-) create mode 100755 bacula/src/win32/build-win32-cross-tools diff --git a/bacula/src/win32/.cvsignore b/bacula/src/win32/.cvsignore index e528f4bfeb..4184a0b8fe 100644 --- a/bacula/src/win32/.cvsignore +++ b/bacula/src/win32/.cvsignore @@ -1,3 +1,4 @@ +pthreadGCE.dll winres.res Makefile.vcpp install diff --git a/bacula/src/win32/Makefile.in b/bacula/src/win32/Makefile.in index be614a0965..58b1238bf9 100644 --- a/bacula/src/win32/Makefile.in +++ b/bacula/src/win32/Makefile.in @@ -23,7 +23,7 @@ INCLUDE_ICONS = -I ../filed/win32 INCLUDE_OPENSSL = -I$(CROSSTOOLS)/openssl/include LIB_MINGW = $(MINGW)/mingw32/lib -LIB_PTHREADS = $(DEPKGS)/pthreads/libpthreadGCE.a +LIB_PTHREADS = $(DEPKGS)/pthreads/pthreadGCE.dll #LIB_ZLIB = $(DEPKGS)/libz.a #LIB_SSL = $(DEPKGS)/openssl/libssl.a #LIB_CRYPTO = $(DEPKGS)/openssl/libcrypto.a @@ -177,7 +177,7 @@ wintray.o: ../filed/win32/wintray.cpp $(CXX) -c ../filed/win32/wintray.cpp -o $(OBJDIR)/wintray.o winres.res: ../filed/win32/winres.rc - $(WINDRES) $(INCLUDE_ICONS) -o coff ../filed/win32/winres.rc -o $(OBJDIR)/winres.res + $(WINDRES) $(INCLUDE_ICONS) -O coff ../filed/win32/winres.rc -o $(OBJDIR)/winres.res # $(WINDRES) --help # mingw32-nm winres.res @@ -249,6 +249,7 @@ LIB_OBJS = \ $(OBJDIR)/btimers.o \ $(OBJDIR)/cram-md5.o \ $(OBJDIR)/crc32.o \ + $(OBJDIR)/crypto.o \ $(OBJDIR)/daemon.o \ $(OBJDIR)/dlist.o \ $(OBJDIR)/edit.o \ @@ -353,6 +354,9 @@ cram-md5.o: ../lib/cram-md5.c crc32.o: ../lib/crc32.c $(CXX) -c ../lib/crc32.c -o $(OBJDIR)/crc32.o +crypto.o: ../lib/crypto.c + $(CXX) -c ../lib/crypto.c -o $(OBJDIR)/crypto.o + daemon.o: ../lib/daemon.c $(CXX) -c ../lib/daemon.c -o $(OBJDIR)/daemon.o @@ -449,10 +453,12 @@ all: bacula-fd.exe clean: rm -f $(OBJDIR)/*.o $(OBJDIR)/bacula-fd.exe $(OBJDIR)/winres.res + rm -f pthreadGCE.dll # Link the executable ... bacula-fd.exe: $(OBJS) $(CXX) $(OBJS) $(LIBS) -o $(OBJDIR)/bacula-fd.exe + cp -f $(DEPKGS)/pthreads/pthreadGCE.dll . # TODO ... # Fix vss files: check for consistent levels of pointer indirection diff --git a/bacula/src/win32/build-win32-cross-tools b/bacula/src/win32/build-win32-cross-tools new file mode 100755 index 0000000000..f95aa35e15 --- /dev/null +++ b/bacula/src/win32/build-win32-cross-tools @@ -0,0 +1,457 @@ +#!/bin/sh + +# This is my script for building a complete MinGW cross-compiler toolchain +# that runs under Linux to produce executables that run under Windows. It +# probably works (or can easily be adapted to work) under any unix system. +# +# It is based in large part on Sam Lantinga's script, which in turn was +# based partly on Ray Kelm's script, which in turn was built on +# Mo Dejong's script for doing the same, but with some added fixes. +# +# My changes: +# 1. Adapted the script to the new packaging of MinGW GCC, which is +# currently split into core and auxiliary components. +# 2. The script now determines the GCC and BINUTILS directory name +# directly from the tar file contents. This gets around common +# problems due to the directory names not always following the +# expected patterns. +# 3. Grouped together and simplified the macros that users need to +# define. +# 4. Made optional components truly optional -- leave the +# corresponding archive names blank and they will be ignored. +# 5. Included an option to purge the installation directory before +# installing the current cross-compiler. +# +# NOTE: If you choose a destination directory for the installation (set +# in the macro PREFIX) for which you do not have write access, you will +# need to run this script with root (or equivalent) privileges. +# +# +# Updated by Igor Mikolic-Torreira + + + +#----------------------------------------------------- +# +# BEGIN USER SETTINGS +# +# You need to review and adjust the macros that follow +# +#----------------------------------------------------- + + +# What flavor of GCC cross-compiler are we building? + +TARGET=mingw32 + +# What directory will the cross-compiler be built in? +# This is the directory into which source archives will +# be downloaded, expanded, compiled, etc. You need to +# have write-access to this directory. If you leave it +# blank, it defaults to the current directory. + +#BUILDDIR=/data/cross-tools-4.1.0 +BUILDDIR=../../../mingw +cwd=`pwd` +cd ${BUILDDIR} +# Now make builddir absolute +BUILDDIR=`pwd` +cd ${cwd} + +mkdir -p ${BUILDDIR} +mkdir -p ${BUILDDIR}/${TARGET} + +# Where does the cross-compiler go? +# This should be the directory into which your cross-compiler +# will be installed. Remember that if you set this to a directory +# that only root has write access to, you will need to run this +# script as root. + +PREFIX=${BUILDDIR}/mingw32 + +# Purge anything and everything already in the $PREFIX +#(also known as the destination or installation) directory? +# Set to "Y" to purge, any other value omits the purge step. + +PURGE_DIR="Y" + + +# Set the following to the files from the current MinGW release +# (or whichever MinGW release you wish to build and install) +# You need to set both the URL they will be downloaded from +# and the exact name of the individual component files. + +MINGW_URL="http://heanet.dl.sourceforge.net/sourceforge/mingw" + +# GCC_CORE is required; the other components are optional. +# Set any you don't want to "". You need binutils, +# mingw runtime and w32api; do not ever set those to "". + +GCC_CORE_ARCHIVE="gcc-core-3.4.5-20060117-1-src.tar.gz" +GCC_GPP_ARCHIVE="gcc-g++-3.4.5-20060117-1-src.tar.gz" +GCC_G77_ARCHIVE="" +GCC_OBJC_ARCHIVE="" +GCC_JAVA_ARCHIVE="" +GCC_ADA_ARCHIVE="" +GCC_PATCH="" + +# GCC_G77_ARCHIVE="gcc-g77-3.4.2-20040916-1-src.tar.gz" +# GCC_OBJC_ARCHIVE="gcc-objc-3.4.2-20040916-1-src.tar.gz" +# GCC_JAVA_ARCHIVE="gcc-java-3.4.2-20040916-1-src.tar.gz" + +BINUTILS_ARCHIVE="binutils-2.16.91-20060119-1-src.tar.gz" + +MINGW_ARCHIVE="mingw-runtime-3.9.tar.gz" + +W32API_ARCHIVE="w32api-3.7.tar.gz" + + +# These are the files from the SDL website +# These are optional, set them to "" if you don't want them) + +SDL_URL="http://www.libsdl.org/extras/win32/common" + +OPENGL_ARCHIVE="opengl-devel.tar.gz" +DIRECTX_ARCHIVE="directx-devel.tar.gz" + + + +#----------------------------------------------------- +# +# END USER SETTINGS +# +# The remainder of the script should not neet any edits +# +#----------------------------------------------------- + + + +# Make sure these are initialized as we want them + +GCC_CORE="" +BINUTILS="" +GCC_LANGS="c" + + +# Set our build directory and where our sources will go + +if [ "x$BUILDDIR" = "x" ]; then + # Default to the current directory + BUILDDIR=$(pwd) +fi +SRCDIR="$BUILDDIR/source" + + +# Need install directory first on the path so gcc can find binutils + +PATH="$PREFIX/bin:$PATH" + + + +#----------------------------------------------------- +# +# Functions that do most of the work +# +#----------------------------------------------------- + + +function download_files +{ + # Download a file from a given url, only if it is not present + mkdir -p "$SRCDIR" + + # Make sure wget is installed + if test "x`which wget`" = "x" ; then + echo "You need to install wget." + exit 1 + fi + download_file "$GCC_CORE_ARCHIVE" "$MINGW_URL" + if [ "x$GCC_GPP_ARCHIVE" != "x" ]; then + download_file "$GCC_GPP_ARCHIVE" "$MINGW_URL" + fi + if [ "x$GCC_G77_ARCHIVE" != "x" ]; then + download_file "$GCC_G77_ARCHIVE" "$MINGW_URL" + fi + if [ "x$GCC_OBJC_ARCHIVE" != "x" ]; then + download_file "$GCC_OBJC_ARCHIVE" "$MINGW_URL" + fi + if [ "x$GCC_JAVA_ARCHIVE" != "x" ]; then + download_file "$GCC_JAVA_ARCHIVE" "$MINGW_URL" + fi + if [ "x$GCC_ADA_ARCHIVE" != "x" ]; then + download_file "$GCC_ADA_ARCHIVE" "$MINGW_URL" + fi + + download_file "$BINUTILS_ARCHIVE" "$MINGW_URL" + download_file "$MINGW_ARCHIVE" "$MINGW_URL" + download_file "$W32API_ARCHIVE" "$MINGW_URL" + + if [ "x$OPENGL_ARCHIVE" != "x" ]; then + download_file "$OPENGL_ARCHIVE" "$SDL_URL" + fi + if [ "x$DIRECTX_ARCHIVE" != "x" ]; then + download_file "$DIRECTX_ARCHIVE" "$SDL_URL" + fi +} + + +function download_file +{ + cd "$SRCDIR" + if test ! -f $1 ; then + echo "Downloading $1" + wget "$2/$1" + if test ! -f $1 ; then + echo "Could not download $1" + exit 1 + fi + else + echo "Found $1 in the srcdir $SRCDIR" + fi + cd "$BUILDDIR" +} + + +function purge_existing_install +{ + echo "Purging the existing files in $PREFIX" + if cd "$PREFIX"; then + rm -rf * + fi + cd "$BUILDDIR" +} + + +function install_libs +{ + echo "Installing cross libs and includes" + mkdir -p "$PREFIX/$TARGET" + cd "$PREFIX/$TARGET" + + tar -xzf "$SRCDIR/$MINGW_ARCHIVE" + tar -xzf "$SRCDIR/$W32API_ARCHIVE" + + if [ "x$OPENGL_ARCHIVE" != "x" ]; then + tar -xzf "$SRCDIR/$OPENGL_ARCHIVE" + fi + + if [ "x$DIRECTX_ARCHIVE" != "x" ]; then + tar -xzf "$SRCDIR/$DIRECTX_ARCHIVE" + fi + + cd "$BUILDDIR" +} + + +function extract_binutils +{ + cd "$SRCDIR" + BINUTILS=`tar -tzf "$SRCDIR/$BINUTILS_ARCHIVE" | head -n 1` + if [ "x${BINUTILS}" != "x./" ]; then + rm -rf "$BINUTILS" + fi + echo "Extracting binutils" + tar -xzf "$SRCDIR/$BINUTILS_ARCHIVE" + cd "$BUILDDIR" +} + + +function configure_binutils +{ + cd "$BUILDDIR" + rm -rf "binutils-$TARGET" + mkdir "binutils-$TARGET" + cd "binutils-$TARGET" + echo "Configuring binutils" + "$SRCDIR/$BINUTILS/configure" --prefix="$PREFIX" --target=$TARGET --disable-nls \ + --with-gcc --with-gnu-as --with-gnu-ld --disable-shared &> configure.log + cd "$BUILDDIR" +} + + +function build_binutils +{ + cd "$BUILDDIR/binutils-$TARGET" + echo "Building binutils" + make CFLAGS="-O2 -fno-exceptions" LDFLAGS="-s" &> make.log + if test $? -ne 0; then + echo "make of binutils failed - log available: binutils-$TARGET/make.log" + exit 1 + fi + cd "$BUILDDIR" +} + + +function install_binutils +{ + cd "$BUILDDIR/binutils-$TARGET" + echo "Installing binutils" + make install &> make-install.log + if test $? -ne 0; then + echo "install of binutils failed - log available: binutils-$TARGET/make-install.log" + exit 1 + fi + cd "$BUILDDIR" +} + + +function extract_gcc +{ + cd "$SRCDIR" + GCC=`tar -tzf "$SRCDIR/$GCC_CORE_ARCHIVE" | head -n 1` +# rm -rf "$GCC" + echo "====== GCC ${GCC} =========" + echo "Extracting gcc" + tar -xzf "$SRCDIR/$GCC_CORE_ARCHIVE" + if [ "x$GCC_GPP_ARCHIVE" != "x" ]; then + GCC_LANGS=${GCC_LANGS}",c++" + tar -xzf "$SRCDIR/$GCC_GPP_ARCHIVE" + fi + if [ "x$GCC_G77_ARCHIVE" != "x" ]; then + GCC_LANGS=${GCC_LANGS}",f77" + tar -xzf "$SRCDIR/$GCC_G77_ARCHIVE" + fi + if [ "x$GCC_OBJC_ARCHIVE" != "x" ]; then + GCC_LANGS=${GCC_LANGS}",objc" + tar -xzf "$SRCDIR/$GCC_OBJC_ARCHIVE" + fi + if [ "x$GCC_JAVA_ARCHIVE" != "x" ]; then + GCC_LANGS=${GCC_LANGS}",java" + tar -xzf "$SRCDIR/$GCC_JAVA_ARCHIVE" + fi + if [ "x$GCC_ADA_ARCHIVE" != "x" ]; then + GCC_LANGS=${GCC_LANGS}",ada" + tar -xzf "$SRCDIR/$GCC_ADA_ARCHIVE" + fi + cd "$BUILDDIR" +} + + +function patch_gcc +{ + if [ "$GCC_PATCH" != "" ]; then + echo "Patching gcc" + cd "$SRCDIR/$GCC" + patch -p1 < "$SRCDIR/$GCC_PATCH" + cd "$BUILDDIR" + fi +} + + +function configure_gcc +{ + cd "$BUILDDIR" + rm -rf "gcc-$TARGET" + mkdir "gcc-$TARGET" + cd "gcc-$TARGET" + echo "Configuring gcc" + "$SRCDIR/$GCC/configure" -v \ + --prefix="$PREFIX" --target=$TARGET \ + --with-headers="$PREFIX/$TARGET/include" \ + --with-gcc --with-gnu-ld --with-gnu-as \ + --enable-threads --disable-nls --enable-languages=$GCC_LANGS \ + --disable-win32-registry --disable-shared --enable-sjlj-exceptions --enable-libgcj \ + --disable-java-awt --without-x --enable-java-gc=boehm --disable-libgcj-debug \ + --enable-interpreter --enable-hash-synchronization --enable-libstdcxx-debug \ + &> configure.log + cd "$BUILDDIR" +} + + +function build_gcc +{ + cd "$BUILDDIR/gcc-$TARGET" + echo "Building gcc" + make CFLAGS="-O2" CXXFLAGS="-O2" GCJFLAGS="-O2" LDFLAGS="-s" DEBUG_FLAGS="-g0" &> make.log + if test $? -ne 0; then + echo "make of gcc failed - log available: gcc-$TARGET/make.log" + exit 1 + fi + if [ "x$GCC_ADA" != "x" ]; then + cd gcc + make "CFLAGS=-O2" "LDFLAGS=-s" gnatlib_and_tools &> make-gnatlib.log + if test $? -ne 0; then + echo "make of gnatlib and tools failed - log available: gcc-$TARGET/make-gnatlib.log" + exit 1 + fi + fi + cd "$BUILDDIR" +} + + +function install_gcc +{ + cd "$BUILDDIR/gcc-$TARGET" + echo "Installing gcc" + make install &> make-install.log + if test $? -ne 0; then + echo "install of gcc failed - log available: gcc-$TARGET/make-install.log" + exit 1 + fi + cd "$BUILDDIR" +} + + +function final_tweaks +{ + echo "Finalizing installation" + + # remove gcc build headers + rm -rf "$PREFIX/$TARGET/sys-include" + + # Add extra binary links + if [ ! -f "$PREFIX/$TARGET/bin/objdump" ]; then + ln "$PREFIX/bin/$TARGET-objdump" "$PREFIX/$TARGET/bin/objdump" + fi + + # make cc and c++ symlinks to gcc and g++ + if [ ! -f "$PREFIX/$TARGET/bin/g++" ]; then + ln "$PREFIX/bin/$TARGET-g++" "$PREFIX/$TARGET/bin/g++" + fi + if [ ! -f "$PREFIX/$TARGET/bin/cc" ]; then + ln -s "gcc" "$PREFIX/$TARGET/bin/cc" + fi + if [ ! -f "$PREFIX/$TARGET/bin/c++" ]; then + ln -s "g++" "$PREFIX/$TARGET/bin/c++" + fi + + # strip all the binaries + ls "$PREFIX"/bin/* "$PREFIX/$TARGET"/bin/* | egrep -v '.dll$' | egrep -v 'gccbug$' | + while read file; do + strip "$file" + done + + echo "Installation complete!" +} + + + +# +# Main part of the script +# + +download_files + +if [ "x$PURGE_DIR" = "xY" ]; then + purge_existing_install +fi + +install_libs + +extract_binutils +configure_binutils +build_binutils +install_binutils + +extract_gcc +patch_gcc +configure_gcc +build_gcc +install_gcc + +final_tweaks + + +# +# End +# -- 2.39.5