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/extra/ui/windows/windows.factor b/extra/ui/windows/windows.factor index 7c7e0298fe..43b30d7a9f 100755 --- a/extra/ui/windows/windows.factor +++ b/extra/ui/windows/windows.factor @@ -383,7 +383,7 @@ M: windows-ui-backend (close-window) >r class-name-ptr get-global f r> >r >r >r ex-style r> r> WS_CLIPSIBLINGS WS_CLIPCHILDREN bitor style bitor - 0 0 r> + CW_USEDEFAULT dup r> get-RECT-dimensions f f f GetModuleHandle f CreateWindowEx dup win32-error=0/f ; diff --git a/misc/factor.sh b/misc/factor.sh new file mode 100755 index 0000000000..eb231cd565 --- /dev/null +++ b/misc/factor.sh @@ -0,0 +1,215 @@ +#!/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_clean() { + make clean + check_ret make +} + +make_factor() { + make $MAKE_TARGET -j5 + 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_clean + 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 new file mode 100644 index 0000000000..c712c7d053 --- /dev/null +++ b/vm/Config.windows.nt @@ -0,0 +1,8 @@ +LIBS = -lm +EXE_SUFFIX=-nt +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 +include vm/Config.windows diff --git a/vm/Config.windows.nt.x86.32 b/vm/Config.windows.nt.x86.32 index adc69b1e27..9a020a7bc1 100644 --- a/vm/Config.windows.nt.x86.32 +++ b/vm/Config.windows.nt.x86.32 @@ -1,7 +1,3 @@ -LIBS = -lm -EXE_SUFFIX=-nt -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 -include vm/Config.x86.32 vm/Config.windows +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/debug.c b/vm/debug.c index 55ffcadca6..2692bdf59c 100755 --- a/vm/debug.c +++ b/vm/debug.c @@ -213,6 +213,7 @@ void dump_objects(F_FIXNUM type) void factorbug(void) { reset_stdio(); + open_console(); printf("Starting low level debugger...\n"); printf(" Basic commands:\n"); diff --git a/vm/factor.c b/vm/factor.c index 690f5d490c..8719416b72 100755 --- a/vm/factor.c +++ b/vm/factor.c @@ -26,6 +26,7 @@ void default_parameters(F_PARAMETERS *p) p->secure_gc = false; p->fep = false; + p->console = false; } /* Get things started */ @@ -110,6 +111,8 @@ void init_factor_from_args(F_CHAR *image, int argc, F_CHAR **argv, bool embedded p.fep = true; else if(STRNCMP(argv[i],STR_FORMAT("-i="),3) == 0) p.image = argv[i] + 3; + else if(STRCMP(argv[i],STR_FORMAT("-console")) == 0) + p.console = true ; } init_factor(&p); @@ -135,6 +138,9 @@ void init_factor_from_args(F_CHAR *image, int argc, F_CHAR **argv, bool embedded nest_stacks(); + if(p.console) + open_console(); + if(p.fep) factorbug(); diff --git a/vm/image.h b/vm/image.h index 52b666254e..3774263031 100755 --- a/vm/image.h +++ b/vm/image.h @@ -32,6 +32,7 @@ typedef struct { CELL code_size; bool secure_gc; bool fep; + bool console; } F_PARAMETERS; void load_image(F_PARAMETERS *p); diff --git a/vm/os-unix.c b/vm/os-unix.c index 303c01491a..437a528fb8 100644 --- a/vm/os-unix.c +++ b/vm/os-unix.c @@ -256,3 +256,5 @@ void reset_stdio(void) fcntl(0,F_SETFL,0); fcntl(1,F_SETFL,0); } + +void open_console(void) { } diff --git a/vm/os-unix.h b/vm/os-unix.h index cbce7de985..85f760b5aa 100755 --- a/vm/os-unix.h +++ b/vm/os-unix.h @@ -39,3 +39,4 @@ s64 current_millis(void); void sleep_millis(CELL msec); void reset_stdio(void); +void open_console(void); diff --git a/vm/os-windows-ce.c b/vm/os-windows-ce.c index 1465e0c89f..e68a6385ae 100755 --- a/vm/os-windows-ce.c +++ b/vm/os-windows-ce.c @@ -46,3 +46,5 @@ void c_to_factor_toplevel(CELL quot) { c_to_factor(quot); } + +void open_console(void) { } diff --git a/vm/os-windows-ce.h b/vm/os-windows-ce.h index 959de89634..f1d6df6f3d 100755 --- a/vm/os-windows-ce.h +++ b/vm/os-windows-ce.h @@ -24,3 +24,4 @@ char *getenv(char *name); s64 current_millis(void); void c_to_factor_toplevel(CELL quot); +void open_console(void); diff --git a/vm/os-windows-nt.c b/vm/os-windows-nt.c index baa0a06c4b..be9dde1fa8 100755 --- a/vm/os-windows-nt.c +++ b/vm/os-windows-nt.c @@ -88,3 +88,17 @@ void c_to_factor_toplevel(CELL quot) c_to_factor(quot); RemoveVectoredExceptionHandler((void*)exception_handler); } + +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 f7c56c129d..9e451f0301 100755 --- a/vm/os-windows-nt.h +++ b/vm/os-windows-nt.h @@ -18,3 +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);