From c833295a3948e914fa23042896f19f35ddd8d927 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Thu, 21 Jun 2012 14:06:54 -0400 Subject: [PATCH] Adjust Windows built to support 32-bit and 64-bit builds Update the build to support new external-libs layout, and autoconf options to specify windows word size. Split make_windows_releases into multiple scripts. --- autoconf.mk.in | 4 ++++ config-mingw => config-mingw32 | 2 +- config-mingw64 | 10 ++++++++++ config-msvc | 11 ++++++++++- configure.ac | 17 ++++++++++++++++- copy_dlls | 8 ++++---- make/installwin.mk | 2 +- make/mingw.mk | 8 ++++---- make/msvc.mk | 2 +- make_windows_releases | 26 ++++++++------------------ make_windows_releases-finish | 24 ++++++++++++++++++++++++ make_windows_releases-msvc | 21 +++++++++++++++++++++ 12 files changed, 104 insertions(+), 31 deletions(-) rename config-mingw => config-mingw32 (58%) create mode 100644 config-mingw64 create mode 100755 make_windows_releases-finish create mode 100755 make_windows_releases-msvc diff --git a/autoconf.mk.in b/autoconf.mk.in index 9112bad0..baf11658 100644 --- a/autoconf.mk.in +++ b/autoconf.mk.in @@ -20,6 +20,9 @@ CXX=@CXX@ CXXFLAGS=@CXXFLAGS@ AR=@AR@ RANLIB=@RANLIB@ +DLLTOOL=@DLLTOOL@ +STRIP=@STRIP@ +OBJDUMP=@OBJDUMP@ GENDEPS=@GENDEPS@ LIBTOOL=@LIBTOOL@ DOCBOOKX_DTD=@DOCBOOKX_DTD@ @@ -32,3 +35,4 @@ VALIDATE_DOC=@VALIDATE_DOC@ SKIP_TEST_COMPARE_IMAGES=@SKIP_TEST_COMPARE_IMAGES@ BUILDRULES=@BUILDRULES@ HAVE_LD_VERSION_SCRIPT=@HAVE_LD_VERSION_SCRIPT@ +WINDOWS_WORDSIZE=@WINDOWS_WORDSIZE@ diff --git a/config-mingw b/config-mingw32 similarity index 58% rename from config-mingw rename to config-mingw32 index c6e14441..3fabdb0e 100755 --- a/config-mingw +++ b/config-mingw32 @@ -1,2 +1,2 @@ #!/bin/sh -./configure --disable-test-compare-images --enable-external-libs --with-buildrules=mingw +./configure --disable-test-compare-images --enable-external-libs --with-windows-wordsize=32 --with-buildrules=mingw diff --git a/config-mingw64 b/config-mingw64 new file mode 100644 index 00000000..92242fb2 --- /dev/null +++ b/config-mingw64 @@ -0,0 +1,10 @@ +#!/bin/sh +./configure --disable-test-compare-images --enable-external-libs --with-windows-wordsize=64 --with-buildrules=mingw \ + CC=x86_64-w64-mingw32-gcc \ + CXX=x86_64-w64-mingw32-g++ \ + LD=x86_64-w64-mingw32-ld \ + AR=x86_64-w64-mingw32-ar \ + RANLIB=x86_64-w64-mingw32-ranlib \ + DLLTOOL=x86_64-w64-mingw32-dlltool \ + STRIP=x86_64-w64-mingw32-strip \ + OBJDUMP=x86_64-w64-mingw32-objdump diff --git a/config-msvc b/config-msvc index 6a94ff16..a1bc2cec 100755 --- a/config-msvc +++ b/config-msvc @@ -1,2 +1,11 @@ #!/bin/sh -CC=cl CXX="cl -TP -GR" ./configure --disable-test-compare-images --enable-external-libs --with-buildrules=msvc +wordsize=$1 +if ! test "$wordsize" = "32" -o "$wordsize" = "64"; then + echo "Usage: $0 {32,64}" + exit 2 +fi +objdump= +if test "$wordsize" = "64"; then + objdump=OBJDUMP=x86_64-w64-mingw32-objdump +fi +CC=cl CXX="cl -TP -GR" ./configure --disable-test-compare-images --enable-external-libs --with-windows-wordsize=$wordsize --with-buildrules=msvc $objdump diff --git a/configure.ac b/configure.ac index 8f87797c..1ee57347 100644 --- a/configure.ac +++ b/configure.ac @@ -31,6 +31,21 @@ else AC_MSG_RESULT(yes) fi +WINDOWS_WORDSIZE= +AC_SUBST(WINDOWS_WORDSIZE) +AC_ARG_WITH(windows-wordsize, + AS_HELP_STRING([--with-windows-wordsize={32,64}], + [Windows only: whether this is a 32-bit or 64-bit build; required if external-libs are enabled]), + [WINDOWS_WORDSIZE=$withval], + [WINDOWS_WORDSIZE=none]) +if test "$USE_EXTERNAL_LIBS" = "1"; then + AC_MSG_CHECKING(for windows wordsize) + AC_MSG_RESULT($WINDOWS_WORDSIZE) + if ! test "$WINDOWS_WORDSIZE" = "32" -o "$WINDOWS_WORDSIZE" = "64"; then + AC_MSG_ERROR(Windows wordsize of 32 or 64 must be specified if external libs are being used.) + fi +fi + if test "$BUILD_INTERNAL_LIBS" = "0"; then AC_CHECK_HEADER(zlib.h,,[MISSING_ZLIB_H=1; MISSING_ANY=1]) AC_SEARCH_LIBS(deflate,z zlib,,[MISSING_ZLIB=1; MISSING_ANY=1]) @@ -378,7 +393,7 @@ if test "$USE_EXTERNAL_LIBS" = "1"; then # the user can run this and then edit autoconf.mk if they have too # much trouble getting it to work with a different compiler. CPPFLAGS="$CPPFLAGS -Iexternal-libs/include" - LDFLAGS="$LDFLAGS -Lexternal-libs/lib-$BUILDRULES" + LDFLAGS="$LDFLAGS -Lexternal-libs/lib-$BUILDRULES$WINDOWS_WORDSIZE" LIBS="$LIBS -lz -lpcre" fi diff --git a/copy_dlls b/copy_dlls index 6cfcfe02..e93f1613 100755 --- a/copy_dlls +++ b/copy_dlls @@ -7,19 +7,19 @@ use File::Basename; my $whoami = basename($0); -usage() unless @ARGV == 2; -my ($file, $destdir) = @ARGV; +usage() unless @ARGV == 3; +my ($file, $destdir, $objdump) = @ARGV; my $filedir = dirname($file); my %dlls = (); -open(O, "objdump -p $file|") or die "$whoami: can't run objdump\n"; +open(O, "$objdump -p $file|") or die "$whoami: can't run objdump\n"; while () { if (m/^\s+DLL Name:\s+(.+\.dll)/i) { my $dll = $1; $dll =~ tr/A-Z/a-z/; - next if $dll =~ m/^(kernel32|msvcrt)\.dll$/; + next if $dll =~ m/^(kernel32|user32|msvcrt)\.dll$/; $dlls{$dll} = 1; } } diff --git a/make/installwin.mk b/make/installwin.mk index 6b88efad..e3401d83 100644 --- a/make/installwin.mk +++ b/make/installwin.mk @@ -10,7 +10,7 @@ installwin: all mkdir $(DEST)/doc cp libqpdf/$(OUTPUT_DIR)/$(STATIC_LIB_NAME) $(DEST)/lib cp libqpdf/$(OUTPUT_DIR)/qpdf*.dll $(DEST)/bin - perl copy_dlls libqpdf/$(OUTPUT_DIR)/qpdf*.dll $(DEST)/bin + perl copy_dlls libqpdf/$(OUTPUT_DIR)/qpdf*.dll $(DEST)/bin $(OBJDUMP) cp qpdf/$(OUTPUT_DIR)/qpdf.exe $(DEST)/bin cp zlib-flate/$(OUTPUT_DIR)/zlib-flate.exe $(DEST)/bin cp qpdf/fix-qdf $(DEST)/bin diff --git a/make/mingw.mk b/make/mingw.mk index e6d06f5f..00119d1a 100644 --- a/make/mingw.mk +++ b/make/mingw.mk @@ -62,7 +62,7 @@ endef # 1 2 3 4 5 6 7 # Usage: $(call makelib,objs,library,ldflags,libs,current,revision,age) define makelib - dlltool -l $(2) -D $$(basename `echo $(2) | sed -e 's,/lib\(.*\).a,/\1,'`$(shell expr $(5) - $(7)).dll) $(1); \ + $(DLLTOOL) -l $(2) -D $$(basename `echo $(2) | sed -e 's,/lib\(.*\).a,/\1,'`$(shell expr $(5) - $(7)).dll) $(1); \ $(CXX) -shared -o `echo $(2) | sed -e 's,/lib\(.*\).a,/\1,'`$(shell expr $(5) - $(7)).dll \ $(1) $(3) $(4) endef @@ -75,9 +75,9 @@ endef # Install target -INSTALL_DIR = install-mingw +INSTALL_DIR = install-mingw$(WINDOWS_WORDSIZE) STATIC_LIB_NAME = libqpdf.a include make/installwin.mk install: installwin - strip $(DEST)/bin/*.exe - strip $(DEST)/bin/*.dll + $(STRIP) $(DEST)/bin/*.exe + $(STRIP) $(DEST)/bin/*.dll diff --git a/make/msvc.mk b/make/msvc.mk index 8ad7f589..5f3f69ad 100644 --- a/make/msvc.mk +++ b/make/msvc.mk @@ -101,7 +101,7 @@ endef # Install target -INSTALL_DIR = install-msvc +INSTALL_DIR = install-msvc$(WINDOWS_WORDSIZE) STATIC_LIB_NAME = qpdf.lib include make/installwin.mk install: installwin diff --git a/make_windows_releases b/make_windows_releases index 0518622a..77b3d863 100755 --- a/make_windows_releases +++ b/make_windows_releases @@ -9,29 +9,19 @@ set -x cwd=`pwd` PATH=$cwd/libqpdf/build:$PATH -rm -rf install-mingw install-msvc +rm -rf install-mingw* install-msvc* -./config-mingw +./config-mingw64 make check install make distclean -./config-msvc +./config-mingw32 make check install make distclean -cd install-mingw -v=`ls -d qpdf-*` -cd .. - -cp -p README-windows-install.txt install-mingw/$v/README.txt -cp -p README-windows-install.txt install-msvc/$v/README.txt - -cd install-mingw -zip -r ../$v-bin-mingw.zip $v -cd ../install-msvc -zip -r ../$v-bin-msvc.zip $v -cd .. - set +x -echo "" -echo "$v-bin-mingw.zip and $v-bin-msvc.zip have been created." +echo '' +echo 'Now run "./make_windows_releases-msvc 64" in a 64-bit MSVC environment' +echo 'and "./make_windows_releases-msvc 32" in a 32-bit MSVC environment.' +echo 'Then run "./make_windows_releases-msvc-finish".' +echo '' diff --git a/make_windows_releases-finish b/make_windows_releases-finish new file mode 100755 index 00000000..3ab5867d --- /dev/null +++ b/make_windows_releases-finish @@ -0,0 +1,24 @@ +#!/bin/sh +if [ ! -d external-libs ]; then + echo "Please extract qpdf-external-libs-bin.zip and try again" + exit 2 +fi + +set -e +set -x +cwd=`pwd` +PATH=$cwd/libqpdf/build:$PATH + +cd install-mingw32 +v=`ls -d qpdf-*` +cd .. + +for i in mingw32 mingw64 msvc32 msvc64; do + cp -p README-windows-install.txt install-$i/$v/README.txt + (cd install-$i; zip -r ../$v-bin-$i.zip $v) +done + +set +x + +echo "" +echo "$v-bin-mingw{32,64}.zip and $v-bin-msvc{32,64}.zip have been created." diff --git a/make_windows_releases-msvc b/make_windows_releases-msvc new file mode 100755 index 00000000..40a39790 --- /dev/null +++ b/make_windows_releases-msvc @@ -0,0 +1,21 @@ +#!/bin/sh +if [ ! -d external-libs ]; then + echo "Please extract qpdf-external-libs-bin.zip and try again" + exit 2 +fi + +w=$1 + +if [ "$w" = "" ]; then + echo "Usage: $0 {32|64}" + exit 2 +fi + +set -e +set -x +cwd=`pwd` +PATH=$cwd/libqpdf/build:$PATH + +./config-msvc $w +make check install +make distclean