#!/bin/sh # Copyright (C) 2006 MySQL AB # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # Exit if failing to copy, we want exact specifications, not # just "what happen to be built". set -e # ---------------------------------------------------------------------- # Read first argument that is the base name of the resulting TAR file. # See usage() function below for a description on the arguments. # # NOTE: We will read the rest of the command line later on. # NOTE: Pattern matching with "{..,..}" can't be used, not portable. # ---------------------------------------------------------------------- # FIXME FIXME "debug", own build or handled here? # FIXME FIXME add way to copy from other builds executables usage() { echo <<EOF Usage: make_win_bin_dist [ options ] package-base-name [ copy-defs... ] This is a script to run from the top of a source tree built on Windows. The "package-base-name" argument should be something like mysql-noinstall-5.0.25-win32 (or winx64) and will become the name of the directory of the unpacked ZIP (stripping away the "noinstall" part of the ZIP file name if any) and the base for the resulting package name. Options are --embedded Pack the embedded server and give error if not built. The default is to pack it if it is built. --no-embedded Don't pack the embedded server even if built --debug Pack the debug binaries and give error if not built. The default is to pack them if they are built. --no-debug Don't pack the debug binaries even if built --only-debug The target for this build was "Debug", and we just want to replace the normal binaries with debug versions, i.e. no separate "debug" directories. --exe-suffix=SUF Add a suffix to the filename part of the "mysqld" binary. As you might want to include files of directories from other builds (like a "mysqld-max.exe" server), you can instruct this script to copy them in for you. This is the "copy-def" arguments, and they are of the form relative-dest-name=source-name ..... i.e. can be something like bin/mysqld-max.exe=../my-max-build/sql/release/mysqld.exe If you specify a directory the whole directory will be copied. EOF exit 1 } # ---------------------------------------------------------------------- # We need to be at the top of a source tree, check that we are # ---------------------------------------------------------------------- if [ ! -d "sql" ] ; then echo "You need to run this script from inside the source tree" usage fi # ---------------------------------------------------------------------- # Actual argument processing, first part # ---------------------------------------------------------------------- NOINST_NAME="" TARGET="release" PACK_EMBEDDED="" # Could be "no", "yes" or empty PACK_DEBUG="" # Could be "no", "yes" or empty EXE_SUFFIX="" for arg do shift case "$arg" in --embedded) PACK_EMBEDDED="yes" ;; --no-embedded) PACK_EMBEDDED="no" ;; --debug) PACK_DEBUG="yes" ;; --no-debug) PACK_DEBUG="no" ;; --only-debug) TARGET="debug" ; PACK_DEBUG="no" ;; --exe-suffix=*) EXE_SUFFIX=`echo "$arg" | sed -e "s,--exe-suffix=,,"` ;; -*) echo "Unknown argument '$arg'" usage ;; *) NOINST_NAME="$arg" break esac done if [ x"$NOINST_NAME" = x"" ] ; then echo "No base package name given" usage fi DESTDIR=`echo $NOINST_NAME | sed 's/-noinstall-/-/'` if [ -e $DESTDIR ] ; then echo "Please remove the old $DESTDIR before running this script" usage fi # ---------------------------------------------------------------------- # Adjust target name if needed, release with debug info has another name # ---------------------------------------------------------------------- if [ x"$TARGET" = x"release" -a -f "client/relwithdebinfo/mysql.exe" ] then TARGET="relwithdebinfo" fi # ---------------------------------------------------------------------- # Copy executables, and client DLL (FIXME why?) # ---------------------------------------------------------------------- trap 'echo "Clearning up and exiting..." ; rm -fr $DESTDIR; exit 1' ERR mkdir $DESTDIR mkdir $DESTDIR/bin cp client/$TARGET/*.exe $DESTDIR/bin/ cp extra/$TARGET/*.exe $DESTDIR/bin/ cp storage/myisam/$TARGET/*.exe $DESTDIR/bin/ cp server-tools/instance-manager/$TARGET/*.{exe,map} $DESTDIR/bin/ if [ x"$TARGET" != x"release" ] then cp server-tools/instance-manager/$TARGET/*.pdb $DESTDIR/bin/ fi cp tests/$TARGET/*.exe $DESTDIR/bin/ cp libmysql/$TARGET/*.exe $DESTDIR/bin/ cp libmysql/$TARGET/libmysql.dll $DESTDIR/bin/ # FIXME really needed?! mv $DESTDIR/bin/comp_err.exe $DESTDIR/bin/comp-err.exe cp sql/$TARGET/mysqld.exe $DESTDIR/bin/mysqld$EXE_SUFFIX.exe cp sql/$TARGET/mysqld.map $DESTDIR/bin/mysqld$EXE_SUFFIX.map if [ x"$TARGET" != x"release" ] then cp sql/$TARGET/mysqld.pdb $DESTDIR/bin/mysqld$EXE_SUFFIX.pdb fi if [ x"$PACK_DEBUG" = x"" -a -f "sql/debug/mysqld.exe" -o \ x"$PACK_DEBUG" = x"yes" ] ; then cp sql/debug/mysqld.exe $DESTDIR/bin/mysqld-debug.exe cp sql/debug/mysqld.pdb $DESTDIR/bin/mysqld-debug.pdb cp sql/debug/mysqld.map $DESTDIR/bin/mysqld-debug.map fi # ---------------------------------------------------------------------- # Copy data directory, readme files etc # ---------------------------------------------------------------------- # FIXME is there ever a data directory to copy? if [ -d win/data ] ; then cp -pR win/data $DESTDIR/data fi # FIXME maybe a flag to define "release build", or do the # check from the calling script that all these are there, # and with the correct content. mkdir $DESTDIR/Docs cp Docs/INSTALL-BINARY $DESTDIR/Docs/ cp Docs/manual.chm $DESTDIR/Docs/ || /bin/true cp ChangeLog $DESTDIR/Docs/ || /bin/true cp support-files/my-*.ini $DESTDIR/ if [ -f COPYING ] ; then cp COPYING EXCEPTIONS-CLIENT $DESTDIR/ cp COPYING $DESTDIR/Docs/ fi # ---------------------------------------------------------------------- # These will be filled in when we enable embedded. Note that if no # argument is given, it is copied if exists, else a check is done. # ---------------------------------------------------------------------- copy_embedded() { mkdir -p $DESTDIR/Embedded/DLL/release \ $DESTDIR/Embedded/static/release \ $DESTDIR/include cp libmysqld/libmysqld.def $DESTDIR/include/ cp libmysqld/$TARGET/mysqlserver.lib $DESTDIR/Embedded/static/release/ cp libmysqld/$TARGET/libmysqld.dll $DESTDIR/Embedded/DLL/release/ cp libmysqld/$TARGET/libmysqld.exp $DESTDIR/Embedded/DLL/release/ cp libmysqld/$TARGET/libmysqld.lib $DESTDIR/Embedded/DLL/release/ if [ x"$PACK_DEBUG" = x"" -a -f "libmysqld/debug/libmysqld.lib" -o \ x"$PACK_DEBUG" = x"yes" ] ; then mkdir -p $DESTDIR/Embedded/DLL/debug cp libmysqld/debug/libmysqld.dll $DESTDIR/Embedded/DLL/debug/ cp libmysqld/debug/libmysqld.exp $DESTDIR/Embedded/DLL/debug/ cp libmysqld/debug/libmysqld.lib $DESTDIR/Embedded/DLL/debug/ fi } if [ x"$PACK_EMBEDDED" = x"" -a \ -f "libmysqld/$TARGET/mysqlserver.lib" -a \ -f "libmysqld/$TARGET/libmysqld.lib" -o \ x"$PACK_EMBEDDED" = x"yes" ] ; then copy_embedded fi # ---------------------------------------------------------------------- # FIXME test stuff that is useless garbage? # ---------------------------------------------------------------------- mkdir -p $DESTDIR/examples/libmysqltest/release cp libmysql/mytest.c libmysql/myTest.vcproj libmysql/$TARGET/myTest.exe \ $DESTDIR/examples/libmysqltest/ cp libmysql/$TARGET/myTest.exe $DESTDIR/examples/libmysqltest/release/ if [ x"$PACK_DEBUG" = x"" -a -f "libmysql/debug/myTest.exe" -o \ x"$PACK_DEBUG" = x"yes" ] ; then mkdir -p $DESTDIR/examples/libmysqltest/debug cp libmysql/debug/myTest.exe $DESTDIR/examples/libmysqltest/debug/ fi mkdir -p $DESTDIR/examples/tests cp tests/*.res tests/*.tst tests/*.pl tests/*.c $DESTDIR/examples/tests/ mkdir -p $DESTDIR/examples/udf_example cp sql/udf_example.def sql/udf_example.vcproj sql/udf_example.c $DESTDIR/examples/udf_example/ # ---------------------------------------------------------------------- # FIXME why not copy it all in "include"?! # ---------------------------------------------------------------------- mkdir -p $DESTDIR/include cp include/conf*.h \ include/mysql*.h \ include/errmsg.h \ include/my_alloc.h \ include/my_getopt.h \ include/my_sys.h \ include/my_list.h \ include/my_pthread.h \ include/my_dbug.h \ include/m_string.h \ include/m_ctype.h \ include/my_global.h \ include/typelib.h $DESTDIR/include/ cp libmysql/libmysql.def $DESTDIR/include/ # ---------------------------------------------------------------------- # Client libraries, and other libraries # FIXME why "libmysql.dll" installed both in "bin" and "lib/opt"? # ---------------------------------------------------------------------- mkdir -p $DESTDIR/lib/opt cp libmysql/$TARGET/libmysql.dll \ libmysql/$TARGET/libmysql.lib \ client/$TARGET/mysqlclient.lib \ regex/$TARGET/regex.lib \ strings/$TARGET/strings.lib \ zlib/$TARGET/zlib.lib $DESTDIR/lib/opt/ if [ x"$PACK_DEBUG" = x"" -a -f "libmysql/debug/libmysql.lib" -o \ x"$PACK_DEBUG" = x"yes" ] ; then mkdir -p $DESTDIR/lib/debug cp libmysql/debug/libmysql.dll \ libmysql/debug/libmysql.lib \ client/debug/mysqlclient.lib \ mysys/debug/mysys.lib \ regex/debug/regex.lib \ strings/debug/strings.lib \ zlib/debug/zlib.lib $DESTDIR/lib/debug/ fi # FIXME sort this out... cp mysys/$TARGET/mysys.lib $DESTDIR/lib/opt/mysys_tls.lib # ---------------------------------------------------------------------- # Copy the test directory # ---------------------------------------------------------------------- mkdir -p $DESTDIR/mysql-test/include $DESTDIR/mysql-test/lib \ $DESTDIR/mysql-test/r $DESTDIR/mysql-test/std_data \ $DESTDIR/mysql-test/t $DESTDIR/mysql-test/suite cp mysql-test/mysql-test-run.pl $DESTDIR/mysql-test/ cp mysql-test/README $DESTDIR/mysql-test/ cp mysql-test/install_test_db.sh $DESTDIR/mysql-test/install_test_db cp mysql-test/include/*.inc $DESTDIR/mysql-test/include/ cp mysql-test/lib/*.pl $DESTDIR/mysql-test/lib/ cp mysql-test/r/*.require $DESTDIR/mysql-test/r/ # Need this trick, or we get "argument list too long". ABS_DST=`pwd`/$DESTDIR (cd mysql-test/r/ && cp *.result $ABS_DST/mysql-test/r/) cp mysql-test/std_data/Moscow_leap $DESTDIR/mysql-test/std_data/ cp mysql-test/std_data/des_key_file $DESTDIR/mysql-test/std_data/ cp mysql-test/std_data/*.000001 $DESTDIR/mysql-test/std_data/ cp mysql-test/std_data/*.cnf $DESTDIR/mysql-test/std_data/ cp mysql-test/std_data/*.dat $DESTDIR/mysql-test/std_data/ cp mysql-test/std_data/*.frm $DESTDIR/mysql-test/std_data/ cp mysql-test/std_data/*.pem $DESTDIR/mysql-test/std_data/ cp mysql-test/std_data/*.MY* $DESTDIR/mysql-test/std_data/ cp mysql-test/t/*.opt $DESTDIR/mysql-test/t/ cp mysql-test/t/*.sh $DESTDIR/mysql-test/t/ cp mysql-test/t/*.slave-mi $DESTDIR/mysql-test/t/ || /bin/true cp mysql-test/t/*.sql $DESTDIR/mysql-test/t/ cp mysql-test/t/*.def $DESTDIR/mysql-test/t/ (cd mysql-test/t/ && cp *.test $ABS_DST/mysql-test/t/) # Note that this will not copy "extra" if a soft link if [ -d mysql-test/extra ] ; then mkdir -p $DESTDIR/mysql-test/extra cp -pR mysql-test/extra/* $DESTDIR/mysql-test/extra/ fi # Copy all directories in mysql-test/suite/ for i in `cd mysql-test/suite && ls`; do \ mkdir -p $DESTDIR/mysql-test/suite/$i; \ cp -R mysql-test/suite/$i $DESTDIR/mysql-test/suite/; \ done # ---------------------------------------------------------------------- # Copy what could be usable in the "scripts" directory. Currently # only SQL files, others are Bourne shell scripts or Perl scripts # not really usable on Windows. # # But to be nice to the few Cygwin users we might have in 5.0 we # continue to copy the stuff, but don't include it in the WiX install. # ---------------------------------------------------------------------- mkdir -p $DESTDIR/scripts # Uncomment and remove the for loop in 5.1 #cp scripts/*.sql $DESTDIR/scripts/ for i in `cd scripts && ls`; do \ if echo $i | grep -q '\.sh'; then \ cp scripts/$i $DESTDIR/scripts/`echo $i | sed -e 's/\.sh$//'`; \ elif [ -d scripts/$i -o $i = Makefile.am -o $i = Makefile.in -o -e scripts/$i.sh ] ; then \ : ; \ else \ cp scripts/$i $DESTDIR/scripts/$i; \ fi; \ done cp -pR sql/share $DESTDIR/ # The SQL initialisation code is really expected to be in "share" mv $DESTDIR/scripts/*.sql $DESTDIR/share/ || true # ---------------------------------------------------------------------- # Copy other files specified on command line DEST=SOURCE # ---------------------------------------------------------------------- for arg do dst=`echo $arg | sed 's/=.*$//'` src=`echo $arg | sed 's/^.*=//'` if [ x"$dst" = x"" -o x"$src" = x"" ] ; then echo "Invalid specification of what to copy" usage fi mkdir -p `dirname $DESTDIR/$dst` cp -pR "$src" $DESTDIR/$dst done # ---------------------------------------------------------------------- # Finally create the ZIP archive # ---------------------------------------------------------------------- rm -f $NOINST_NAME.zip zip -r $NOINST_NAME.zip $DESTDIR rm -Rf $DESTDIR