diff --git a/C/save.c b/C/save.c index a424f80b3..03bb74554 100755 --- a/C/save.c +++ b/C/save.c @@ -1820,7 +1820,6 @@ Restore(char *s, char *lib_dir USES_REGS) initIO(); /* reset time */ Yap_ReInitWallTime(); - Yap_InitSysPath(); #if USE_DL_MALLOC || USE_SYSTEM_MALLOC if (!AuxSp) { Yap_InitPreAllocCodeSpace( 0 ); diff --git a/C/sysbits.c b/C/sysbits.c index a240780eb..c5c076f59 100644 --- a/C/sysbits.c +++ b/C/sysbits.c @@ -116,7 +116,7 @@ static int chdir(char *); void exit(int); -#ifdef _WIN32 +#ifdef __WINDOWS__ void Yap_WinError(char *yap_error) { @@ -211,119 +211,120 @@ Yap_dir_separator (int ch) char *libdir = NULL; #endif -void -Yap_InitSysPath(void) { +static Int +initSysPath(Term tlib, Term tcommons) { CACHE_REGS int len; int dir_done = FALSE; int commons_done = FALSE; -#if _MSC_VER || defined(__MINGW32__) + Int rcl, rcc; + +#if _MSC_VER || defined(__MINGW32__) || defined(__MSYS__) { char *dir; if ((dir = Yap_RegistryGetString("library")) && is_directory(dir)) { - Yap_PutValue(AtomSystemLibraryDir, - MkAtomTerm(Yap_LookupAtom(dir))); - dir_done = TRUE; + if (! Yap_unify( tlib, + MkAtomTerm(Yap_LookupAtom(dir))) ) + return FALSE; } if ((dir = Yap_RegistryGetString("prolog_commons")) && is_directory(dir)) { - Yap_PutValue(AtomPrologCommonsDir, - MkAtomTerm(Yap_LookupAtom(dir))); - commons_done = TRUE; + if (! Yap_unify( tcommons, + MkAtomTerm(Yap_LookupAtom(dir))) ) + return FALSE; } } if (dir_done && commons_done) - return; + return rcl && rcc; #endif strncpy(LOCAL_FileNameBuf, YAP_SHAREDIR, YAP_FILENAME_MAX); - if (is_directory(LOCAL_FileNameBuf)) { - strncat(LOCAL_FileNameBuf,"/", YAP_FILENAME_MAX); - len = strlen(LOCAL_FileNameBuf); + strncat(LOCAL_FileNameBuf,"/", YAP_FILENAME_MAX); + len = strlen(LOCAL_FileNameBuf); + if (!dir_done) { strncat(LOCAL_FileNameBuf, "Yap", YAP_FILENAME_MAX); -#if _MSC_VER || defined(__MINGW32__) - if (!dir_done && is_directory(LOCAL_FileNameBuf)) -#endif + if (is_directory(LOCAL_FileNameBuf)) { - Yap_PutValue(AtomSystemLibraryDir, - MkAtomTerm(Yap_LookupAtom(LOCAL_FileNameBuf))); -#if _MSC_VER || defined(__MINGW32__) - dir_done = TRUE; - return; -#endif + if (! Yap_unify( tlib, + MkAtomTerm(Yap_LookupAtom(LOCAL_FileNameBuf))) ) + return FALSE; } -#if _MSC_VER || defined(__MINGW32__) - if (!commons_done) -#endif - { - LOCAL_FileNameBuf[len] = '\0'; - strncat(LOCAL_FileNameBuf, "PrologCommons", YAP_FILENAME_MAX); - if (is_directory(LOCAL_FileNameBuf)) - Yap_PutValue(AtomPrologCommonsDir, - MkAtomTerm(Yap_LookupAtom(LOCAL_FileNameBuf))); -#if _MSC_VER || defined(__MINGW32__) - commons_done = TRUE; -#endif + } + if (!commons_done) { + LOCAL_FileNameBuf[len] = '\0'; + strncat(LOCAL_FileNameBuf, "PrologCommons", YAP_FILENAME_MAX); + if (is_directory(LOCAL_FileNameBuf)) { + if (! Yap_unify( tcommons, + MkAtomTerm(Yap_LookupAtom(LOCAL_FileNameBuf))) ) + return FALSE; } } if (dir_done && commons_done) - return; + return rcl && rcc; -#if _MSC_VER || defined(__MINGW32__) +#if __WINDOWS__ { size_t buflen; char *pt; - - /* couldn't find it where it was supposed to be, - let's try using the executable */ - if (!GetModuleFileName( NULL, LOCAL_FileNameBuf, YAP_FILENAME_MAX)) { - Yap_Error(OPERATING_SYSTEM_ERROR, TermNil, "could not find executable name"); + + /* couldn't find it where it was supposed to be, + let's try using the executable */ + if (!GetModuleFileName( NULL, LOCAL_FileNameBuf, YAP_FILENAME_MAX)) { + Yap_WinError( "could not find executable name" ); + /* do nothing */ + return FALSE; + } + buflen = strlen(LOCAL_FileNameBuf); + pt = LOCAL_FileNameBuf+buflen; + while (*--pt != '\\') { + /* skip executable */ + if (pt == LOCAL_FileNameBuf) { + Yap_Error(OPERATING_SYSTEM_ERROR, TermNil, "could not find executable name"); /* do nothing */ - return; + return FALSE; } - buflen = strlen(LOCAL_FileNameBuf); - pt = LOCAL_FileNameBuf+buflen; - while (*--pt != '\\') { - /* skip executable */ - if (pt == LOCAL_FileNameBuf) { - Yap_Error(OPERATING_SYSTEM_ERROR, TermNil, "could not find executable name"); - /* do nothing */ - return; - } + } + while (*--pt != '\\') { + /* skip parent directory "bin\\" */ + if (pt == LOCAL_FileNameBuf) { + Yap_Error(OPERATING_SYSTEM_ERROR, TermNil, "could not find executable name"); + /* do nothing */ + return FALSE; } - while (*--pt != '\\') { - /* skip parent directory "bin\\" */ - if (pt == LOCAL_FileNameBuf) { - Yap_Error(OPERATING_SYSTEM_ERROR, TermNil, "could not find executable name"); - /* do nothing */ - } - } - /* now, this is a possible location for the ROOT_DIR, let's look for a share directory here */ - pt[1] = '\0'; - /* grosse */ - strncat(LOCAL_FileNameBuf,"lib\\Yap",YAP_FILENAME_MAX); - libdir = Yap_AllocCodeSpace(strlen(LOCAL_FileNameBuf)+1); - strncpy(libdir, LOCAL_FileNameBuf, strlen(LOCAL_FileNameBuf)+1); - pt[1] = '\0'; - strncat(LOCAL_FileNameBuf,"share",YAP_FILENAME_MAX); + } + /* now, this is a possible location for the ROOT_DIR, let's look for a share directory here */ + pt[1] = '\0'; + /* grosse */ + strncat(LOCAL_FileNameBuf,"lib\\Yap",YAP_FILENAME_MAX); + libdir = Yap_AllocCodeSpace(strlen(LOCAL_FileNameBuf)+1); + strncpy(libdir, LOCAL_FileNameBuf, strlen(LOCAL_FileNameBuf)+1); + pt[1] = '\0'; + strncat(LOCAL_FileNameBuf,"share",YAP_FILENAME_MAX); } strncat(LOCAL_FileNameBuf,"\\", YAP_FILENAME_MAX); len = strlen(LOCAL_FileNameBuf); strncat(LOCAL_FileNameBuf, "Yap", YAP_FILENAME_MAX); - if (!dir_done && is_directory(LOCAL_FileNameBuf)) - { - Yap_PutValue(AtomSystemLibraryDir, - MkAtomTerm(Yap_LookupAtom(LOCAL_FileNameBuf))); - } - if (!commons_done) - { - LOCAL_FileNameBuf[len] = '\0'; - strncat(LOCAL_FileNameBuf, "PrologCommons", YAP_FILENAME_MAX); - if (is_directory(LOCAL_FileNameBuf)) - Yap_PutValue(AtomPrologCommonsDir, - MkAtomTerm(Yap_LookupAtom(LOCAL_FileNameBuf))); - } + if (!dir_done && is_directory(LOCAL_FileNameBuf)) { + if (! Yap_unify( tlib, + MkAtomTerm(Yap_LookupAtom(LOCAL_FileNameBuf))) ) + return FALSE; + } + LOCAL_FileNameBuf[len] = '\0'; + strncat(LOCAL_FileNameBuf, "PrologCommons", YAP_FILENAME_MAX); + if (!commons_done && is_directory(LOCAL_FileNameBuf)) { + if (! Yap_unify( tcommons, + MkAtomTerm(Yap_LookupAtom(LOCAL_FileNameBuf))) ) + return FALSE; + } #endif + return dir_done && commons_done; +} + + +static Int +p_libraries_path( USES_REGS1 ) +{ + return initSysPath( ARG1, ARG2 ); } static Int @@ -3030,6 +3031,7 @@ Yap_InitSysPreds(void) Yap_InitCPred ("release_random_state", 1, p_release_random_state, SafePredFlag); #endif Yap_InitCPred ("log_event", 1, p_log_event, SafePredFlag|SyncPredFlag); + Yap_InitCPred ("library_directories", 2, p_libraries_path, SafePredFlag); Yap_InitCPred ("sh", 0, p_sh, SafePredFlag|SyncPredFlag); Yap_InitCPred ("$shell", 1, p_shell, SafePredFlag|SyncPredFlag|UserCPredFlag); Yap_InitCPred ("system", 1, p_system, SafePredFlag|SyncPredFlag|UserCPredFlag); diff --git a/H/Yapproto.h b/H/Yapproto.h index a624f2be0..7d3ed09c0 100755 --- a/H/Yapproto.h +++ b/H/Yapproto.h @@ -370,7 +370,6 @@ UInt Yap_cputime(void); Int Yap_walltime(void); int Yap_dir_separator(int); int Yap_volume_header(char *); -void Yap_InitSysPath(void); int Yap_signal_index(const char *); #ifdef MAC void Yap_SetTextFile(char *); diff --git a/H/pl-incl.h b/H/pl-incl.h index 8c3a0eb2d..093e3eba7 100755 --- a/H/pl-incl.h +++ b/H/pl-incl.h @@ -11,9 +11,12 @@ #ifdef __WINDOWS__ +#ifndef __MSYS__ #include +#endif #include + #if HAVE_XOS_H #include /* Windows POSIX enhancements */ #endif diff --git a/H/pl-shared.h b/H/pl-shared.h index baebda8ec..6c40de49d 100755 --- a/H/pl-shared.h +++ b/H/pl-shared.h @@ -23,7 +23,7 @@ #endif #ifndef __WINDOWS__ -#if defined(_MSC_VER) || defined(__MINGW32__) +#if defined(_MSC_VER) || defined(__MINGW32__) || defined(__MSYS__) #define __WINDOWS__ 1 #endif #endif diff --git a/Makefile.in b/Makefile.in index dee0f23eb..2ec93df47 100755 --- a/Makefile.in +++ b/Makefile.in @@ -511,13 +511,13 @@ JIT_Compiler.o: IT/JIT_Compiler.cpp $(CC) -c $(CFLAGS) $< -o $@ pl-ntcon.o: console/LGPL/pl-ntcon.c config.h - $(CC) -c $(CFLAGS) -DPL_CONSOLE=1 -I$(srcdir)/include $< -o $@ + $(CC) -c $(CFLAGS) -DUNICODE -D_UNICODE -DPL_CONSOLE=1 -I$(srcdir)/include $< -o $@ pl-ntconsole.o: console/LGPL/pl-ntconsole.c config.h - $(CC) -c $(CFLAGS) -DPL_CONSOLE=1 -I$(srcdir) -I$(srcdir)/include -I$(srcdir)/os @EXTRA_INCLUDES_FOR_WIN32@ $< -o $@ + $(CC) -c $(CFLAGS) -DUNICODE -D_UNICODE -DPL_CONSOLE=1 -I$(srcdir) -I$(srcdir)/include -I$(srcdir)/os @EXTRA_INCLUDES_FOR_WIN32@ $< -o $@ pl-ntmain.o: console/LGPL/pl-ntmain.c config.h - $(CC) -c $(CFLAGS) -DPL_CONSOLE=1 -I$(srcdir)/include -I$(srcdir) -I$(srcdir)/os @EXTRA_INCLUDES_FOR_WIN32@ $< -o $@ + $(CC) -c $(CFLAGS) -DUNICODE -D_UNICODE -DPL_CONSOLE=1 -I$(srcdir)/include -I$(srcdir) -I$(srcdir)/os @EXTRA_INCLUDES_FOR_WIN32@ $< -o $@ yapres.o: console/LGPL/yap.rc console/LGPL/manifest.xml config.h $(RC) $(RCFLAGS) -DUNICODE -D_UNICODE -DPL_CONSOLE=1 -I. -I$(srcdir)/include -I$(srcdir) -I$(srcdir)/os -I$(srcdir)/console/LGPL @EXTRA_INCLUDES_FOR_WIN32@ -i $< -o $@ @@ -667,6 +667,7 @@ install_common: install_startup mkdir -p $(DESTDIR)$(SHAREDIR) mkdir -p $(DESTDIR)$(SHAREDIR)/Yap mkdir -p $(DESTDIR)$(SHAREDIR)/PrologCommons + $(INSTALL) $(srcdir)/PrologCommons/PROLOGCOMMONS.md $(DESTDIR)$(SHAREDIR)/PrologCommons mkdir -p $(DESTDIR)$(SHAREDIR)/Yap/pl mkdir -p $(DESTDIR)$(DOCSDIR) mkdir -p $(DESTDIR)$(INCLUDEDIR) diff --git a/PrologCommons/PROLOGCOMMONS.md b/PrologCommons/PROLOGCOMMONS.md new file mode 100644 index 000000000..a2d50cd9d --- /dev/null +++ b/PrologCommons/PROLOGCOMMONS.md @@ -0,0 +1,8 @@ + +This directory should hold files from the Prolog Commons +project. Please see + + http://prolog-commons.org + +for detailed information on the Prolog Commons initiative. + diff --git a/config.h.in b/config.h.in index 801ddd680..1582d5f94 100644 --- a/config.h.in +++ b/config.h.in @@ -337,9 +337,6 @@ /* Define to 1 if you have the header file. */ #undef HAVE_IEEEFP_H -/* Define to 1 if you have the header file. */ -#undef HAVE_INTSAFE_H - /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H @@ -959,6 +956,9 @@ /* what is the configure host name */ #undef HOST_ALIAS +/* type of int64_t */ +#undef INT64_T_DEFINED + /* malloc_t */ #undef MALLOC_T diff --git a/configure b/configure index 2bc6b237a..2173bb01b 100755 --- a/configure +++ b/configure @@ -784,6 +784,7 @@ STARTUP_ANDROID ARCH M4GENHDRS M4 +INT64_T_DEFINED PRE_INSTALL_ENV INSTALL_ENV PKG_PRISM @@ -1941,52 +1942,6 @@ $as_echo "$ac_res" >&6; } } # ac_fn_c_check_header_compile -# ac_fn_c_try_link LINENO -# ----------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - test -x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_link - # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using @@ -2078,6 +2033,52 @@ fi } # ac_fn_c_check_header_mongrel +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly @@ -5606,6 +5607,19 @@ $as_echo "no" >&6; } fi +for ac_header in winsock.h winsock2.h windows.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + # Extract the first word of "sh", so it can be a program name with args. set dummy sh; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 @@ -6936,31 +6950,6 @@ fi fi -for ac_header in IntSafe.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "IntSafe.h" "ac_cv_header_IntSafe_h" "$ac_includes_default" -if test "x$ac_cv_header_IntSafe_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_INTSAFE_H 1 -_ACEOF - -fi - -done - -for ac_header in windows.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "windows.h" "ac_cv_header_windows_h" "$ac_includes_default" -if test "x$ac_cv_header_windows_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_WINDOWS_H 1 -_ACEOF - -fi - -done - - if test "$threads" = yes then for ac_header in pthread.h @@ -7658,7 +7647,7 @@ fi INSTALL_ENV="YAPSHAREDIR=\$(DESTDIR)\$(SHAREDIR) YAPLIBDIR=\$(DESTDIR)\$(YAPLIBDIR)" fi ;; - *cyg*|*mingw*) + *cyg*|*mingw*|*msys*) # gcc on cygwin seems to have trouble with longjmp # and -fomit-frame-point -DBP_FREE YAPLIB="yap.dll" @@ -8277,13 +8266,12 @@ fi done -for ac_header in wctype.h winsock.h winsock2.h +for ac_header in wctype.h do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + ac_fn_c_check_header_mongrel "$LINENO" "wctype.h" "ac_cv_header_wctype_h" "$ac_includes_default" +if test "x$ac_cv_header_wctype_h" = xyes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_WCTYPE_H 1 _ACEOF fi @@ -8958,6 +8946,48 @@ cat >>confdefs.h <<_ACEOF _ACEOF +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether int64_t is defined" >&5 +$as_echo_n "checking whether int64_t is defined... " >&6; } +if ${yap_cv_int64_t_defined+:} false; then : + $as_echo_n "(cached) " >&6 +else + +if test "$cross_compiling" = yes; then : + yap_cv_int64_t_defined=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + int main() { + int64_t i; + return 0; + } + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + yap_cv_int64_t_defined=yes +else + yap_cv_int64_t_defined=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $yap_cv_int64_t_defined" >&5 +$as_echo "$yap_cv_int64_t_defined" >&6; } +if test $yap_cv_int64_t_defined = yes +then + +cat >>confdefs.h <<_ACEOF +#define INT64_T_DEFINED 1 +_ACEOF + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for int64_t" >&5 +$as_echo_n "checking for int64_t... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for type of malloc" >&5 $as_echo_n "checking for type of malloc... " >&6; } @@ -10287,11 +10317,11 @@ if test "x$PLARCH" = "x"; then *linux*) PLARCH=`echo $host | sed 's/-.*/-linux/'` ;; - i?86-*mingw32*) + i?86-*mingw32*|i?86-msys*) # Make PLARCH match the definition in src/config/win32.h PLARCH=i386-win32 ;; - x86_64-*mingw32*) + x86_64-*mingw32*|x86_64-msys*) # Make PLARCH match the definition in src/config/win64.h PLARCH=x64-win64 ;; @@ -13063,7 +13093,7 @@ elif test -d "$cudd_dir/lib"; then LIBS="$LIBS -L $cudd_dir/lib" fi -if test "$target_os" = "mingw32" -o "$target_os" = "mingw64" +if test "$target_os" = "mingw32" -o "$target_os" = "mingw64" -o "$target_os" = "msys" then #mingw: we know where things are CUDD_LIBS="$cudd_dir/lib/all_cudd.dll" @@ -14079,7 +14109,7 @@ else JAVA_TEST=Test.java CLASS_TEST=Test.class cat << \EOF > $JAVA_TEST -/* #line 14082 "configure" */ +/* #line 14112 "configure" */ public class Test { } EOF @@ -14255,7 +14285,7 @@ EOF if uudecode$EXEEXT Test.uue; then ac_cv_prog_uudecode_base64=yes else - echo "configure: 14258: uudecode had trouble decoding base 64 file 'Test.uue'" >&5 + echo "configure: 14288: uudecode had trouble decoding base 64 file 'Test.uue'" >&5 echo "configure: failed file was:" >&5 cat Test.uue >&5 ac_cv_prog_uudecode_base64=no @@ -14386,7 +14416,7 @@ else JAVA_TEST=Test.java CLASS_TEST=Test.class cat << \EOF > $JAVA_TEST -/* #line 14389 "configure" */ +/* #line 14419 "configure" */ public class Test { } EOF @@ -14421,7 +14451,7 @@ JAVA_TEST=Test.java CLASS_TEST=Test.class TEST=Test cat << \EOF > $JAVA_TEST -/* [#]line 14424 "configure" */ +/* [#]line 14454 "configure" */ public class Test { public static void main (String args[]) { System.exit (0); diff --git a/configure.in b/configure.in index 4e3d0d424..3ba69c34c 100755 --- a/configure.in +++ b/configure.in @@ -517,7 +517,8 @@ AC_PROG_INSTALL AC_PROG_RANLIB AC_CHECK_TOOL(AR,[ar],:) AC_PATH_PROG(INSTALL_INFO,install-info,true,$PATH:/sbin:/usr/sbin:/usr/etc:/usr/local/sbin) -AC_CHECK_HEADERS(winsock.h winsock2.h) +dnl do this before windows.h +AC_CHECK_HEADERS(winsock.h winsock2.h windows.h) AC_PATH_PROG(SHELL,sh) AC_CHECK_TOOL([INDENT], [indent], [:]) @@ -661,9 +662,6 @@ if test "$yap_cv_judy" != "no"; then AC_CHECK_LIB(Judy, Judy1Set,,[AC_MSG_RESULT([libJudy not found, UDI will only work with one Index at a time])]) fi -AC_CHECK_HEADERS(IntSafe.h) -AC_CHECK_HEADERS(windows.h) - if test "$threads" = yes then AC_CHECK_HEADERS(pthread.h) @@ -1091,7 +1089,7 @@ dnl Linux has both elf and a.out, in this case we found elf INSTALL_ENV="YAPSHAREDIR=\$(DESTDIR)\$(SHAREDIR) YAPLIBDIR=\$(DESTDIR)\$(YAPLIBDIR)" fi ;; - *cyg*|*mingw*) + *cyg*|*mingw*|*msys*) # gcc on cygwin seems to have trouble with longjmp # and -fomit-frame-point -DBP_FREE YAPLIB="yap.dll" @@ -1918,11 +1916,11 @@ if test "x$PLARCH" = "x"; then *linux*) PLARCH=`echo $host | sed 's/-.*/-linux/'` ;; - i?86-*mingw32*) + i?86-*mingw32*|i?86-msys*) # Make PLARCH match the definition in src/config/win32.h PLARCH=i386-win32 ;; - x86_64-*mingw32*) + x86_64-*mingw32*|x86_64-msys*) # Make PLARCH match the definition in src/config/win64.h PLARCH=x64-win64 ;; diff --git a/console/LGPL/pl-ntmain.c b/console/LGPL/pl-ntmain.c index fcc30ee93..a9da3abc3 100755 --- a/console/LGPL/pl-ntmain.c +++ b/console/LGPL/pl-ntmain.c @@ -28,7 +28,7 @@ #define MAX_FILE_NAME 1024 #include "config.h" #include "console/LGPL/resource.h" -#ifdef THREADSx +#ifdef THREADS #define O_PLMT 1 #endif #else @@ -1087,7 +1087,7 @@ set_window_title(rlc_console c) int v = (int)PL_query(PL_QUERY_VERSION); int major = v / 10000; int minor = (v / 100) % 100; - int patch = v % 100; + int patch = v / 100; #ifdef O_PLMT TCHAR *mt = _T("Multi-threaded, "); #else diff --git a/docs/doxygen.rc b/docs/doxfull.rc similarity index 100% rename from docs/doxygen.rc rename to docs/doxfull.rc diff --git a/docs/doxygens.rc b/docs/doxsmall.rc similarity index 99% rename from docs/doxygens.rc rename to docs/doxsmall.rc index 63fc64912..16d6f0734 100644 --- a/docs/doxygens.rc +++ b/docs/doxsmall.rc @@ -367,7 +367,7 @@ SUBGROUPING = YES # SEPARATE_MEMBER_PAGES. # The default value is: NO. -INLINE_GROUPED_CLASSES = NO +INLINE_GROUPED_CLASSES = YES # When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions # with only public data fields or simple typedef fields will be shown inline in @@ -551,7 +551,7 @@ SORT_MEMBER_DOCS = YES # this will also influence the order of the classes in the class list. # The default value is: NO. -SORT_BRIEF_DOCS = NO +SORT_BRIEF_DOCS = YES # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the # (brief and detailed) documentation of class members so that constructors and @@ -563,7 +563,7 @@ SORT_BRIEF_DOCS = NO # detailed member documentation. # The default value is: NO. -SORT_MEMBERS_CTORS_1ST = NO +SORT_MEMBERS_CTORS_1ST = yes # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy # of group names into alphabetical order. If set to NO the group names will @@ -655,7 +655,7 @@ SHOW_FILES = YES # Folder Tree View (if specified). # The default value is: YES. -SHOW_NAMESPACES = NO +SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from @@ -770,7 +770,6 @@ WARN_LOGFILE = #INPUT = /Users/vsc/git/yap-6.3/packages/R/R.pl INPUT = foreigns.yap docs/yap.md pl swi C H include os packages library CXX OPTYap - # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses @@ -1602,7 +1601,7 @@ MAKEINDEX_CMD_NAME = makeindex # The default value is: NO. # This tag requires that the tag GENERATE_LATEX is set to YES. -COMPACT_LATEX = NO +COMPACT_LATEX = YES # The PAPER_TYPE tag can be used to set the paper type that is used by the # printer. @@ -1723,7 +1722,9 @@ GENERATE_RTF = NO # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of # it. # The default directory is: rtf. -# This tag requires that the tag GENERATE_RTF is set to YES. +# This tag requires that the tag GENERATE_RTb + +F is set to YES. RTF_OUTPUT = rtf diff --git a/docs/yap.md b/docs/yap.md index 4bf3bebe8..ecc63b32d 100644 --- a/docs/yap.md +++ b/docs/yap.md @@ -370,70 +370,91 @@ CC="gcc -mabi=64" ./configure --... Be careful. At least for some versions of `GCC`, compiling with `-g` seems to result in broken code. - + WIN32: GCC is distributed in the MINGW32 and CYGWIN packages. - -The Mingw32 environment is available from the URL: - - - -You will need to install the `msys` and `mingw` -packages. You should be able to do configure, make and make install. - -If you use mingw32 you may want to search the contributed packages for -the `gmp` multi-precision arithmetic library. If you do setup YAP -with `gmp` note that libgmp.dll must be in the path, -otherwise YAP will not be able to execute. - -The CygWin environment is available from the URL: - - - -and mirrors. We suggest using recent versions of the cygwin shell. The -compilation steps under the cygwin shell are as follows: - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -mkdir cyg -$YAPSRC/configure --enable-coroutining \\ - --enable-depth-limit \\ - --enable-max-performance -make -make install -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -By default, YAP will use the `-mno-cygwin` option to -disable the use of the cygwin dll and to enable the mingw32 subsystem -instead. YAP thus will not need the cygwin dll. It instead accesses -the system's CRTDLL.DLL `C` run time library supplied with -Win32 platforms through the mingw32 interface. Note that some older -WIN95 systems may not have CRTDLL.DLL, in this case it should -be sufficient to import the file from a newer WIN95 or WIN98 machine. - -You should check the default installation path which is set to -/YAP in the standard Makefile. This string will usually -be expanded into c:\\YAP by Windows. - -The cygwin environment does not provide gmp on the MINGW -subsystem. You can fetch a dll for the gmp library from -. - -It is also possible to configure YAP to be a part of the cygwin -environment. In this case you should use: - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -mkdir cyg -$YAPSRC/configure --enable-max-performance \\ - --enable-cygwin=yes -make -make install -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -YAP will then compile using the cygwin library and will be installed -in cygwin's /usr/local. You can use YAP from a cygwin console, -or as a standalone application as long as it can find -cygwin1.dll in its path. Note that you may use to use -`--enable-depth-limit` for Aleph compatibility, and that you may -want to be sure that GMP is installed. +@section Compiling_under_mingw Compiling Under MINGW's GCC +AT the time of this writing (Nov 2014), YAP uses the mkwin script to +compile in WIN32. The script requires either a WIN32 environment, or a +cross-compiler/emulator package. + +YAP has been known to compile under VISUAL C++, and should compile and +work under cygwin, but the favorite approach is to use a native +msys/mingw environment. This approach has two key advantages: + + + it does not need an interface layer and a DLL, like cygwin. + + + it enables cross-compilation. + +YAP uses rge `mkwin` script to generate a new YAP installer. The script is +controlled by a set of of variables that should be defined early on in +the text. It executes by first calling `configure`, next running `make`, and +last (if all went well) executing `nsys`. + +In more detail, the following mingw based environments have been +tested to develop YAP: + + * MSYS 1 and mingw32/64: most WIN32 development did occur in this + native environment. Best results were achieved with + MSYS-1.0.* and TDM-GCC: + + mingw: http://www.mingw.org/ + original msys: http://www.mingw.org/wiki/MSYS + mingw64: http://mingw-w64.sourceforge.net/ + TDM-GCC: http://tdm-gcc.tdragon.net/ + + * This distribution was compiled with the MSYS2 integrated + development, that supports 32 and 64 bit compilation. Setting up + MSYS2 should be done with care, but it is worth it as the + distribution works nicely in MINGW32 and MINGW64 mode. A third + compilation mode, MSYS mode, has problems with compiling sockets. + + msys2: http://sourceforge.net/projects/msys2/ + + * cygwin and cygwin64 now can generate native applications + + cygwin: https://www.cygwin.com/ + + * Linux has a nice cross-compilation environment, with some of the best + work done for Fedora. + + fedora mingw cross-compiler: http://fedoraproject.org/wiki/MinGW/CrossCompilerFramework + + One problem is that this environment requires emulation of WIN32 + executables to generate the initial saved state and to compile + `chr`. `wine` sometimes does the task, but it sometimes fails. + + * OSX has the `mxe` package, a port of mingw that is in active + development. + + mxe: http://mxe.cc/ + + Note that OSX has technical limitations that preclude porting + wine64. wine32 is distributed with package managers such as ports + and brew. + +=== Setting up WIN32 compilation + +Compiling WIN32 packages depends on a number of parameters: chosen compiler, +packages to install, directory setup. You may have to change these ones that +control the `mkwin` script: + + * `VER`: major/minor number + * `PATCHID`: third digit + * `SRC`: directory containing yap sources, in the local environment notation. + * `SRC_WIN`: same, but in WIN32 standard notation. + * `THREADS`: yes or no? controllable from the command line. + * `ABI`: "32" or "64", controllable from the command line. + * `NSIS`: installer generator, usually "/c/Program Files (x86)/NSIS/makensis". + * `DOCS_DIR`: where you have the doxygen output. + * `GCC_DIR`: root of gcc seup. + * `HOST`: argument to `--host` configure command. + * `BUILD`: build directory + * `GMP`: multi-precision package; yes, no, or the installation directory; usually in the distribution. + * `CUDD`: BDD package, usually in the distribution. + * `JAVA`: Java sdk directory, usually in the distribution. + * `PYTHON`: Python package, usually in the distribution. + * `R`: R environment package, usually in the distribution. + * `GECODE`: constraint solver package, usually not in the WIN32 distribution. @subsection Compiling_Under_Visual_C Compiling Under Visual C++ diff --git a/misc/mkwin b/misc/mkwin index 1f7f75624..df1379ce2 100755 --- a/misc/mkwin +++ b/misc/mkwin @@ -1,4 +1,4 @@ -#!/bin/sh +# !/bin/sh # # script for compiling and installing YAP under msys. Uses a mingw64 # compiler, msys shell and nsis to do the installing @@ -14,30 +14,44 @@ # # http://sourceforge.net/projects/mingwbuilds/ # PS: don't install in the default location. -# mingw should avoid space in its directory, +# mingw should avoid space in its directory path, # it freaks winres out. # http://nsis.sourceforge.net/Main_Page # # -YHOME=/y/vsc -VERSION=6.3.4 -#cross-compiler for OSX, see http://mxe.cc/ -#notice that OSX does not allow WIN64 emulation (wine64) -MXE=$HOME/Yap/mxe/usr -# by default, compile without threads -THREADS=no -# use 64 bits -ABI=64 +for YHOME in /y/vsc /z /home/vsc /home/vitor /Users/vsc /u/vitor; +do + if test -d $YHOME/Yap + then + break + fi +done -SRC=/c/cygwin/Yap/yap-6.3 +# assumes o mingw32/mingw64 compiler +# native sh like env: msys usually, such as +# http://msys2.sourceforge.net/ +# + +# Major and Minor +VER="6.3" +# Patch +PATCHID="4" +# SRC in the way it loks to the script +SRC=/c/cygwin/yap-"$VER" +# the way it looks to win32 +SRC_WIN="c:\\cygwin\\yap-${VER}" #SRC=/l/work/noth/git #SRC_WIN=L:\\work\\noth\\git #SRC="$HOME"/git/yap-6.3 -TARGET=/c/Yap64 +# do we support THREADS +THREADS=no +# makes install bundle NSIS="/c/Program Files (x86)/NSIS/makensis" -# by default, "" +# emulator, by default, "" PREFIX_CMD=wine +VERSION="$VER"."$PATCHID" +ABI=64 I=$# while test $I -gt 0 do @@ -47,6 +61,14 @@ do elif test $1 = no_threads then THREADS=no + elif test $1 = all + then + rm -rf /c/Yap/* + rm -rf /c/Yap64/* + "$SRC"/misc/mkwin 32 + "$SRC"/misc/mkwin 32 threads + "$SRC"/misc/mkwin 64 + "$SRC"/misc/mkwin 64 threads elif test $1 = 32 then ABI=32 @@ -57,120 +79,108 @@ do echo "received \"$1\", should be one of threads, no_threads, 32, 64" fi I=$(( $I - 1 )) + shift done # srcdir comes from here, please avoid relative paths CONFIGURE="$SRC"/configure -DEBUG=" --enable-debug-yap --enable-low-level-tracer" +#DEBUG=" --enable-debug-yap --enable-low-level-tracer" +DEBUG= # debugging setup -do_compile=true -do_install=true +do_compile=yes +do_install=yes # HOME WIN64 configuration # DOCS_DIR=/l/work/noth/yapdocs -DOCS_DIR="$YHOME"/Yap/bins/threads - -if test "$THREADS" = yes; then - FULL_VERSION="$VERSION"-threads -else - FULL_VERSION="$VERSION" -fi +DOCS_DIR="$YHOME"/Yap/doxout if test $ABI = 64; then - BUILD=/c/cygwin/Yap/mingw"$ABI" - #GCC_DIR=/l/Work/noth/mingw-w64/x86_64-4.9.0-posix-seh-rt_v3-rev1/mingw64 + TARGET=YAP64 case $( uname ) in *Darwin*) GCC_DIR="$MXE" HOST="x86_64-w64-mingw32" - LIB_PATH="$MXE"/"$HOST"/lib + BUILD=/c/cygwin/Yap/mingw"$ABI" ;; *MINGW64*) - GCC_DIR=/c/TDM-GCC-64 + # GCC_DIR=/l/Work/noth/mingw-w64/x86_64-4.9.0-posix-seh-rt_v3-rev1/mingw64 + # GCC_DIR=/c/TDM-GCC-64 + GCC_DIR=/c/msys64/MinGW64 HOST="x86_64-w64-mingw32" - LIB_PATH="$GCC_DIR"/"$HOST"/lib + ;; + MSYS*) + # GCC_DIR=/c/TDM-GCC-64 + GCC_DIR=/c/msys64 + HOST="x86_64-pc-msys" + BLD="--build=$HOST" ;; esac # ok. # BDD compiler package. Get version that compiles on Windows from Vitor! # GMP=/l/Work/noth/msys/1.0/local - GMP=/c/msys64/usr/win64 + GMP=yes #/c/msys64/usr/win64 CUDD=/c/cygwin/Yap/cudd-2.5.0-mingw64 GECODE=no # "/c/Program Files/Gecode" JAVA="$( echo /c/Program\ Files/Java/jdk* )" - PYTHON="/c/Python33-64" - R="$( echo /c/Program\ Files/R/R-*/bin/x64 )" - -fi - + # "/c/Python33-64" + PYTHON=yes + R="$( echo /c/Program\ Files/R/R-*/bin/x64* )" # HOME WIN32 configuration -if test $ABI = 32; then - ABI=32 +elif test $ABI = 32; then + TARGET=YAP case $( uname ) in *Darwin*) #use mxe as a cross compiler - GCC_DIR="$MXE"/bin - PATH="$GCC_DIR":"$PATH" + GCC_DIR="$MXE" HOST="i686-pc-mingw32" - LIB_PATH="$MXE"/"$HOST"/lib - GECODE=no # install only allows one of 32 or 64 bits - GMP=yes - JAVA=no - PYTHON=no - REAL=no + GMP=/c/msys64/usr/win32 ;; - esac - - case $( uname ) in - *Darwin*) - GCC_DIR="$MXE" - HOST="x86_64-w64-mingw32" - LIB_PATH="$MXE"/"$HOST"/lib - ;; - *MINGW64*) - GCC_DIR=/c/TDM-GCC-64 - HOST="x86_64-w64-mingw32" - LIB_PATH="$GCC_DIR"/"$HOST"/lib + *MINGW32*) + GCC_DIR=/c/msys64/mingw32 + HOST="i686-w64-mingw32" + GMP=yes ;; esac # ok. # BDD compiler package. Get version that compiles on Windows from Vitor! # GMP=/l/Work/noth/msys/1.0/local - GMP=/c/msys64/usr/win32 CUDD=/c/cygwin/Yap/cudd-2.5.0-mingw32 GECODE=no # "/c/Program Files/Gecode" - JAVA="$( echo /c/Program\ Files\ */Java/jdk* )" - PYTHON="/c/Python27" + JAVA="$( echo /c/Program\ Files\ *x86*/Java/jdk* )" + #"/c/Python27/DLLs" + PYTHON=yes R="$( echo /c/Program\ Files/R/R-*/bin/i* )" - HOST+=" --enable-abi=32" - + # HOST=" --enable-abi=32" fi +if test x"$THREADS" = xyes; then + EXTRA_THREADS="-threads" +fi + +for BUILD in /c/cygwin/Yap "$HOME"/Yap/bins . +do + if test -d $BUILD; then break; fi +done +BUILD+="/mingw""$ABI""$EXTRA_THREADS" + + export PATH="$GCC_DIR"/bin:"$PATH" # echo "gcc= " $GCC_DIR -# echo "host= " $HOST if test x"$JAVA" != xno then export PATH="$PATH":"$JAVA"/bin fi if test x"$PYTHON" != xno then - export PATH="$PATH":"$PYTHON"/"python.exe" + export PATH="$PATH":"$PYTHON" fi if test x"$R" != xno then export PATH="$PATH":"$R" fi -if test ${THREADS} = yes -then - cp "$LIB_PATH"/libwinpthread-1.dll . - cp libwinpthread-1.dll pthreadGC2.dll -fi - - if test $CUDD != no then BDDLIB="yes" @@ -185,7 +195,7 @@ then export PATH="$PATH":"$GECODE"/bin fi -if test "$JAVA" = yes +if test x"$JAVA" != xno then export PATH="$PATH":"$JAVA"/bin fi @@ -205,49 +215,52 @@ then export PATH="$PATH":"$R" fi -if test do_compile = true -then - make distclean -fi +export INSTALL_SH=$SRC/yap-"$VERSION"/install.sh -export INSTALL_SH=$SRC/yap-6.3/install.sh # avoid using relative paths -if test "$do_compile" = true; then - BUILD=/c/cygwin/Yap/mingw"$ABI" +if test "$do_compile" = yes; then mkdir -p "$BUILD" + cd "$BUILD" +# make distclean # /bin/rm -rf "$BUILD"/* - "$CONFIGURE" --host="$HOST" \ - --prefix="$TARGET" $DEBUG\ + "$CONFIGURE" --host="$HOST" "$BLD" \ + --prefix=/c/"$TARGET" $DEBUG\ --with-R="$R" \ --with-java="$JAVA" \ --with-gmp="$GMP" \ - --with-python="$PYTHON" \ + --with-python="$PYTHON"/python.exe \ --with-cudd="$CUDD" --enable-bddlib="$BDDLIB" --with-cplint="$CPLINT" \ --with-gecode="$GECODE" \ --enable-threads="$THREADS" --enable-pthread-locking make #-j 4 install fi -if test "$do_install" = true; then +if test "$do_install" = yes; then + make install + cp -a $DOCS_DIR/html /c/$TARGET/share/doc/Yap + cp $DOCS_DIR/latex/*pdf /c/$TARGET/share/doc/Yap + + DLL_PATH="$GCC_DIR"/bin + + cp "$DLL_PATH"/libwinpthread-1.dll /c/"$TARGET"/bin + cp "$DLL_PATH"/libgmp*.dll /c/"$TARGET"/bin + cp /c/"$TARGET"/bin/libwinpthread-1.dll /c/"$TARGET"/bin/pthreadGC2.dll + if test $ABI = 64; then - cp $DOCS_DIR/*html $TARGET/share/doc/Yap - cp $DOCS_DIR/*pdf $TARGET/share/doc/Yap "$NSIS" -DREGKEY=SOFTWARE\\YAP\\Prolog64 \ - -DROOTDIR=$TARGET \ + -DROOTDIR=/c/$TARGET -DTARGET="$TARGET""$EXTRA_THREADS" \ -DABI="$ABI" \ - -DVERSION="$FULL_VERSION" \ + -DVERSION="$VERSION""$EXTRA_THREADS" \ -DOPTIONS="$SRC_WIN\\misc\\options.ini" \ -DOUT_DIR=".." -D"WIN64=1" \ - -NOCD $SRC/yap-6.3/misc/Yap.nsi + -NOCD $SRC/misc/Yap.nsi else - cp $DOCS_DIR/*html $TARGET/share/doc/Yap - cp $DOCS_DIR/*pdf $TARGET/share/doc/Yap "$NSIS" -DREGKEY=SOFTWARE\\YAP\\Prolog \ - -DROOTDIR=$TARGET \ + -DROOTDIR=/c/$TARGET -DTARGET="$TARGET""$EXTRA_THREADS" \ -DABI="$ABI" \ - -DVERSION="$FULL_VERSION" \ + -DVERSION="$VERSION""$EXTRA_THREADS" \ -DOPTIONS="$SRC_WIN\\misc\\options.ini" \ -DOUT_DIR=".." \ - -NOCD $SRC/yap-6.3/misc/Yap.nsi + -NOCD $SRC/misc/Yap.nsi fi fi diff --git a/misc/mkwin.md b/misc/mkwin.md new file mode 100644 index 000000000..aeeedaf61 --- /dev/null +++ b/misc/mkwin.md @@ -0,0 +1,83 @@ + +AT the time of this writing (Nov 2014), YAP uses the mkwin script to +compile in WIN32. The script requires either a WIN32 environment, or a +cross-compiler/emulator package. + +YAP has been known to compile under VISUAL C++, and should compile and +work under cygwin, but the favorite approach is to use a native +msys/mingw environment. This approach has two key advantages: + + + it does not need an interface layer and a DLL, like cygwin. + + + it enables cross-compilation. + +YAP uses rge `mkwin` script to generate a new YAP installer. The script is +controlled by a set of of variables that should be defined early on in +the text. It executes by first calling `configure`, next running `make`, and +last (if all went well) executing `nsys`. + +In more detail, the following mingw based environments have been +tested to develop YAP: + + * MSYS 1 and mingw32/64: most WIN32 development did occur in this + native environment. Best results were achieved with + MSYS-1.0.* and TDM-GCC: + + mingw: http://www.mingw.org/ + original msys: http://www.mingw.org/wiki/MSYS + mingw64: http://mingw-w64.sourceforge.net/ + TDM-GCC: http://tdm-gcc.tdragon.net/ + + * This distribution was compiled with the MSYS2 integrated + development, that supports 32 and 64 bit compilation. Setting up + MSYS2 should be done with care, but it is worth it as the + distribution works nicely in MINGW32 and MINGW64 mode. A third + compilation mode, MSYS mode, has problems with compiling sockets. + + msys2: http://sourceforge.net/projects/msys2/ + + * cygwin and cygwin64 now can generate native applications + + cygwin: https://www.cygwin.com/ + + * Linux has a nice cross-compilation environment, with some of the best + work done for Fedora. + + fedora mingw cross-compiler: http://fedoraproject.org/wiki/MinGW/CrossCompilerFramework + + One problem is that this environment requires emulation of WIN32 + executables to generate the initial saved state and to compile + `chr`. `wine` sometimes does the task, but it sometimes fails. + + * OSX has the `mxe` package, a port of mingw that is in active + development. + + mxe: http://mxe.cc/ + + Note that OSX has technical limitations that preclude porting + wine64. wine32 is distributed with package managers such as ports + and brew. + +=== Setting up WIN32 compilation + +Compiling WIN32 packages depends on a number of parameters: chosen compiler, +packages to install, directory setup. You may have to change these ones that +control the `mkwin` script: + + * `VER`: major/minor number + * `PATCHID`: third digit + * `SRC`: directory containing yap sources, in the local environment notation. + * `SRC_WIN`: same, but in WIN32 standard notation. + * `THREADS`: yes or no? controllable from the command line. + * `ABI`: "32" or "64", controllable from the command line. + * `NSIS`: installer generator, usually "/c/Program Files (x86)/NSIS/makensis". + * `DOCS_DIR`: where you have the doxygen output. + * `GCC_DIR`: root of gcc seup. + * `HOST`: argument to `--host` configure command. + * `BUILD`: build directory + * `GMP`: multi-precision package; yes, no, or the installation directory; usually in the distribution. + * `CUDD`: BDD package, usually in the distribution. + * `JAVA`: Java sdk directory, usually in the distribution. + * `PYTHON`: Python package, usually in the distribution. + * `R`: R environment package, usually in the distribution. + * `GECODE`: constraint solver package, usually not in the WIN32 distribution. \ No newline at end of file diff --git a/misc/yap.nsi b/misc/yap.nsi index 9d0920fb0..5256a95c4 100755 --- a/misc/yap.nsi +++ b/misc/yap.nsi @@ -14,13 +14,13 @@ SetCompressor /FINAL bzip2 ; Preload files that are needed by the installer itself ReserveFile "${NSISDIR}\Plugins\x86-unicode\UserInfo.dll" -ReserveFile "${NSISDIR}\Plugins\\x86-unicode\InstallOptions.dll" +ReserveFile "${NSISDIR}\Plugins\x86-unicode\InstallOptions.dll" ReserveFile "${OPTIONS}" !ifdef WIN64 -InstallDir "$PROGRAMFILES64\${ROOTDIR}" +InstallDir "$PROGRAMFILES64\${TARGET}" !else -InstallDir "$PROGRAMFILES\${ROOTDIR}" +InstallDir "$PROGRAMFILES\${TARGET}" !endif InstallDirRegKey HKLM ${REGKEY} "home" @@ -71,21 +71,18 @@ Section "Base system (required)" ; SYSTEM STUFF File /r ${ROOTDIR}\share\Yap\* + SetOutPath $INSTDIR\share\PrologCommons +; SYSTEM STUFF + File /r ${ROOTDIR}\share\PrologCommons + SetOutPath $INSTDIR\share\doc\Yap - File ${ROOTDIR}\share\doc\Yap\yap.html - File ${ROOTDIR}\share\doc\Yap\yap.pdf + File /r ${ROOTDIR}\share\doc\Yap\html\* +; File ${ROOTDIR}\share\doc\Yap\refman.pdf ; File ${ROOTDIR}\share\doc\Yap\yap.info File ${ROOTDIR}\share\doc\Yap\Artistic File ${ROOTDIR}\share\doc\Yap\README.TXT File ${ROOTDIR}\share\doc\Yap\COPYING - WriteRegStr HKLM ${REGKEY} "home" "$INSTDIR" - WriteRegStr HKLM ${REGKEY} "bin" "$INSTDIR\bin\yap.exe" - WriteRegStr HKLM ${REGKEY} "dlls" "$INSTDIR\lib\Yap" - WriteRegStr HKLM ${REGKEY} "startup" "$INSTDIR\lib\Yap\startup.yss" - WriteRegStr HKLM ${REGKEY} "library" "$INSTDIR\share\Yap" - WriteRegStr HKLM ${REGKEY} "commons" "$INSTDIR\share\PrologCommons" - ; Write uninstaller !ifdef WIN64 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\YAP64" "DisplayName" "YAP64 (remove only)" @@ -120,13 +117,13 @@ Section "Start Menu shortcuts" "$INSTDIR\share\doc\Yap\README.TXT" 0 \ "SW_SHOWNORMAL" "" "View readme" CreateShortCut "$SMPROGRAMS\${GRP}\Manual Html.lnk" \ - "$INSTDIR\share\doc\Yap\yap.html" "" \ - "$INSTDIR\share\doc\Yap\yap.html" 0 \ - "SW_SHOWNORMAL" "" "View readme" - CreateShortCut "$SMPROGRAMS\${GRP}\Manual PDF.lnk" \ - "$INSTDIR\share\doc\Yap\yap.pdf" "" \ - "$INSTDIR\share\doc\Yap\yap.pdf" 0 \ + "$INSTDIR\share\doc\Yap\html\index.html" "" \ + "$INSTDIR\share\doc\Yap\html\index.html" 0 \ "SW_SHOWNORMAL" "" "View readme" +; CreateShortCut "$SMPROGRAMS\${GRP}\Manual PDF.lnk" \ +; "$INSTDIR\share\doc\Yap\refman.pdf" "" \ +; "$INSTDIR\share\doc\Yap\refman.pdf" 0 \ +; "SW_SHOWNORMAL" "" "View readme" CreateShortCut "$SMPROGRAMS\${GRP}\Uninstall.lnk" \ "$INSTDIR\uninstall.exe" \ "" \ diff --git a/os/pl-stream.c b/os/pl-stream.c index 238a520f0..0231f128a 100755 --- a/os/pl-stream.c +++ b/os/pl-stream.c @@ -886,6 +886,13 @@ put_code(int c, IOSTREAM *s) unsigned char *q = (unsigned char *)&chr; unsigned char *e = &q[sizeof(pl_wchar_t)]; +#if __WINDOWS__ + if (s == Soutput || s == Serror ) { + if (!(*s->functions->write)(s->handle, (char *)q, sizeof(wchar_t))) + return -1; + break; + } +#endif while(qHello World is the name of the relation and myddas is the connection identifier. - - -@} - */ +%% @} + + /** @defgroup Number_of_Fields Number of Fields @ingroup MYDDAS @{ - @pred db_number_of_fields(+,?). - - +*/ +/** @pred db_number_of_fields(+,?). @pred db_number_of_fields(+,+,?). @@ -486,18 +495,18 @@ where `Hello World` is the name of the relation and `myddas` is the connection identifier. -@} - */ +%% @} + + /** @defgroup Describing_a_Relation Describing a Relation @ingroup MYDDAS @{ - @pred db_datalog_describe(+,+). - - +*/ +/** @pred db_datalog_describe(+,+). @pred db_datalog_describe(+). @@ -518,7 +527,9 @@ command, the same way as `DESCRIBE` in the MySQL prompt would. yes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - @pred db_describe(+,+). +*/ + +/** @pred db_describe(+,+). @@ -538,15 +549,17 @@ no ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -@} - */ +%% @} + /** @defgroup Enumerating_Relations Enumeration Relations Describing_a_Relation Describing a Relation @ingroup MYDDAS @{ - @pred db_datalog_show_tables(+). +*/ + +/** @pred db_datalog_show_tables(+). @pred db_datalog_show_tables @@ -565,7 +578,9 @@ it does not returns any value, but instead prints to the screen the result of th yes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - @pred db_show_tables(+, ?). +*/ + +/** @pred db_show_tables(+, ?). @@ -584,19 +599,19 @@ Table = table('Hello World') ? ; no ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -@} - */ +%%@} + + /** @defgroup The_MYDDAS_MySQL_Top_Level The MYDDAS MySQL Top Level @ingroup MYDDAS @{ +*/ +/** @pred db_top_level(+,+,+,+,+). - - - @pred db_top_level(+,+,+,+). @@ -644,18 +659,19 @@ Bye yes ?- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -@} - */ +%%@} + + /** @defgroup Other_MYDDAS_Properties Other MYDDAS Properties @ingroup MYDDAS @{ +*/ - - @pred db_verbose(+). - @pred db_top_level(+,+,+,+). +/** +@pred db_verbose(+). When we ask a question to YAP, using a predicate asserted by @@ -670,8 +686,16 @@ yes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If we want to disable this feature, we must call the `db_verbose/1` predicate with the value 0. +\ +*/ - @pred db_module(?). +/** + @pred db_top_level(+,+,+,+). + + +*/ + +/** @pred db_module(?). @@ -707,11 +731,9 @@ yes ?- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - @pred db_my_result_set(?). - - - +*/ +/** @pred db_my_result_set(?). The MySQL C API permits two modes for transferring the data generated by a query to the client, in our case YAP. The first mode, and the default @@ -736,7 +758,9 @@ After this command, all of the database predicates will use use result by default. We can change this by doing again `db_my_result_set(store_result)`. - @pred db_my_sql_mode(+Conn,?SQL_Mode). +*/ + +/** @pred db_my_sql_mode(+Conn,?SQL_Mode). @@ -758,6 +782,8 @@ You can see the available SQL Modes at the MySQL homepage at */ +%% @} + #ifdef MYDDAS_TOP_LEVEL :- use_module(myddas_top_level,[ db_top_level/4, diff --git a/packages/python/configure.in b/packages/python/configure.in index b54948578..6d4487bd3 100755 --- a/packages/python/configure.in +++ b/packages/python/configure.in @@ -36,7 +36,7 @@ elif test -e "$srcdir"/packages/python/Makefile.in ; then if test -d "$PYTHONHOME/libs"; then #mingw PYTHON_DIR="$PYTHONHOME" - PYTHON_DLL=`echo "$PYTHON_DIR"/python*.dll` + PYTHON_DLL=`echo "$PYTHON_DIR"/DLLs/python*.dll` PYTHON_LIBS="\"$PYTHON_DLL\"" PYTHON_INCLUDES="-I \"$PYTHON_DIR\"/include" elif test -d "$PYTHONHOME/lib"; then diff --git a/packages/real b/packages/real index e535195ee..e09cbb2a2 160000 --- a/packages/real +++ b/packages/real @@ -1 +1 @@ -Subproject commit e535195eee93bf37b99f35f8942e8e403a99e7d1 +Subproject commit e09cbb2a2980176e12c7ae6dbdcf87f8aa4ed67d diff --git a/pl/absf.yap b/pl/absf.yap index 880549bb2..8c6fae65a 100755 --- a/pl/absf.yap +++ b/pl/absf.yap @@ -538,21 +538,33 @@ remove_from_path(New) :- '$check_path'(New,Path), `library( _File_ )` are searched by the predicates consult/1, reconsult/1, use_module/1, ensure_loaded/1, and load_files/2. + This directory is initialized through the system predicate + library_directories/2. */ :- multifile user:library_directory/1. :- dynamic user:library_directory/1. -/** - @pred user:commons_directory(?Directory:atom) is nondet, dynamic +user:library_directory( Path ):- + library_directories( Path, _ ). +/** + @pred user:commons_directory(? _Directory_:atom) is nondet, dynamic + + State the location of the Commons Prolog Initiative. + + This directory is initialized through the system predicate + library_directories/2. */ :- multifile user:commons_directory/1. :- dynamic user:commons_directory/1. +user:commons_directory( Path ):- + library_directories( _, Path ). + /** @pred user:prolog_file_type(?Suffix:atom, ?Handler:atom) is nondet, dynamic diff --git a/pl/boot.yap b/pl/boot.yap index 023199a56..0bbfea87e 100644 --- a/pl/boot.yap +++ b/pl/boot.yap @@ -15,7 +15,7 @@ * * *************************************************************************/ -/** +/** @defgroup YAPControl Control Predicates @ingroup YAPBuiltins @@ -24,25 +24,8 @@ */ -/** @pred :_P_ , :_Q_ is iso - - -Conjunction of goals (and). - -Example: - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - p(X) :- q(X), r(X). -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -should be read as "p( _X_) if q( _X_) and r( _X_)". - - -*/ - -/** @pred :_P_ ; :_Q_ is iso - +/** @pred :_P_ ; :_Q_ is iso Disjunction of goals (or). Example: @@ -52,11 +35,11 @@ Example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ should be read as "p( _X_) if q( _X_) or r( _X_)". - + */ -/** @pred \+ :_P_ is iso - +/** @pred \+ :_P_ is iso +Negation by failure. Goal _P_ is not provable. The execution of this predicate fails if and only if the goal _P_ finitely succeeds. It is not a true logical @@ -65,17 +48,24 @@ negation, which is impossible in standard Prolog, but This predicate might be defined as: -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~ \+(P) :- P, !, fail. \+(_). -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~ if _P_ did not include "cuts". - +If _P_ includes cuts, the cuts are defined to be scoped by _P_: they canno cut over the calling prredicate. + + ~~~~~~~~~~~~ + go(P). + :- \+ P, !, fail. + \+(_). + ~~~~~~~~~~~~ + */ -/** @pred not :_P_ +/** @pred not :_P_ Goal _P_ is not provable. The same as `\+ _P_`. @@ -84,12 +74,12 @@ This predicate is kept for compatibility with C-Prolog and previous versions of YAP. Uses of not/1 should be replaced by `\+`/1, as YAP does not implement true negation. - + */ -/** @pred :_P_ -> :_Q_ is iso +/** @pred :_Condition__ -> :_Action_ is iso Read as "if-then-else" or "commit". This operator is similar to the @@ -134,26 +124,31 @@ Note also that you can use chains of commit operators like: Note that `(->)/2` does not affect the scope of cuts in its arguments. - + */ -/** @pred :_Condition_ *-> :_Action_ +/** @pred :_Condition_ *-> :_Action_ is iso This construct implements the so-called soft-cut. The control is -defined as follows: If _Condition_ succeeds at least once, the -semantics is the same as ( _Condition_, _Action_). If +defined as follows: + + If _Condition_ succeeds at least once, the +semantics is the same as ( _Condition_, _Action_). + + + If _Condition_ does not succeed, the semantics is that of (\\+ - _Condition_, _Else_). In other words, If _Condition_ + _Condition_, _Else_). + + In other words, if _Condition_ succeeds at least once, simply behave as the conjunction of _Condition_ and _Action_, otherwise execute _Else_. The construct _A *-> B_, i.e. without an _Else_ branch, is translated as the normal conjunction _A_, _B_. - + */ -/** @pred ! is iso +/** @pred ! is iso Read as "cut". Cuts any choices taken in the current procedure. @@ -184,7 +179,7 @@ definition: member(X,[_|L]) :- member(X,L). ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -the same query would return only the first element of the +the same query would return only the first element of the list, since backtracking could not "pass through" the cut. */ @@ -219,11 +214,7 @@ private(_). % % boootstrap predicates. % -:- system_module( '$_boot', [(*->)/2, - (',')/2, - (->)/2, - (;)/2, - (\+)/1, +:- system_module( '$_boot', [ bootstrap/1, call/1, catch/3, @@ -234,8 +225,7 @@ private(_). (not)/1, repeat/0, throw/1, - true/0, - ('|')/2], ['$$compile'/4, + true/0], ['$$compile'/4, '$call'/4, '$catch'/3, '$check_callable'/2, @@ -299,12 +289,13 @@ private(_). % % % -/** @pred true is iso +/** @pred true is iso +Succeed. Succeeds once. - + */ true :- true. @@ -385,7 +376,7 @@ true :- true. '$init_globals' :- % '$swi_set_prolog_flag'(break_level, 0), - % '$set_read_error_handler'(error), let the user do that + % '$set_read_error_handler'(error), let the user do that nb_setval('$chr_toplevel_show_store',false). '$init_consult' :- @@ -458,15 +449,15 @@ true :- true. '$system_catch'('$raw_read'(user_input, Line), prolog, E, (print_message(error, E), '$handle_toplevel_error'(Line, E))), - ( + ( '$pred_exists'(rl_add_history(_), user) - -> + -> format(atom(CompleteLine), '~W~W', [ Line, [partial(true)], '.', [partial(true)] ]), user:rl_add_history(CompleteLine) - ; + ; true ), '$system_catch'( @@ -524,15 +515,15 @@ true :- true. ( BreakLevel \= 0 -> true ; '$pred_exists'(halt(_), user) -> halt(0) ; '$halt'(0) ). - '$erase_sets' :- + '$erase_sets' :- eraseall('$'), eraseall('$$set'), - eraseall('$$one'), + eraseall('$$one'), eraseall('$reconsulted'), fail. '$erase_sets' :- \+ recorded('$path',_,_), recorda('$path',"",_). '$erase_sets'. - '$version' :- + '$version' :- get_value('$version_name',VersionName), print_message(help, version(VersionName)), get_value('$myddas_version_name',MYDDASVersionName), @@ -545,7 +536,7 @@ true :- true. fail. '$version'. -/** @pred repeat is iso +/** @pred repeat is iso Succeeds repeatedly. In the next example, `repeat` is used as an efficient way to implement @@ -567,7 +558,7 @@ The built-in `repeat/0` could be defined in Prolog by: The predicate between/3 can be used to iterate for a pre-defined number of steps. - + */ repeat :- '$repeat'. @@ -582,7 +573,7 @@ number of steps. '$repeat'. '$repeat' :- '$repeat'. -'$start_corouts' :- +'$start_corouts' :- eraseall('$corout'), eraseall('$result'), eraseall('$actual'), @@ -595,7 +586,7 @@ number of steps. '$access_yap_flags'(9,1), !, '$execute_command'(C,VL,Pos,Con,C). '$command'(C,VL,Pos,Con) :- - ( (Con = top ; var(C) ; C = [_|_]) -> + ( (Con = top ; var(C) ; C = [_|_]) -> '$execute_command'(C,VL,Pos,Con,C), ! ; % do term expansion expand_term(C, EC), @@ -614,7 +605,7 @@ number of steps. '$execute_commands'([C|Cs],VL,Pos,Con,Source) :- !, ( '$system_catch'('$execute_command'(C,VL,Pos,Con,C),prolog,Error,user:'$LoopError'(Error, Con)), - fail + fail ; '$execute_commands'(Cs,VL,Pos,Con,Source) ). @@ -637,7 +628,7 @@ number of steps. \+ '$if_directive'(Command), !. '$execute_command'((:-G),VL,Pos,Option,_) :- -% !, +% !, Option \= top, !, '$current_module'(M), % allow user expansion @@ -661,7 +652,7 @@ number of steps. % ISO only wants directives in files % SICStus accepts everything in files % YAP accepts everything everywhere - % + % '$process_directive'(G, top, M, VL, Pos) :- '$access_yap_flags'(8, 0), !, % YAP mode, go in and do it, '$process_directive'(G, consult, M, VL, Pos). @@ -723,13 +714,13 @@ number of steps. '$go_compile_clause'(G,Vs,Pos,N,Source) :- '$current_module'(Mod), '$go_compile_clause'(G,Vs,Pos,N,Mod,Mod,Mod,Source). - + '$go_compile_clause'(G,_Vs,_Pos,_N,_HM,_BM,_SM,Source) :- var(G), !, - '$do_error'(instantiation_error,assert(Source)). + '$do_error'(instantiation_error,assert(Source)). '$go_compile_clause'((G:-_),_Vs,_Pos,_N,_HM,_BM,_SM,Source) :- var(G), !, - '$do_error'(instantiation_error,assert(Source)). + '$do_error'(instantiation_error,assert(Source)). '$go_compile_clause'(M:G,Vs,Pos,N,_,_,SourceMod,Source) :- !, '$go_compile_clause'(G,Vs,Pos,N,M,M,M,Source). '$go_compile_clause'((M:H :- B),Vs,Pos,N,_,BodyMod,SourceMod,Source) :- !, @@ -773,13 +764,13 @@ number of steps. '$not_imported'(_, _). -'$check_if_reconsulted'(N,A) :- - once(recorded('$reconsulted',N/A,_)), - recorded('$reconsulted',X,_), - ( X = N/A , !; - X = '$', !, fail; - fail - ). +'$check_if_reconsulted'(N,A) :- + once(recorded('$reconsulted',N/A,_)), + recorded('$reconsulted',X,_), + ( X = N/A , !; + X = '$', !, fail; + fail + ). '$inform_as_reconsulted'(N,A) :- recorda('$reconsulted',N/A,_). @@ -810,7 +801,7 @@ number of steps. '$write_answer'(NV, LGs, Written), '$write_query_answer_true'(Written), ( - '$prompt_alternatives_on'(determinism), CP == NCP, DCP = 0 + '$prompt_alternatives_on'(determinism), CP == NCP, DCP = 0 -> format(user_error, '.~n', []), ! @@ -818,7 +809,7 @@ number of steps. '$another', ! ), - fail + fail ; '$out_neg_answer' ). @@ -851,14 +842,14 @@ number of steps. '$clean_ifcp'(CP), NCP is NCP2-NCP1 ; - copy_term_nat(V, NV), - LGs = [], + copy_term_nat(V, NV), + LGs = [], % term_factorized(V, NV, LGs), NCP = 0 ). '$out_neg_answer' :- - ( '$undefined'(print_message(_,_),prolog) -> + ( '$undefined'(print_message(_,_),prolog) -> '$present_answer'(user_error,'false.~n') ; print_message(help,false) @@ -905,15 +896,15 @@ number of steps. fail ; C== 10 -> '$add_nl_outside_console', - ( '$undefined'(print_message(_,_),prolog) -> + ( '$undefined'(print_message(_,_),prolog) -> format(user_error,'yes~n', []) ; print_message(help,yes) ) ; - C== 13 -> + C== 13 -> get0(user_input,NC), - '$do_another'(NC) + '$do_another'(NC) ; C== -1 -> halt ; @@ -940,7 +931,7 @@ number of steps. '$write_vars_and_goals'(NLAnsw, first, FLAnsw). '$purge_dontcares'([],[]). -'$purge_dontcares'([Name=_|Vs],NVs) :- +'$purge_dontcares'([Name=_|Vs],NVs) :- atom_codes(Name, [C|_]), C is "_", !, '$purge_dontcares'(Vs,NVs). '$purge_dontcares'([V|Vs],[V|NVs]) :- @@ -948,7 +939,7 @@ number of steps. '$prep_answer_var_by_var'([], L, L). -'$prep_answer_var_by_var'([Name=Value|L], LF, L0) :- +'$prep_answer_var_by_var'([Name=Value|L], LF, L0) :- '$delete_identical_answers'(L, Value, NL, Names), '$prep_answer_var'([Name|Names], Value, LF, LI), '$prep_answer_var_by_var'(NL, LI, L0). @@ -1083,10 +1074,10 @@ is converted to: a(X) :- call(X). ~~~~~ - + */ -/** @pred call(+ _P_) is iso +/** @pred call(+ _P_) is iso Meta-call predicate. If _P_ is instantiated to an atom or a compound term, the goal `call( @@ -1094,16 +1085,16 @@ _P_)` is executed as if the clause was originally written as _P_ instead as call( _P_ ), except that any "cut" occurring in _P_ only cuts alternatives in the execution of _P_. - + */ call(G) :- '$execute'(G). -/** @pred incore(+ _P_) +/** @pred incore(+ _P_) The same as call/1. - + */ incore(G) :- '$execute'(G). @@ -1137,6 +1128,19 @@ incore(G) :- '$execute'(G). '$stop_creeping'. +/** @pred :_P_ , :_Q_ is iso, meta +Conjunction of goals (and). + +The conjunction is a fundamental construct of Prolog. Example: + +~~~~~~~ + p(X) :- q(X), r(X). +~~~~~~~ + +should be read as `p( _X_) if q( _X_) and r( _X_). + + +*/ ','(X,Y) :- yap_hacks:env_choice_point(CP), '$current_module'(M), @@ -1346,7 +1350,7 @@ bootstrap(F) :- close(Stream). '$loop'(Stream,exo) :- - prolog_flag(agc_margin,Old,0), + prolog_flag(agc_margin,Old,0), prompt1('| '), prompt(_,'| '), '$current_module'(OldModule), repeat, @@ -1355,7 +1359,7 @@ bootstrap(F) :- prolog_flag(agc_margin,_,Old), !. '$loop'(Stream,db) :- - prolog_flag(agc_margin,Old,0), + prolog_flag(agc_margin,Old,0), prompt1('| '), prompt(_,'| '), '$current_module'(OldModule), repeat, @@ -1406,9 +1410,9 @@ bootstrap(F) :- % Expanded is the final expanded term. % '$precompile_term'(Term, Expanded0, Expanded, HeadMod, BodyMod, SourceMod) :- -%format('[ ~w~n',[Term]), +%format('[ ~w~n',[Term]), '$module_expansion'(Term, Expanded0, ExpandedI, HeadMod, BodyMod, SourceMod), !, -%format(' -> ~w~n',[Expanded0]), +%format(' -> ~w~n',[Expanded0]), ( '$access_yap_flags'(9,1) /* strict_iso on */ -> @@ -1418,9 +1422,9 @@ bootstrap(F) :- '$expand_array_accesses_in_term'(ExpandedI,Expanded) ). '$precompile_term'(Term, Term, Term, _, _, _). - -/** @pred expand_term( _T_,- _X_) + +/** @pred expand_term( _T_,- _X_) @@ -1432,7 +1436,7 @@ rules: first try term_expansion/2 in the current module, and then try to use th for DCG rules is applied, together with the arithmetic optimizer whenever the compilation of arithmetic expressions is in progress. - + */ expand_term(Term,Expanded) :- ( '$do_term_expansion'(Term,Expanded) @@ -1463,8 +1467,8 @@ expand_term(Term,Expanded) :- % at each catch point I need to know: % what is ball; -% where was the previous catch -/** @pred catch( : _Goal_,+ _Exception_,+ _Action_) is iso +% where was the previous catch +/** @pred catch( : _Goal_,+ _Exception_,+ _Action_) is iso The goal `catch( _Goal_, _Exception_, _Action_)` tries to @@ -1477,7 +1481,7 @@ again throws the exception. The top-level of YAP maintains a default exception handler that is responsible to capture uncaught exceptions. - + */ catch(G, C, A) :- '$catch'(C,A,_), @@ -1506,7 +1510,7 @@ catch(G, C, A) :- % % throw has to be *exactly* after system catch! % -/** @pred throw(+ _Ball_) is iso +/** @pred throw(+ _Ball_) is iso The goal `throw( _Ball_)` throws an exception. Execution is @@ -1514,7 +1518,7 @@ stopped, and the exception is sent to the ancestor goals until reaching a matching catch/3, or until reaching top-level. @} - + */ throw(_Ball) :- % use existing ball @@ -1522,7 +1526,7 @@ throw(_Ball) :- !, '$jump_env_and_store_ball'(Ball). throw(Ball) :- - ( var(Ball) -> + ( var(Ball) -> '$do_error'(instantiation_error,throw(Ball)) ; % get current jump point @@ -1558,7 +1562,7 @@ catch_ball(C, C). '$run_toplevel_hooks' :- '$swi_current_prolog_flag'(break_level, 0 ), - recorded('$toplevel_hooks',H,_), + recorded('$toplevel_hooks',H,_), H \= fail, !, ( call(user:H1) -> true ; true). '$run_toplevel_hooks'. @@ -1576,4 +1580,3 @@ log_event( String, Args ) :- /** @} */ - diff --git a/pl/modules.yap b/pl/modules.yap index 2b7319c01..1a2a2a88e 100644 --- a/pl/modules.yap +++ b/pl/modules.yap @@ -1506,6 +1506,17 @@ import_module(Mod, ImportModule) :- import_module(Mod, EM) :- '$do_error'(type_error(atom,Mod),import_module(Mod, EM)). + +/** add_import_module( + _Module_, + _ImportModule_ , +_Pos_) is det +Add all exports in _ImportModule_ as available to _Module_. + + +All exported predicates from _ExportModule_ are made available to the + source module _ImportModule_. If _Position_ is bound to `start` the + module _ImportModule_ is tried first, if _Position_ is bound to `end`, + the module is consulted last. + +*/ add_import_module(Mod, ImportModule, Pos) :- var(Mod), '$do_error'(instantiation_error,add_import_module(Mod, ImportModule, Pos)). @@ -1526,6 +1537,14 @@ add_import_module(Mod, ImportModule, Pos) :- add_import_module(Mod, ImportModule, Pos) :- '$do_error'(domain_error(start_end,Pos),add_import_module(Mod, ImportModule, Pos)). +/** delete_import_module( + _ExportModule_, + _ImportModule_ ) is det +Exports in _ImportModule_ are no longer available to _Module_. + + +All exported predicates from _ExportModule_ are discarded from the + ones used vy the source module _ImportModule_. + +*/ delete_import_module(Mod, ImportModule) :- var(Mod), '$do_error'(instantiation_error,delete_import_module(Mod, ImportModule)). @@ -1548,6 +1567,21 @@ delete_import_module(Mod, ImportModule) :- '$set_source_module'(Source0, SourceF) :- current_module(Source0, SourceF). +/** module_property( + _Module_, ? _Property_ ) is nondet +Enumerate non-deterministically the main properties of _Module_ . + +Reports the following properties of _Module_: + + + `class`( ?_Class_ ): whether it is a `system`, `library`, or `user` module. + + + `line_count`(?_Ls_): number of lines in source file. + + + `file`(?_F_): source file for _Module_. + + + `exports`(-Es): list of all predicate symbols and + operator symbols exported or re-exported by this module. + +*/ module_property(Mod, class(L)) :- '$module_class'(Mod, L). module_property(Mod, line_count(L)) :-