From a5c88273b4ce63a770e4866746351cbe3034c8ca Mon Sep 17 00:00:00 2001 From: Aleksander Czajczynski Date: Sat, 5 Jul 2025 20:20:38 +0200 Subject: [PATCH] 2025-07-05 20:20 UTC+0200 Aleksander Czajczynski (hb fki.pl) + config/wasm/global.mk + config/wasm/libs.mk + config/wasm/emcc.mk * utils/hbmk2/hbmk2.prg * contrib/hbrun/hbrun.hbp + add basic support for build Harbour into JS/WebAssembly using emscripten, using these settings: HB_PLATFORM=wasm HB_COMPILER=emcc HB_BUILD_3RDEXT=no * {abstr} is now a hbmk2 keyword to possibly group all toolsets similar in flavour: WASI/clang, JS/emscripten These most likely will be targeting plaforms which are not full operating-systems, they are also commonly qualified as sandbox solutions. * introduced __PLATFORM__WASM and __PLATFORM__ABSTRACT .prg defines * utils/hbmk2/hbmk2.prg + allow to specify hb_ProgName() value at build-time for platforms where the function cannot return a meaningful value (f.e. JS/WebAssembly) ; TODO: Add support for passing hb_ProgName() value command-line parameter, f.e. `--hb:self=hbrun` * config/global.mk * include/hbsetup.h * consider abstract/emscripten targets similar to linux-like * src/rtl/arc4.c ! fix to build under emscripten (which is assumed to be a linux-like environment) ; though platform/compiler names are not currently compatible with origin, this WebAssembly platform support was guided by Harbour 3.4: 2017-06-09 01:10 UTC Viktor Szakats (vszakats users.noreply.github.com) as usual Viktor was here before, many thanks! ; example project, how to make a multi-platform GUI application which also targets WebAssembly, can be found here: https://github.com/alcz/harbour-cimgui-sokol-starterkit/ --- ChangeLog.txt | 43 +++++++++++++++++++ config/global.mk | 6 +++ config/wasm/emcc.mk | 94 +++++++++++++++++++++++++++++++++++++++++ config/wasm/global.mk | 9 ++++ config/wasm/libs.mk | 23 ++++++++++ contrib/hbrun/hbrun.hbp | 2 + include/hbsetup.h | 2 +- src/rtl/arc4.c | 5 ++- src/vm/extrap.c | 1 + utils/hbmk2/hbmk2.prg | 68 ++++++++++++++++++++++------- 10 files changed, 235 insertions(+), 18 deletions(-) create mode 100644 config/wasm/emcc.mk create mode 100644 config/wasm/global.mk create mode 100644 config/wasm/libs.mk diff --git a/ChangeLog.txt b/ChangeLog.txt index aef25d8b19..7a8f8b7eda 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -7,6 +7,49 @@ Entries may not always be in chronological/commit order. See license at the end of file. */ +2025-07-05 20:20 UTC+0200 Aleksander Czajczynski (hb fki.pl) + + config/wasm/global.mk + + config/wasm/libs.mk + + config/wasm/emcc.mk + * utils/hbmk2/hbmk2.prg + * contrib/hbrun/hbrun.hbp + + add basic support for build Harbour into JS/WebAssembly using + emscripten, using these settings: + HB_PLATFORM=wasm HB_COMPILER=emcc HB_BUILD_3RDEXT=no + + * {abstr} is now a hbmk2 keyword to possibly group all + toolsets similar in flavour: WASI/clang, JS/emscripten + These most likely will be targeting plaforms which are not + full operating-systems, they are also commonly qualified as + sandbox solutions. + + * introduced __PLATFORM__WASM and __PLATFORM__ABSTRACT .prg defines + + * utils/hbmk2/hbmk2.prg + + allow to specify hb_ProgName() value at build-time for platforms + where the function cannot return a meaningful value (f.e. + JS/WebAssembly) + ; TODO: Add support for passing hb_ProgName() value command-line + parameter, f.e. `--hb:self=hbrun` + + * config/global.mk + * include/hbsetup.h + * consider abstract/emscripten targets similar to linux-like + + * src/rtl/arc4.c + ! fix to build under emscripten (which is assumed to be a + linux-like environment) + + ; though platform/compiler names are not currently compatible + with origin, this WebAssembly platform support was guided by + Harbour 3.4: + 2017-06-09 01:10 UTC Viktor Szakats (vszakats users.noreply.github.com) + as usual Viktor was here before, many thanks! + + ; example project, how to make a multi-platform GUI application which + also targets WebAssembly, can be found here: + https://github.com/alcz/harbour-cimgui-sokol-starterkit/ + 2025-03-25 13:54 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * contrib/hbcurl/core.c ! pacified warnings diff --git a/config/global.mk b/config/global.mk index 675bcbda95..1f67beb461 100644 --- a/config/global.mk +++ b/config/global.mk @@ -1748,6 +1748,12 @@ ifneq ($(HB_HOST_PLAT)$(HB_HOST_CPU),$(HB_PLATFORM)$(HB_CPU)) else ifeq ($(HB_PLATFORM),aix) HB_PRGFLAGS += -D__PLATFORM__AIX -D__PLATFORM__UNIX + else + ifeq ($(HB_PLATFORM),wasm) + HB_PRGFLAGS += -D__PLATFORM__LINUX -D__PLATFORM__UNIX -D__PLATFORM__WASM + # NOTE: __PLATFORM__LINUX here definitely is a hack, remove + # if WASM platform settles more (it's currently emscripten oriented) + endif endif endif endif diff --git a/config/wasm/emcc.mk b/config/wasm/emcc.mk new file mode 100644 index 0000000000..eb855d9eab --- /dev/null +++ b/config/wasm/emcc.mk @@ -0,0 +1,94 @@ +# https://developer.mozilla.org/docs/WebAssembly/C_to_wasm +# https://kripken.github.io/emscripten-site/docs/compiling/Building-Projects.html + +ifeq ($(HB_BUILD_MODE),cpp) + ifneq ($(findstring clang$(subst x, ,x)version$(subst x, ,x)1,$(shell clang --version)),) + HB_BUILD_MODE := c + endif +endif + +ifeq ($(HB_BUILD_MODE),cpp) + HB_CMP := em++ +else + HB_CMP := emcc +endif + +OBJ_EXT := .o +LIB_PREF := lib +LIB_EXT := .a + +CC := $(HB_CCACHE) $(HB_CCPREFIX)$(HB_CMP)$(HB_CCSUFFIX) +CC_IN := +# NOTE: The ending space after -o is important, please preserve it. +CC_OUT := -o$(subst x,x, ) + +CFLAGS += -I. -I$(HB_HOST_INC) +ifeq ($(filter --analyze, $(HB_USER_CFLAGS)),) + CFLAGS += -c +endif + +ifneq ($(HB_BUILD_WARN),no) + CFLAGS += -W -Weverything + CFLAGS += -Wno-padded -Wno-cast-align -Wno-float-equal -Wno-missing-prototypes + CFLAGS += -Wno-disabled-macro-expansion -Wno-undef -Wno-unused-macros -Wno-variadic-macros -Wno-documentation + CFLAGS += -Wno-switch-enum + ifeq ($(HB_PLATFORM),darwin) + ifeq ($(filter $(HB_COMPILER_VER),0304 0305 0306),) + CFLAGS += -Wno-reserved-id-macro + endif + else + ifeq ($(filter $(HB_COMPILER_VER),0304 0305),) + CFLAGS += -Wno-reserved-id-macro + endif + endif + CFLAGS += -Wno-empty-translation-unit + # These are potentially useful. -Wsign-conversion would require proper HB_SIZE/HB_ISIZ cleanup. + CFLAGS += -Wno-sign-conversion -Wno-shorten-64-to-32 -Wno-conversion -Wno-bad-function-cast +else + CFLAGS += -Wmissing-braces -Wreturn-type -Wformat + ifneq ($(HB_BUILD_MODE),cpp) + CFLAGS += -Wimplicit-int -Wimplicit-function-declaration + endif +endif + +ifneq ($(HB_BUILD_OPTIM),no) + ifeq ($(HB_BUILD_DEBUG),yes) + ifeq ($(filter $(HB_COMPILER_VER),0304 0305 0306 0307 0308 0309),) + CFLAGS += -O0 + else + CFLAGS += -O1 + endif + else + CFLAGS += -O3 + endif +endif + +ifeq ($(HB_BUILD_DEBUG),yes) + CFLAGS += -g +endif + +LD := $(CC) +# NOTE: The ending space after -o is important, please preserve it. +LD_OUT := -o$(subst x,x, ) + +LIBPATHS := $(foreach dir,$(LIB_DIR) $(SYSLIBPATHS),-L$(dir)) +LDLIBS := $(foreach lib,$(HB_USER_LIBS) $(LIBS) $(SYSLIBS),-l$(lib)) + +LDFLAGS += -sWASM=1 $(LIBPATHS) + +AR := $(LLVM_ROOT)/llvm-ar +AR_RULE = ( $(AR) $(ARFLAGS) $(HB_AFLAGS) $(HB_USER_AFLAGS) rcs \ + $(LIB_DIR)/$@ $(^F) $(ARSTRIP) ) \ + || ( $(RM) $(LIB_DIR)/$@ && $(FALSE) ) + +DY := $(CC) +DFLAGS += -shared $(LIBPATHS) +DY_OUT := -o$(subst x,x, ) +DLIBS := $(foreach lib,$(HB_USER_LIBS) $(SYSLIBS),-l$(lib)) + +DY_RULE = $(DY) $(DFLAGS) -Wl,-soname,$(DYN_NAME_CPT) $(HB_USER_DFLAGS) \ + $(DY_OUT)$(DYN_DIR)/$@ $^ $(DLIBS) $(DYSTRIP) \ + && $(LN) $(@F) $(DYN_FILE_NVR) \ + && $(LN) $(@F) $(DYN_FILE_CPT) + +include $(TOP)$(ROOT)config/rules.mk diff --git a/config/wasm/global.mk b/config/wasm/global.mk new file mode 100644 index 0000000000..6542208953 --- /dev/null +++ b/config/wasm/global.mk @@ -0,0 +1,9 @@ +all : first + +ifeq ($(HB_COMPILER),wasm) + BIN_EXT := .js + DYN_EXT := .so +endif +DYN_PREF := lib + +HB_GT_LIBS += gtcgi diff --git a/config/wasm/libs.mk b/config/wasm/libs.mk new file mode 100644 index 0000000000..417685a595 --- /dev/null +++ b/config/wasm/libs.mk @@ -0,0 +1,23 @@ +SYSLIBPATHS := + +ifneq ($(HB_LINKING_RTL),) + ifneq ($(HB_HAS_X11),) + SYSLIBS += X11 + ifneq ($(wildcard /usr/X11R6/lib),) + SYSLIBPATHS += /usr/X11R6/lib + endif + ifneq ($(wildcard /opt/X11/lib),) + SYSLIBPATHS += /opt/X11/lib + endif + endif + ifneq ($(HB_HAS_PCRE),) + ifeq ($(HB_HAS_PCRE_LOCAL),) + SYSLIBS += pcre + endif + endif + ifeq ($(HB_HAS_ZLIB_LOCAL),) + SYSLIBS += z + endif +endif + +SYSLIBS += m diff --git a/contrib/hbrun/hbrun.hbp b/contrib/hbrun/hbrun.hbp index 3677e9c4bb..126a6ccbcb 100644 --- a/contrib/hbrun/hbrun.hbp +++ b/contrib/hbrun/hbrun.hbp @@ -2,6 +2,8 @@ -o${hb_name} +-DHBMK_PROGNAME=hbrun{abstr} + -DHBMK_WITH_BUILTIN_HEADERS_ALL -DHBMK_WITH_GTXWC{HBMK_WITH_GTXWC='yes'} diff --git a/include/hbsetup.h b/include/hbsetup.h index e3ee2343b6..9bc7f82d60 100644 --- a/include/hbsetup.h +++ b/include/hbsetup.h @@ -354,7 +354,7 @@ #endif #ifndef HB_OS_LINUX - #if defined( linux ) || defined( __linux ) || defined( __linux__ ) || defined( __gnu_linux__ ) + #if defined( linux ) || defined( __linux ) || defined( __linux__ ) || defined( __gnu_linux__ ) || defined( __EMSCRIPTEN__ ) #define HB_OS_LINUX #endif #endif diff --git a/src/rtl/arc4.c b/src/rtl/arc4.c index e6650b6399..4c0d179986 100644 --- a/src/rtl/arc4.c +++ b/src/rtl/arc4.c @@ -49,7 +49,10 @@ /* XXX: Check and possibly extend this to other Unix-like platforms */ #if ( defined( HB_OS_BSD ) && ! defined( HB_OS_DARWIN ) ) || \ - ( defined( HB_OS_LINUX ) && ! defined ( HB_OS_ANDROID ) && ! defined ( __WATCOMC__ ) ) + ( defined( HB_OS_LINUX ) && \ + ! defined( HB_OS_ANDROID ) && \ + ! defined( __WATCOMC__ ) && \ + ! defined( __EMSCRIPTEN__ ) ) /* * sysctl() on Linux has fallen into depreciation. Not available in current * runtime C libraries, like musl and glibc >= 2.30. diff --git a/src/vm/extrap.c b/src/vm/extrap.c index b951fa4fe0..b5e7537b82 100644 --- a/src/vm/extrap.c +++ b/src/vm/extrap.c @@ -57,6 +57,7 @@ # include # include # if defined( SIGSTKSZ ) && \ + ! defined( __EMSCRIPTEN__ ) && \ ( ( defined( _BSD_SOURCE ) && _BSD_SOURCE ) || \ ( defined( _XOPEN_SOURCE ) && _XOPEN_SOURCE >= 500 ) ) # define HB_SIGNAL_EXCEPTION_HANDLER diff --git a/utils/hbmk2/hbmk2.prg b/utils/hbmk2/hbmk2.prg index 1b89b36fb8..f3ac61dd69 100644 --- a/utils/hbmk2/hbmk2.prg +++ b/utils/hbmk2/hbmk2.prg @@ -165,7 +165,7 @@ EXTERNAL HB_GT_CGI_DEFAULT EXTERNAL HB_GT_DOS #elif defined( __PLATFORM__OS2 ) EXTERNAL HB_GT_OS2 -#elif defined( __PLATFORM__UNIX ) .AND. ! defined( __PLATFORM__VXWORKS ) .AND. ! defined( __PLATFORM__SYMBIAN ) +#elif defined( __PLATFORM__UNIX ) .AND. ! defined( __PLATFORM__WASM ) .AND. ! defined( __PLATFORM__VXWORKS ) .AND. ! defined( __PLATFORM__SYMBIAN ) EXTERNAL HB_GT_TRM #if defined( HBMK_WITH_GTXWC ) EXTERNAL HB_GT_XWC @@ -181,6 +181,8 @@ EXTERNAL hbmk_KEYW #define HB_SYMBOL_UNUSED( symbol ) ( ( symbol ) ) #endif +#xtranslate _HBMK_STRINGIFY( ) => <"x"> + #define _SELF_NAME_ "hbmk2" #define _SELF_NAME_LONG_ "Harbour Make" @@ -1846,7 +1848,7 @@ STATIC FUNCTION __hbmk( aArgs, nArgTarget, nLevel, /* @ */ lPause, /* @ */ lExit cBin_CompPRG := "harbour" + l_cHBSUFFIX DO CASE - CASE HBMK_ISPLAT( "darwin|bsd|hpux|sunos|beos|qnx|android|vxworks|symbian|linux|cygwin|minix|aix" ) + CASE HBMK_ISPLAT( "darwin|bsd|hpux|sunos|beos|qnx|android|vxworks|symbian|linux|cygwin|minix|aix|wasm" ) DO CASE CASE hbmk[ _HBMK_cPLAT ] == "linux" aCOMPSUP := { "gcc", "clang", "icc", "watcom", "sunpro", "open64", "pcc" } @@ -1864,6 +1866,8 @@ STATIC FUNCTION __hbmk( aArgs, nArgTarget, nLevel, /* @ */ lPause, /* @ */ lExit aCOMPSUP := { "gcc", "icc" } CASE hbmk[ _HBMK_cPLAT ] == "minix" aCOMPSUP := { "clang", "gcc" } + CASE hbmk[ _HBMK_cPLAT ] == "wasm" + aCOMPSUP := { "emcc" } OTHERWISE aCOMPSUP := { "gcc" } ENDCASE @@ -1886,6 +1890,15 @@ STATIC FUNCTION __hbmk( aArgs, nArgTarget, nLevel, /* @ */ lPause, /* @ */ lExit l_aLIBHBGT := {} hbmk[ _HBMK_cGTDEFAULT ] := "gtstd" cBinExt := ".exe" + CASE hbmk[ _HBMK_cPLAT ] == "wasm" + l_aLIBHBGT := { "gtcgi" } + hbmk[ _HBMK_cGTDEFAULT ] := "gtcgi" + DO CASE + CASE hbmk[ _HBMK_cCOMP ] == "emcc" + cBinExt := ".js" + OTHERWISE + cBinExt := "" + ENDCASE OTHERWISE l_aLIBHBGT := { "gttrm" } hbmk[ _HBMK_cGTDEFAULT ] := "gttrm" @@ -4001,7 +4014,8 @@ STATIC FUNCTION __hbmk( aArgs, nArgTarget, nLevel, /* @ */ lPause, /* @ */ lExit ( hbmk[ _HBMK_cPLAT ] == "linux" .AND. hbmk[ _HBMK_cCOMP ] == "pcc" ) .OR. ; ( hbmk[ _HBMK_cPLAT ] == "sunos" .AND. hbmk[ _HBMK_cCOMP ] == "pcc" ) .OR. ; ( hbmk[ _HBMK_cPLAT ] == "minix" .AND. hbmk[ _HBMK_cCOMP ] == "gcc" ) .OR. ; - ( hbmk[ _HBMK_cPLAT ] == "aix" .AND. hbmk[ _HBMK_cCOMP ] == "gcc" ) + ( hbmk[ _HBMK_cPLAT ] == "aix" .AND. hbmk[ _HBMK_cCOMP ] == "gcc" ) .OR. ; + ( hbmk[ _HBMK_cPLAT ] == "wasm" .AND. hbmk[ _HBMK_cCOMP ] == "emcc" ) #if defined( __PLATFORM__UNIX ) hbmk[ _HBMK_nCmd_Esc ] := _ESC_NIX @@ -4028,6 +4042,8 @@ STATIC FUNCTION __hbmk( aArgs, nArgTarget, nLevel, /* @ */ lPause, /* @ */ lExit cOpt_Lib := "-static -no_warning_for_no_symbols {FA} -o {OL} {LO}" ELSE DO CASE + CASE hbmk[ _HBMK_cCOMP ] == "emcc" + cBin_Lib := GetEnv( "LLVM_ROOT" ) + hb_ps() + "llvm-ar" CASE hbmk[ _HBMK_cCOMP ] == "icc" cBin_Lib := "xiar" CASE hbmk[ _HBMK_cPLAT ] == "vxworks" @@ -4062,6 +4078,9 @@ STATIC FUNCTION __hbmk( aArgs, nArgTarget, nLevel, /* @ */ lPause, /* @ */ lExit CASE hbmk[ _HBMK_cPLAT ] == "vxworks" cBin_CompCPP := hbmk[ _HBMK_cCCPREFIX ] + "g++" + hbmk[ _HBMK_cCCSUFFIX ] cBin_CompC := iif( hbmk[ _HBMK_lCPP ] != NIL .AND. hbmk[ _HBMK_lCPP ], cBin_CompCPP, hbmk[ _HBMK_cCCPREFIX ] + "cc" + hbmk[ _HBMK_cCCSUFFIX ] ) + CASE hbmk[ _HBMK_cCOMP ] == "emcc" + cBin_CompCPP := hbmk[ _HBMK_cCCPREFIX ] + "em++" + hbmk[ _HBMK_cCCSUFFIX ] + cBin_CompC := iif( hbmk[ _HBMK_lCPP ] != NIL .AND. hbmk[ _HBMK_lCPP ], cBin_CompCPP, hbmk[ _HBMK_cCCPREFIX ] + "emcc" + hbmk[ _HBMK_cCCSUFFIX ] ) OTHERWISE cBin_CompCPP := hbmk[ _HBMK_cCCPREFIX ] + "g++" + hbmk[ _HBMK_cCCSUFFIX ] cBin_CompC := iif( hbmk[ _HBMK_lCPP ] != NIL .AND. hbmk[ _HBMK_lCPP ], cBin_CompCPP, hbmk[ _HBMK_cCCPREFIX ] + "gcc" + hbmk[ _HBMK_cCCSUFFIX ] ) @@ -4108,10 +4127,15 @@ STATIC FUNCTION __hbmk( aArgs, nArgTarget, nLevel, /* @ */ lPause, /* @ */ lExit IF hbmk[ _HBMK_cPLAT ] == "minix" AAdd( hbmk[ _HBMK_aOPTC ], "-D_NETBSD_SOURCE=1" ) ENDIF + IF hbmk[ _HBMK_cPLAT ] == "wasm" .AND. hbmk[ _HBMK_cCOMP ] == "emcc" + AAdd( hbmk[ _HBMK_aOPTL ], "-sWASM=1" ) + AAdd( hbmk[ _HBMK_aOPTD ], "-sWASM=1" ) + ENDIF cOpt_CompC += " {FC}" IF ! Empty( hbmk[ _HBMK_cWorkDir ] ) /* Symbian gcc cross-compiler (on Windows) crashes if compiling multiple files at once */ - IF ! hbmk[ _HBMK_cPLAT ] == "symbian" /* EXPERIMENTAL */ + IF ! hbmk[ _HBMK_cPLAT ] == "symbian" .AND. ; /* EXPERIMENTAL */ + ! hbmk[ _HBMK_cCOMP ] == "emcc" /* It creates the output in the source directory if no -o option is passed */ lCHD_Comp := .T. cOpt_CompC += " {LC}" ELSE @@ -4150,7 +4174,7 @@ STATIC FUNCTION __hbmk( aArgs, nArgTarget, nLevel, /* @ */ lPause, /* @ */ lExit IF hbmk[ _HBMK_cPLAT ] == "darwin" cLibHBX_Regex := R_( "[\s]T" ) + cLibHBX_Regex ENDIF - IF l_lLIBGROUPING .AND. HBMK_ISPLAT( "linux|beos|qnx|android|vxworks|cygwin|bsd" ) + IF l_lLIBGROUPING .AND. HBMK_ISPLAT( "linux|beos|qnx|android|vxworks|cygwin|bsd|wasm" ) AAdd( hbmk[ _HBMK_aOPTL ], "-Wl,--start-group {LL} {LB} {LF} -Wl,--end-group" ) AAdd( hbmk[ _HBMK_aOPTD ], "-Wl,--start-group {LL} {LB} {LF} -Wl,--end-group" ) ELSE @@ -4212,14 +4236,14 @@ STATIC FUNCTION __hbmk( aArgs, nArgTarget, nLevel, /* @ */ lPause, /* @ */ lExit ENDIF IF lStopAfterCComp IF ! hbmk[ _HBMK_lCreateLib ] .AND. ! hbmk[ _HBMK_lCreateDyn ] .AND. ( Len( hbmk[ _HBMK_aPRG ] ) + Len( hbmk[ _HBMK_aC ] ) + Len( hbmk[ _HBMK_aCPP ] ) ) == 1 - IF HBMK_ISPLAT( "darwin|sunos" ) .OR. HBMK_ISCOMP( "pcc" ) + IF HBMK_ISPLAT( "darwin|sunos" ) .OR. HBMK_ISCOMP( "pcc|emcc" ) AAdd( hbmk[ _HBMK_aOPTC ], "-o {OO}" ) ELSE AAdd( hbmk[ _HBMK_aOPTC ], "-o{OO}" ) ENDIF ENDIF ELSE - IF HBMK_ISPLAT( "darwin|sunos" ) .OR. HBMK_ISCOMP( "pcc" ) + IF HBMK_ISPLAT( "darwin|sunos" ) .OR. HBMK_ISCOMP( "pcc|emcc" ) AAdd( hbmk[ _HBMK_aOPTL ], "-o {OE}" ) ELSE AAdd( hbmk[ _HBMK_aOPTL ], "-o{OE}" ) @@ -10586,7 +10610,7 @@ STATIC FUNCTION EnvNotation( cEnvName ) RETURN "$" + cEnvName #endif -#define SELF_NAME() iif( hbmk[ _HBMK_lShellMode ], iif( hb_FNameName( hb_ProgName() ) == _SELF_NAME_, "hbrun", hb_FNameName( hb_ProgName() ) ), _SELF_NAME_ ) +#define SELF_NAME() iif( hbmk[ _HBMK_lShellMode ], iif( hb_FNameName( hbmk_hb_ProgName() ) == _SELF_NAME_, "hbrun", hb_FNameName( hbmk_hb_ProgName() ) ), _SELF_NAME_ ) STATIC FUNCTION AutoConfPathList( hbmk, lCWD, lForDocOutput ) @@ -12063,6 +12087,10 @@ STATIC PROCEDURE PlatformPRGFlags( hbmk, aOPTPRG ) CASE hbmk[ _HBMK_cPLAT ] == "aix" AAdd( aDf, "__PLATFORM__AIX" ) AAdd( aDf, "__PLATFORM__UNIX" ) + CASE hbmk[ _HBMK_cPLAT ] == "wasm" + AAdd( aDf, "__PLATFORM__UNIX" ) + AAdd( aDf, "__PLATFORM__WASM" ) + AAdd( aDf, "__PLATFORM__ABSTRACT" ) ENDCASE /* Setup those CPU flags which we can be sure about. @@ -12696,7 +12724,7 @@ STATIC FUNCTION win_implib_omf( hbmk, cSourceDLL, cTargetLib ) LOCAL cSourceLib - /* Try to find COFF .lib with the same name */ + /* Try to find OMF .lib with the same name */ IF hb_FileExists( cSourceLib := hb_FNameExtSet( cSourceDLL, ".lib" ) ) IF IsOMFLib( cSourceLib ) IF ! hbmk[ _HBMK_lQuiet ] @@ -13138,6 +13166,7 @@ FUNCTION hbmk_KEYW( hbmk, cFileName, cKeyword, cValue, cOperator ) CASE "winuni" ; RETURN hbmk[ _HBMK_lWINUNI ] CASE "winansi" ; RETURN ! hbmk[ _HBMK_lWINUNI ] CASE "unix" ; RETURN HBMK_ISPLAT( "bsd|hpux|sunos|beos|qnx|android|vxworks|symbian|linux|darwin|cygwin|minix|aix" ) + CASE "abstr" ; RETURN HBMK_ISPLAT( "wasm|wasi" ) CASE "allwin" ; RETURN HBMK_ISPLAT( "win|wce" ) CASE "allgcc" ; RETURN HBMK_ISCOMP( "gcc|mingw|mingw64|mingwarm|djgpp|gccomf|clang|open64|pcc" ) CASE "allmingw" ; RETURN HBMK_ISCOMP( "mingw|mingw64|mingwarm" ) @@ -13903,7 +13932,7 @@ STATIC PROCEDURE __hbshell( cFile, ... ) /* Save originals */ hbsh[ _HBSH_cDirBase ] := hb_DirBase() - hbsh[ _HBSH_cProgName ] := hb_ProgName() + hbsh[ _HBSH_cProgName ] := hbmk_hb_ProgName() /* Init */ @@ -14076,7 +14105,7 @@ STATIC PROCEDURE __hbshell( cFile, ... ) /* We can use this function as this is a GPL licenced application */ cFile := hb_compileBuf( ; hbmk_CoreHeaderFiles(), ; - hb_ProgName(), ; + hbmk_hb_ProgName(), ; "-n2", "-w", "-es2", "-q0", ; hb_ArrayToParams( aOPTPRG ), ; "-D" + _HBMK_SHELL, ; @@ -14449,7 +14478,7 @@ STATIC FUNCTION __hbshell_plugins_load( hPlugins, aParams ) IF ! Lower( hb_FNameExt( cFile:__enumKey() ) ) == ".hrb" /* We can use this function as this is a GPL licensed application */ - cFile := hb_compileFromBuf( cFile, hbmk_CoreHeaderFiles(), hb_ProgName(), "-n2", "-w", "-es2", "-q0" ) + cFile := hb_compileFromBuf( cFile, hbmk_CoreHeaderFiles(), hbmk_hb_ProgName(), "-n2", "-w", "-es2", "-q0" ) ENDIF IF ! Empty( cFile ) @@ -14839,7 +14868,7 @@ STATIC PROCEDURE __hbshell_Exec( cCommand ) BEGIN SEQUENCE WITH {| oError | __hbshell_Err( oError, cCommand ) } /* We can use this function as this is a GPL licensed application */ - cHRB := hb_compileFromBuf( cFunc, hbmk_CoreHeaderFiles(), hb_ProgName(), "-n2", "-q2", hb_ArrayToParams( aOPTPRG ) ) + cHRB := hb_compileFromBuf( cFunc, hbmk_CoreHeaderFiles(), hbmk_hb_ProgName(), "-n2", "-q2", hb_ArrayToParams( aOPTPRG ) ) IF Empty( cHRB ) Eval( ErrorBlock(), I_( "Syntax error." ) ) ELSE @@ -15084,7 +15113,7 @@ STATIC FUNCTION __hbshell_TryHeader( cName ) BEGIN SEQUENCE WITH __BreakBlock() - IF ! Empty( hb_compileFromBuf( "", hbmk_CoreHeaderFiles(), hb_ProgName(), "-q2", ; + IF ! Empty( hb_compileFromBuf( "", hbmk_CoreHeaderFiles(), hbmk_hb_ProgName(), "-q2", ; "-i" + hbsh[ _HBSH_hbmk ][ _HBMK_cHB_INSTALL_INC ], ; "-u+" + cName ) ) lRetVal := .T. @@ -15188,7 +15217,7 @@ STATIC FUNCTION __hbshell_gtDefault() RETURN "GTDOS" #elif defined( __PLATFORM__OS2 ) RETURN "GTOS2" -#elif defined( __PLATFORM__UNIX ) .AND. ! defined( __PLATFORM__VXWORKS ) .AND. ! defined( __PLATFORM__SYMBIAN ) +#elif defined( __PLATFORM__UNIX ) .AND. ! defined( __PLATFORM__WASM ) .AND. ! defined( __PLATFORM__VXWORKS ) .AND. ! defined( __PLATFORM__SYMBIAN ) RETURN "GTTRM" #else RETURN _HBMK_GT_DEF_ @@ -15847,7 +15876,7 @@ STATIC PROCEDURE ShowHelp( hbmk, lMore, lLong ) "", ; " " + hb_StrFormat( I_( "%1$s [options] [] " ), _SELF_NAME_ ) } - LOCAL cShell := iif( hb_FNameName( hb_ProgName() ) == _SELF_NAME_, "hbrun", hb_FNameName( hb_ProgName() ) ) + LOCAL cShell := iif( hb_FNameName( hbmk_hb_ProgName() ) == _SELF_NAME_, "hbrun", hb_FNameName( hbmk_hb_ProgName() ) ) LOCAL aHdr_Syntax_Shell := { ; I_( "Syntax:" ), ; @@ -16935,6 +16964,13 @@ STATIC FUNCTION _hbmk_TargetName( hbmk ) RETURN cName +STATIC FUNCTION hbmk_hb_ProgName() +#if defined( HBMK_PROGNAME ) + RETURN _HBMK_STRINGIFY( HBMK_PROGNAME ) +#else + RETURN hb_ProgName() +#endif + STATIC FUNCTION LicenseString() #pragma __cstream | RETURN %s This program is free software; you can redistribute it and/or modify