From 4ad669661e034f6069c3ce0d6b97a8f297cf33b3 Mon Sep 17 00:00:00 2001 From: "H. Peter Anvin" Date: Wed, 21 Jul 2010 12:33:13 -0700 Subject: [PATCH] win64: experimental Win64 installer (syslinux64.exe) Experimental Win64 installer. This is necessary to be able to run on WinPE64, since WinPE64 doesn't support running 32-bit binaries. Signed-off-by: H. Peter Anvin --- Makefile | 11 ++++++----- NEWS | 1 + {win32 => win}/hello.c | 0 {win32 => win}/sysexits.h | 0 {win32 => win}/syslinux.c | 5 ++++- win32/Makefile | 14 +++++++------ win32/README | 6 ++---- win32/{find-mingw.sh => find-mingw32.sh} | 1 + {win32 => win64}/Makefile | 34 ++++++++++++-------------------- win64/README | 10 ++++++++++ win64/find-mingw64.sh | 24 ++++++++++++++++++++++ 11 files changed, 69 insertions(+), 37 deletions(-) rename {win32 => win}/hello.c (100%) rename {win32 => win}/sysexits.h (100%) rename {win32 => win}/syslinux.c (98%) rename win32/{find-mingw.sh => find-mingw32.sh} (97%) copy {win32 => win64}/Makefile (72%) create mode 100644 win64/README create mode 100755 win64/find-mingw64.sh diff --git a/Makefile b/Makefile index 9b40e368..da90cdc4 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ ## ----------------------------------------------------------------------- ## ## Copyright 1998-2009 H. Peter Anvin - All Rights Reserved -## Copyright 2009 Intel Corporation; author: H. Peter Anvin +## Copyright 2009-2010 Intel Corporation; author: H. Peter Anvin ## ## 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 @@ -43,7 +43,8 @@ BOBJECTS = $(BTARGET) \ mbr/mbr_c.bin mbr/altmbr_c.bin mbr/gptmbr_c.bin \ mbr/mbr_f.bin mbr/altmbr_f.bin mbr/gptmbr_f.bin \ core/pxelinux.0 core/isolinux.bin core/isolinux-debug.bin \ - gpxe/gpxelinux.0 dos/syslinux.com win32/syslinux.exe \ + gpxe/gpxelinux.0 dos/syslinux.com \ + win32/syslinux.exe win64/syslinux64.exe \ dosutil/*.com dosutil/*.sys \ $(MODULES) @@ -54,7 +55,7 @@ BOBJECTS = $(BTARGET) \ # files that depend only on the B phase, but may have to be regenerated # for "make installer". BSUBDIRS = codepage com32 lzo core memdisk modules mbr memdump gpxe sample \ - libinstaller dos win32 dosutil + libinstaller dos win32 win64 dosutil ITARGET = IOBJECTS = $(ITARGET) \ utils/gethostip utils/isohybrid utils/mkdiskimage \ @@ -68,9 +69,9 @@ INSTALL_SBIN = extlinux/extlinux # Things to install in /usr/lib/syslinux INSTALL_AUX = core/pxelinux.0 gpxe/gpxelinux.0 core/isolinux.bin \ core/isolinux-debug.bin \ - dos/syslinux.com win32/syslinux.exe \ + dos/syslinux.com \ mbr/*.bin $(MODULES) -INSTALL_AUX_OPT = win32/syslinux.exe +INSTALL_AUX_OPT = win32/syslinux.exe win64/syslinux64.exe # These directories manage their own installables INSTALLSUBDIRS = com32 utils dosutil diff --git a/NEWS b/NEWS index 61801955..8ecb6cd9 100644 --- a/NEWS +++ b/NEWS @@ -28,6 +28,7 @@ Changes in 4.02: command line options. * PXELINUX: fix the use of IP addresses in TFTP :: or tftp:// host syntax. + * SYSLINUX: experimental Win64 installer (syslinux64.exe). Changes in 4.01: * ISOLINUX: fix initialization on systems which don't zero diff --git a/win32/hello.c b/win/hello.c similarity index 100% rename from win32/hello.c rename to win/hello.c diff --git a/win32/sysexits.h b/win/sysexits.h similarity index 100% rename from win32/sysexits.h rename to win/sysexits.h diff --git a/win32/syslinux.c b/win/syslinux.c similarity index 98% rename from win32/syslinux.c rename to win/syslinux.c index 1f95e842..0e833d8d 100644 --- a/win32/syslinux.c +++ b/win/syslinux.c @@ -46,12 +46,15 @@ void error(char *msg); #define PART_ACTIVE 0x80 // The following struct should be in the ntddstor.h file, but I didn't have it. -// TODO: Make this a conditional compilation +// mingw32 has , but including that file causes all kinds +// of other failures. mingw64 has it in . +#ifndef __x86_64__ typedef struct _STORAGE_DEVICE_NUMBER { DEVICE_TYPE DeviceType; ULONG DeviceNumber; ULONG PartitionNumber; } STORAGE_DEVICE_NUMBER, *PSTORAGE_DEVICE_NUMBER; +#endif BOOL GetStorageDeviceNumberByHandle(HANDLE handle, const STORAGE_DEVICE_NUMBER * sdn) diff --git a/win32/Makefile b/win32/Makefile index b8879db9..d4133ff8 100644 --- a/win32/Makefile +++ b/win32/Makefile @@ -29,23 +29,25 @@ else ifeq ($(findstring MINGW32,$(OSTYPE)),MINGW32) WINPREFIX := else -WINPREFIX := $(shell ./find-mingw.sh gcc) +WINPREFIX := $(shell ./find-mingw32.sh gcc) endif WINCFLAGS := $(GCCWARN) -Wno-sign-compare -Os -fomit-frame-pointer \ -D_FILE_OFFSET_BITS=64 WINLDFLAGS := -Os -s endif -WINCFLAGS += -I. -I.. -I../libfat -I../libinstaller -I../libinstaller/getopt +WINCFLAGS += -I. -I../win -I.. -I../libfat -I../libinstaller \ + -I../libinstaller/getopt WINCC := $(WINPREFIX)gcc WINAR := $(WINPREFIX)ar WINRANLIB := $(WINPREFIX)ranlib -WINCC_IS_GOOD := $(shell $(WINCC) $(WINCFLAGS) $(WINLDFLAGS) -o hello.exe hello.c >/dev/null 2>&1 ; echo $$?) +WINCC_IS_GOOD := $(shell $(WINCC) $(WINCFLAGS) $(WINLDFLAGS) \ + -o hello.exe ../win/hello.c >/dev/null 2>&1 ; echo $$?) -.SUFFIXES: .c .o .i .s .S +.SUFFIXES: .c .obj .lib .exe .i .s .S -SRCS = syslinux.c +SRCS = ../win/syslinux.c OBJS = $(patsubst %.c,%.obj,$(notdir $(SRCS))) LIBSRC = ../libinstaller/fat.c \ ../libinstaller/syslxmod.c \ @@ -60,7 +62,7 @@ LIBOBJS = $(patsubst %.c,%.obj,$(notdir $(LIBSRC))) LIB = syslinux.lib -VPATH = .:../libfat:../libinstaller:../libinstaller/getopt +VPATH = .:../win:../libfat:../libinstaller:../libinstaller/getopt TARGETS = syslinux.exe diff --git a/win32/README b/win32/README index a1578f91..8775cf0a 100644 --- a/win32/README +++ b/win32/README @@ -2,7 +2,5 @@ Building the Win32 installer requires the MinGW compiler, available at: http://www.mingw.org/ -Prepackaged versions of the MinGW cross-compiler in RPM format for -Linux are available at: - - http://mirzam.it.vu.nl/mingw/ +Prepackaged versions of the MinGW cross-compiler are now included in +several Linux distributions, including Fedora. diff --git a/win32/find-mingw.sh b/win32/find-mingw32.sh similarity index 97% rename from win32/find-mingw.sh rename to win32/find-mingw32.sh index 7a4491cd..f79949c7 100755 --- a/win32/find-mingw.sh +++ b/win32/find-mingw32.sh @@ -4,6 +4,7 @@ cc="$1" for prefix in \ mingw- \ + mingw32- \ i386-pc-mingw32- \ i486-pc-mingw32- \ i586-pc-mingw32- \ diff --git a/win32/Makefile b/win64/Makefile similarity index 72% copy from win32/Makefile copy to win64/Makefile index b8879db9..0bc746d5 100644 --- a/win32/Makefile +++ b/win64/Makefile @@ -12,40 +12,32 @@ ## ----------------------------------------------------------------------- # -# Makefile for SYSLINUX Win32 +# Makefile for SYSLINUX Win64 # # This is separated out mostly so we can have a different set of Makefile # variables. # OSTYPE = $(shell uname -msr) -ifeq ($(findstring CYGWIN,$(OSTYPE)),CYGWIN) -## Compiling on Cygwin -WINPREFIX := -WINCFLAGS := -mno-cygwin $(GCCWARN) -Os -fomit-frame-pointer -D_FILE_OFFSET_BITS=64 -WINLDFLAGS := -mno-cygwin -Os -s -else -## Compiling on some variant of MinGW -ifeq ($(findstring MINGW32,$(OSTYPE)),MINGW32) -WINPREFIX := -else -WINPREFIX := $(shell ./find-mingw.sh gcc) -endif +# Don't know how to do a native compile here... +WINPREFIX := $(shell ./find-mingw64.sh gcc) WINCFLAGS := $(GCCWARN) -Wno-sign-compare -Os -fomit-frame-pointer \ -D_FILE_OFFSET_BITS=64 WINLDFLAGS := -Os -s -endif -WINCFLAGS += -I. -I.. -I../libfat -I../libinstaller -I../libinstaller/getopt + +WINCFLAGS += -I. -I../win -I.. -I../libfat -I../libinstaller \ + -I../libinstaller/getopt WINCC := $(WINPREFIX)gcc WINAR := $(WINPREFIX)ar WINRANLIB := $(WINPREFIX)ranlib -WINCC_IS_GOOD := $(shell $(WINCC) $(WINCFLAGS) $(WINLDFLAGS) -o hello.exe hello.c >/dev/null 2>&1 ; echo $$?) +WINCC_IS_GOOD := $(shell $(WINCC) $(WINCFLAGS) $(WINLDFLAGS) \ + -o hello.exe ../win/hello.c >/dev/null 2>&1 ; echo $$?) -.SUFFIXES: .c .o .i .s .S +.SUFFIXES: .c .obj .lib .exe .i .s .S -SRCS = syslinux.c +SRCS = ../win/syslinux.c OBJS = $(patsubst %.c,%.obj,$(notdir $(SRCS))) LIBSRC = ../libinstaller/fat.c \ ../libinstaller/syslxmod.c \ @@ -60,9 +52,9 @@ LIBOBJS = $(patsubst %.c,%.obj,$(notdir $(LIBSRC))) LIB = syslinux.lib -VPATH = .:../libfat:../libinstaller:../libinstaller/getopt +VPATH = .:../win:../libfat:../libinstaller:../libinstaller/getopt -TARGETS = syslinux.exe +TARGETS = syslinux64.exe ifeq ($(WINCC_IS_GOOD),0) all: $(TARGETS) @@ -86,7 +78,7 @@ $(LIB): $(LIBOBJS) $(WINAR) cq $@ $^ $(WINRANLIB) $@ -syslinux.exe: $(OBJS) $(LIB) +syslinux64.exe: $(OBJS) $(LIB) $(WINCC) $(WINLDFLAGS) -o $@ $^ diff --git a/win64/README b/win64/README new file mode 100644 index 00000000..05b41607 --- /dev/null +++ b/win64/README @@ -0,0 +1,10 @@ +Building the Win64 installer requires the MinGW-W64 compiler, +available at: + + http://mingw-w64.sourceforge.net/ + +For prepackaged versions of the MinGW-W64 cross-compiler for the +Fedora Linux distribution (and possibly other RPM-based +distributions), see: + + http://lists.fedoraproject.org/pipermail/mingw/2010-May/002589.html diff --git a/win64/find-mingw64.sh b/win64/find-mingw64.sh new file mode 100755 index 00000000..6b620c87 --- /dev/null +++ b/win64/find-mingw64.sh @@ -0,0 +1,24 @@ +#!/bin/sh + +cc="$1" + +for prefix in \ + mingw64- \ + x86_64-pc-mingw64- \ + x86_64-pc-mingw64msvc- \ + x86_64-pc-mingw32- \ + x86_64-pc-mingw32msvc- \ + x86_64-mingw64- \ + x86_64-mingw64msvc- \ + x86_64-mingw32- \ + x86_64-mingw32msvc- \ + ; do + if "${prefix}${cc}" -v > /dev/null 2>&1; then + echo "$prefix" + exit 0 + fi +done + +# No prefix, no idea what to do now... +echo missing- +exit 1 -- 2.11.4.GIT