diff --git a/Makefile b/Makefile index 77a6fb6409..4c6eb2f4e6 100644 --- a/Makefile +++ b/Makefile @@ -62,6 +62,7 @@ default: @echo "solaris-x86-64" @echo "windows-ce-arm" @echo "windows-nt-x86-32" + @echo "windows-nt-x86-64" @echo "" @echo "Additional modifiers:" @echo "" @@ -113,6 +114,9 @@ solaris-x86-64: windows-nt-x86-32: $(MAKE) $(EXECUTABLE) CONFIG=vm/Config.windows.nt.x86.32 +windows-nt-x86-64: + $(MAKE) $(EXECUTABLE) CONFIG=vm/Config.windows.nt.x86.64 + windows-ce-arm: $(MAKE) $(EXECUTABLE) CONFIG=vm/Config.windows.ce.arm @@ -138,7 +142,7 @@ clean: rm -f vm/*.o vm/resources.o: - windres vm/factor.rs vm/resources.o + $(WINDRES) vm/factor.rs vm/resources.o .c.o: $(CC) -c $(CFLAGS) -o $@ $< diff --git a/misc/factor.sh b/misc/factor.sh new file mode 100755 index 0000000000..9db0a29fcb --- /dev/null +++ b/misc/factor.sh @@ -0,0 +1,209 @@ +#!/bin/bash -e + +# Programs returning != 0 will not cause script to exit +set +e + +# Case insensitive string comparison +shopt -s nocaseglob +#shopt -s nocasematch + +OS= +ARCH= +WORD= + +ensure_program_installed() { + echo -n "Checking for $1..." + result=`type -p $1` + if ! [[ -n $result ]] ; then + echo "not found!" + echo "Install $1 and try again." + exit 1 + fi + echo "found!" +} + +check_ret() { + RET=$? + if [[ $RET -ne 0 ]] ; then + echo $1 failed + exit 2 + fi +} + +check_gcc_version() { + GCC_VERSION=`gcc --version` + if [[ $GCC_VERSION == *3.3.* ]] ; then + echo "You have a known buggy version of gcc (3.3)" + echo "Install gcc 3.4 or higher and try again." + exit 3 + fi +} + +check_installed_programs() { + ensure_program_installed chmod + ensure_program_installed uname + ensure_program_installed git + ensure_program_installed wget + ensure_program_installed gcc + ensure_program_installed make + check_gcc_version +} + +check_factor_exists() { + if [[ -d "factor" ]] ; then + echo "A directory called 'factor' already exists." + echo "Rename or delete it and try again." + exit 4 + fi +} + +find_os() { + uname_s=`uname -s` + case $uname_s in + CYGWIN_NT-5.2-WOW64) OS=windows-nt;; + *CYGWIN_NT*) OS=windows-nt;; + *CYGWIN*) OS=windows-nt;; + *darwin*) OS=macosx;; + *Darwin*) OS=macosx;; + *linux*) OS=linux;; + *Linux*) OS=linux;; + esac +} + +find_architecture() { + uname_m=`uname -m` + case $uname_m in + i386) ARCH=x86;; + i686) ARCH=x86;; + *86) ARCH=x86;; + "Power Macintosh") ARCH=ppc;; + esac +} + +write_test_program() { + echo "#include " > $C_WORD.c + echo "int main(){printf(\"%d\", 8*sizeof(void*)); return 0; }" >> $C_WORD.c +} + +find_word_size() { + C_WORD=factor-word-size + write_test_program + gcc -o $C_WORD $C_WORD.c + WORD=$(./$C_WORD) + check_ret $C_WORD + rm -f $C_WORD* +} + +set_factor_binary() { + case $OS in + windows-nt) FACTOR_BINARY=factor-nt;; + macosx) FACTOR_BINARY=./Factor.app/Contents/MacOS/factor;; + *) FACTOR_BINARY=factor;; + esac +} + +echo_build_info() { + echo OS=$OS + echo ARCH=$ARCH + echo WORD=$WORD + echo FACTOR_BINARY=$FACTOR_BINARY + echo MAKE_TARGET=$MAKE_TARGET + echo BOOT_IMAGE=$BOOT_IMAGE +} + +set_build_info() { + if ! [[ -n $OS && -n $ARCH && -n $WORD ]] ; then + echo "OS, ARCH, or WORD is empty. Please report this" + exit 5 + fi + MAKE_TARGET=$OS-$ARCH-$WORD + BOOT_IMAGE=boot.$ARCH.$WORD.image +} + +find_build_info() { + find_os + find_architecture + find_word_size + set_factor_binary + set_build_info + echo_build_info +} + +git_clone() { + echo "Downloading the git repository from factorcode.org..." + git clone git://factorcode.org/git/factor.git + check_ret git +} + +git_pull_factorcode() { + git pull git://factorcode.org/git/factor.git + check_ret git +} + +cd_factor() { + cd factor + check_ret cd +} + +make_factor() { + make $MAKE_TARGET + check_ret make +} + +delete_boot_images() { + echo "Deleting old images..." + rm $BOOT_IMAGE > /dev/null 2>&1 + rm $BOOT_IMAGE.* > /dev/null 2>&1 +} + +get_boot_image() { + wget http://factorcode.org/images/latest/$BOOT_IMAGE + check_ret wget +} + +maybe_download_dlls() { + if [[ $OS == windows-nt ]] ; then + wget http://factorcode.org/dlls/freetype6.dll + check_ret + wget http://factorcode.org/dlls/zlib1.dll + check_ret + chmod 777 *.dll + check_ret + fi +} + +bootstrap() { + ./$FACTOR_BINARY -i=$BOOT_IMAGE +} + +usage() { + echo "usage: $0 install|update" +} + +case "$1" in + install) + check_factor_exists + check_installed_programs + find_build_info + git_clone + cd_factor + make_factor + get_boot_image + maybe_download_dlls + bootstrap + ;; + + update) + check_installed_programs + find_build_info + git_pull_factorcode + make_factor + delete_boot_images + get_boot_image + bootstrap + ;; + + *) + usage + ;; +esac diff --git a/misc/install.sh b/misc/install.sh deleted file mode 100755 index 006a7cf604..0000000000 --- a/misc/install.sh +++ /dev/null @@ -1,120 +0,0 @@ -#!/bin/bash -e - -# Programs returning != 0 will not cause script to exit -set +e - -# Case insensitive string comparison -shopt -s nocaseglob -#shopt -s nocasematch - -ensure_program_installed() { - echo -n "Checking for $1..." - result=`type -p $1` - if ! [[ -n $result ]] ; then - echo "not found!" - echo "Install $1 and try again." - exit 1 - fi - echo "found!" -} - -check_ret() { - RET=$? - if [[ $RET -ne 0 ]] ; then - echo $1 failed - exit 5 - fi -} - -ensure_program_installed uname -ensure_program_installed git -ensure_program_installed wget -ensure_program_installed gcc -ensure_program_installed make - -GCC_VERSION=`gcc --version` -if [[ $GCC_VERSION == *3.3.* ]] ; then - echo "You have a known buggy version of gcc (3.3)" - echo "Install gcc 3.4 or higher and try again." - exit 1 -fi - -# OS -OS= -uname_s=`uname -s` -case $uname_s in - CYGWIN_NT-5.2-WOW64) OS=windows-nt;; - *CYGWIN_NT*) OS=windows-nt;; - *CYGWIN*) OS=windows-nt;; - *darwin*) OS=macosx;; - *Darwin*) OS=macosx;; - *linux*) OS=linux;; - *Linux*) OS=linux;; -esac - -# Architecture -ARCH= -uname_m=`uname -m` -case $uname_m in - i386) ARCH=x86;; - i686) ARCH=x86;; - *86) ARCH=x86;; - "Power Macintosh") ARCH=ppc;; -esac - -WORD= -C_WORD=factor-word-size -# Word size -echo "#include " > $C_WORD.c -echo "int main() { printf(\"%d\", 8*sizeof(long)); return 0; }" >> $C_WORD.c -gcc -o $C_WORD $C_WORD.c -WORD=$(./$C_WORD) -check_ret $C_WORD -rm -f $C_WORD* - -case $OS in - windows-nt) FACTOR_BINARY=factor-nt;; - macosx) FACTOR_BINARY=./Factor.app/Contents/MacOS/factor;; - *) FACTOR_BINARY=factor;; -esac - -MAKE_TARGET=$OS-$ARCH-$WORD -BOOT_IMAGE=boot.$ARCH.$WORD.image - -echo OS=$OS -echo ARCH=$ARCH -echo WORD=$WORD -echo FACTOR_BINARY=$FACTOR_BINARY -echo MAKE_TARGET=$MAKE_TARGET -echo BOOT_IMAGE=$BOOT_IMAGE - -if ! [[ -n $OS && -n $ARCH && -n $WORD ]] ; then - echo "OS, ARCH, or WORD is empty. Please report this" - exit 4 -fi - -echo "Downloading the git repository from factorcode.org..." -git clone git://factorcode.org/git/factor.git -check_ret git - -cd factor -check_ret cd - -make $MAKE_TARGET -check_ret make - -echo "Deleting old images..." -rm $BOOT_IMAGE > /dev/null 2>&1 -rm $BOOT_IMAGE.* > /dev/null 2>&1 -wget http://factorcode.org/images/latest/$BOOT_IMAGE -check_ret wget - -if [[ $OS == windows-nt ]] ; then - wget http://factorcode.org/dlls/freetype6.dll - check_ret - wget http://factorcode.org/dlls/zlib1.dll - check_ret -fi - - -./$FACTOR_BINARY -i=$BOOT_IMAGE diff --git a/vm/Config.windows.nt b/vm/Config.windows.nt index 8c67b11c19..c712c7d053 100644 --- a/vm/Config.windows.nt +++ b/vm/Config.windows.nt @@ -4,5 +4,5 @@ DLL_SUFFIX=-nt PLAF_DLL_OBJS += vm/os-windows-nt.o PLAF_EXE_OBJS += vm/resources.o PLAF_EXE_OBJS += vm/main-windows-nt.o -CFLAGS += -mwindows +#CFLAGS += -mwindows include vm/Config.windows diff --git a/vm/Config.windows.nt.x86.32 b/vm/Config.windows.nt.x86.32 index a8d4931b4d..9a020a7bc1 100644 --- a/vm/Config.windows.nt.x86.32 +++ b/vm/Config.windows.nt.x86.32 @@ -1,2 +1,3 @@ +WINDRES=windres include vm/Config.windows.nt include vm/Config.x86.32 diff --git a/vm/Config.windows.nt.x86.64 b/vm/Config.windows.nt.x86.64 new file mode 100644 index 0000000000..1c30e64096 --- /dev/null +++ b/vm/Config.windows.nt.x86.64 @@ -0,0 +1,4 @@ +CC=/k/target/bin/x86_64-pc-mingw32-gcc +include vm/Config.windows.nt +include vm/Config.x86.64 +WINDRES = /k/target/bin/windres diff --git a/vm/os-windows-nt.c b/vm/os-windows-nt.c index 7ea8155072..be9dde1fa8 100755 --- a/vm/os-windows-nt.c +++ b/vm/os-windows-nt.c @@ -91,4 +91,14 @@ void c_to_factor_toplevel(CELL quot) void open_console(void) { + /* + // Do this: http://www.cygwin.com/ml/cygwin/2007-11/msg00432.html + if(console_open) + return; + + if(AttachConsole(ATTACH_PARENT_PROCESS) || AllocConsole()) + { + console_open = true; + } + */ } diff --git a/vm/os-windows-nt.h b/vm/os-windows-nt.h index f74c7b1883..9e451f0301 100755 --- a/vm/os-windows-nt.h +++ b/vm/os-windows-nt.h @@ -18,4 +18,5 @@ typedef char F_SYMBOL; void c_to_factor_toplevel(CELL quot); long exception_handler(PEXCEPTION_POINTERS pe); +bool console_open; void open_console(void);