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/
This commit is contained in:
Aleksander Czajczynski
2025-07-05 20:20:38 +02:00
parent 81be99f647
commit a5c88273b4
10 changed files with 235 additions and 18 deletions

View File

@@ -7,6 +7,49 @@
Entries may not always be in chronological/commit order. Entries may not always be in chronological/commit order.
See license at the end of file. */ 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) 2025-03-25 13:54 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)
* contrib/hbcurl/core.c * contrib/hbcurl/core.c
! pacified warnings ! pacified warnings

View File

@@ -1748,6 +1748,12 @@ ifneq ($(HB_HOST_PLAT)$(HB_HOST_CPU),$(HB_PLATFORM)$(HB_CPU))
else else
ifeq ($(HB_PLATFORM),aix) ifeq ($(HB_PLATFORM),aix)
HB_PRGFLAGS += -D__PLATFORM__AIX -D__PLATFORM__UNIX 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 endif
endif endif

94
config/wasm/emcc.mk Normal file
View File

@@ -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

9
config/wasm/global.mk Normal file
View File

@@ -0,0 +1,9 @@
all : first
ifeq ($(HB_COMPILER),wasm)
BIN_EXT := .js
DYN_EXT := .so
endif
DYN_PREF := lib
HB_GT_LIBS += gtcgi

23
config/wasm/libs.mk Normal file
View File

@@ -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

View File

@@ -2,6 +2,8 @@
-o${hb_name} -o${hb_name}
-DHBMK_PROGNAME=hbrun{abstr}
-DHBMK_WITH_BUILTIN_HEADERS_ALL -DHBMK_WITH_BUILTIN_HEADERS_ALL
-DHBMK_WITH_GTXWC{HBMK_WITH_GTXWC='yes'} -DHBMK_WITH_GTXWC{HBMK_WITH_GTXWC='yes'}

View File

@@ -354,7 +354,7 @@
#endif #endif
#ifndef HB_OS_LINUX #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 #define HB_OS_LINUX
#endif #endif
#endif #endif

View File

@@ -49,7 +49,10 @@
/* XXX: Check and possibly extend this to other Unix-like platforms */ /* XXX: Check and possibly extend this to other Unix-like platforms */
#if ( defined( HB_OS_BSD ) && ! defined( HB_OS_DARWIN ) ) || \ #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 * sysctl() on Linux has fallen into depreciation. Not available in current
* runtime C libraries, like musl and glibc >= 2.30. * runtime C libraries, like musl and glibc >= 2.30.

View File

@@ -57,6 +57,7 @@
# include <unistd.h> # include <unistd.h>
# include <signal.h> # include <signal.h>
# if defined( SIGSTKSZ ) && \ # if defined( SIGSTKSZ ) && \
! defined( __EMSCRIPTEN__ ) && \
( ( defined( _BSD_SOURCE ) && _BSD_SOURCE ) || \ ( ( defined( _BSD_SOURCE ) && _BSD_SOURCE ) || \
( defined( _XOPEN_SOURCE ) && _XOPEN_SOURCE >= 500 ) ) ( defined( _XOPEN_SOURCE ) && _XOPEN_SOURCE >= 500 ) )
# define HB_SIGNAL_EXCEPTION_HANDLER # define HB_SIGNAL_EXCEPTION_HANDLER

View File

@@ -165,7 +165,7 @@ EXTERNAL HB_GT_CGI_DEFAULT
EXTERNAL HB_GT_DOS EXTERNAL HB_GT_DOS
#elif defined( __PLATFORM__OS2 ) #elif defined( __PLATFORM__OS2 )
EXTERNAL HB_GT_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 EXTERNAL HB_GT_TRM
#if defined( HBMK_WITH_GTXWC ) #if defined( HBMK_WITH_GTXWC )
EXTERNAL HB_GT_XWC EXTERNAL HB_GT_XWC
@@ -181,6 +181,8 @@ EXTERNAL hbmk_KEYW
#define HB_SYMBOL_UNUSED( symbol ) ( ( symbol ) ) #define HB_SYMBOL_UNUSED( symbol ) ( ( symbol ) )
#endif #endif
#xtranslate _HBMK_STRINGIFY( <x> ) => <"x">
#define _SELF_NAME_ "hbmk2" #define _SELF_NAME_ "hbmk2"
#define _SELF_NAME_LONG_ "Harbour Make" #define _SELF_NAME_LONG_ "Harbour Make"
@@ -1846,7 +1848,7 @@ STATIC FUNCTION __hbmk( aArgs, nArgTarget, nLevel, /* @ */ lPause, /* @ */ lExit
cBin_CompPRG := "harbour" + l_cHBSUFFIX cBin_CompPRG := "harbour" + l_cHBSUFFIX
DO CASE 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 DO CASE
CASE hbmk[ _HBMK_cPLAT ] == "linux" CASE hbmk[ _HBMK_cPLAT ] == "linux"
aCOMPSUP := { "gcc", "clang", "icc", "watcom", "sunpro", "open64", "pcc" } aCOMPSUP := { "gcc", "clang", "icc", "watcom", "sunpro", "open64", "pcc" }
@@ -1864,6 +1866,8 @@ STATIC FUNCTION __hbmk( aArgs, nArgTarget, nLevel, /* @ */ lPause, /* @ */ lExit
aCOMPSUP := { "gcc", "icc" } aCOMPSUP := { "gcc", "icc" }
CASE hbmk[ _HBMK_cPLAT ] == "minix" CASE hbmk[ _HBMK_cPLAT ] == "minix"
aCOMPSUP := { "clang", "gcc" } aCOMPSUP := { "clang", "gcc" }
CASE hbmk[ _HBMK_cPLAT ] == "wasm"
aCOMPSUP := { "emcc" }
OTHERWISE OTHERWISE
aCOMPSUP := { "gcc" } aCOMPSUP := { "gcc" }
ENDCASE ENDCASE
@@ -1886,6 +1890,15 @@ STATIC FUNCTION __hbmk( aArgs, nArgTarget, nLevel, /* @ */ lPause, /* @ */ lExit
l_aLIBHBGT := {} l_aLIBHBGT := {}
hbmk[ _HBMK_cGTDEFAULT ] := "gtstd" hbmk[ _HBMK_cGTDEFAULT ] := "gtstd"
cBinExt := ".exe" 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 OTHERWISE
l_aLIBHBGT := { "gttrm" } l_aLIBHBGT := { "gttrm" }
hbmk[ _HBMK_cGTDEFAULT ] := "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 ] == "linux" .AND. hbmk[ _HBMK_cCOMP ] == "pcc" ) .OR. ;
( hbmk[ _HBMK_cPLAT ] == "sunos" .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 ] == "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 ) #if defined( __PLATFORM__UNIX )
hbmk[ _HBMK_nCmd_Esc ] := _ESC_NIX 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}" cOpt_Lib := "-static -no_warning_for_no_symbols {FA} -o {OL} {LO}"
ELSE ELSE
DO CASE DO CASE
CASE hbmk[ _HBMK_cCOMP ] == "emcc"
cBin_Lib := GetEnv( "LLVM_ROOT" ) + hb_ps() + "llvm-ar"
CASE hbmk[ _HBMK_cCOMP ] == "icc" CASE hbmk[ _HBMK_cCOMP ] == "icc"
cBin_Lib := "xiar" cBin_Lib := "xiar"
CASE hbmk[ _HBMK_cPLAT ] == "vxworks" CASE hbmk[ _HBMK_cPLAT ] == "vxworks"
@@ -4062,6 +4078,9 @@ STATIC FUNCTION __hbmk( aArgs, nArgTarget, nLevel, /* @ */ lPause, /* @ */ lExit
CASE hbmk[ _HBMK_cPLAT ] == "vxworks" CASE hbmk[ _HBMK_cPLAT ] == "vxworks"
cBin_CompCPP := hbmk[ _HBMK_cCCPREFIX ] + "g++" + hbmk[ _HBMK_cCCSUFFIX ] 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 ] ) 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 OTHERWISE
cBin_CompCPP := hbmk[ _HBMK_cCCPREFIX ] + "g++" + hbmk[ _HBMK_cCCSUFFIX ] 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 ] ) 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" IF hbmk[ _HBMK_cPLAT ] == "minix"
AAdd( hbmk[ _HBMK_aOPTC ], "-D_NETBSD_SOURCE=1" ) AAdd( hbmk[ _HBMK_aOPTC ], "-D_NETBSD_SOURCE=1" )
ENDIF 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}" cOpt_CompC += " {FC}"
IF ! Empty( hbmk[ _HBMK_cWorkDir ] ) IF ! Empty( hbmk[ _HBMK_cWorkDir ] )
/* Symbian gcc cross-compiler (on Windows) crashes if compiling multiple files at once */ /* 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. lCHD_Comp := .T.
cOpt_CompC += " {LC}" cOpt_CompC += " {LC}"
ELSE ELSE
@@ -4150,7 +4174,7 @@ STATIC FUNCTION __hbmk( aArgs, nArgTarget, nLevel, /* @ */ lPause, /* @ */ lExit
IF hbmk[ _HBMK_cPLAT ] == "darwin" IF hbmk[ _HBMK_cPLAT ] == "darwin"
cLibHBX_Regex := R_( "[\s]T" ) + cLibHBX_Regex cLibHBX_Regex := R_( "[\s]T" ) + cLibHBX_Regex
ENDIF 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_aOPTL ], "-Wl,--start-group {LL} {LB} {LF} -Wl,--end-group" )
AAdd( hbmk[ _HBMK_aOPTD ], "-Wl,--start-group {LL} {LB} {LF} -Wl,--end-group" ) AAdd( hbmk[ _HBMK_aOPTD ], "-Wl,--start-group {LL} {LB} {LF} -Wl,--end-group" )
ELSE ELSE
@@ -4212,14 +4236,14 @@ STATIC FUNCTION __hbmk( aArgs, nArgTarget, nLevel, /* @ */ lPause, /* @ */ lExit
ENDIF ENDIF
IF lStopAfterCComp 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[ _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}" ) AAdd( hbmk[ _HBMK_aOPTC ], "-o {OO}" )
ELSE ELSE
AAdd( hbmk[ _HBMK_aOPTC ], "-o{OO}" ) AAdd( hbmk[ _HBMK_aOPTC ], "-o{OO}" )
ENDIF ENDIF
ENDIF ENDIF
ELSE 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}" ) AAdd( hbmk[ _HBMK_aOPTL ], "-o {OE}" )
ELSE ELSE
AAdd( hbmk[ _HBMK_aOPTL ], "-o{OE}" ) AAdd( hbmk[ _HBMK_aOPTL ], "-o{OE}" )
@@ -10586,7 +10610,7 @@ STATIC FUNCTION EnvNotation( cEnvName )
RETURN "$" + cEnvName RETURN "$" + cEnvName
#endif #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 ) STATIC FUNCTION AutoConfPathList( hbmk, lCWD, lForDocOutput )
@@ -12063,6 +12087,10 @@ STATIC PROCEDURE PlatformPRGFlags( hbmk, aOPTPRG )
CASE hbmk[ _HBMK_cPLAT ] == "aix" CASE hbmk[ _HBMK_cPLAT ] == "aix"
AAdd( aDf, "__PLATFORM__AIX" ) AAdd( aDf, "__PLATFORM__AIX" )
AAdd( aDf, "__PLATFORM__UNIX" ) AAdd( aDf, "__PLATFORM__UNIX" )
CASE hbmk[ _HBMK_cPLAT ] == "wasm"
AAdd( aDf, "__PLATFORM__UNIX" )
AAdd( aDf, "__PLATFORM__WASM" )
AAdd( aDf, "__PLATFORM__ABSTRACT" )
ENDCASE ENDCASE
/* Setup those CPU flags which we can be sure about. /* Setup those CPU flags which we can be sure about.
@@ -12696,7 +12724,7 @@ STATIC FUNCTION win_implib_omf( hbmk, cSourceDLL, cTargetLib )
LOCAL cSourceLib 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 hb_FileExists( cSourceLib := hb_FNameExtSet( cSourceDLL, ".lib" ) )
IF IsOMFLib( cSourceLib ) IF IsOMFLib( cSourceLib )
IF ! hbmk[ _HBMK_lQuiet ] IF ! hbmk[ _HBMK_lQuiet ]
@@ -13138,6 +13166,7 @@ FUNCTION hbmk_KEYW( hbmk, cFileName, cKeyword, cValue, cOperator )
CASE "winuni" ; RETURN hbmk[ _HBMK_lWINUNI ] CASE "winuni" ; RETURN hbmk[ _HBMK_lWINUNI ]
CASE "winansi" ; 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 "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 "allwin" ; RETURN HBMK_ISPLAT( "win|wce" )
CASE "allgcc" ; RETURN HBMK_ISCOMP( "gcc|mingw|mingw64|mingwarm|djgpp|gccomf|clang|open64|pcc" ) CASE "allgcc" ; RETURN HBMK_ISCOMP( "gcc|mingw|mingw64|mingwarm|djgpp|gccomf|clang|open64|pcc" )
CASE "allmingw" ; RETURN HBMK_ISCOMP( "mingw|mingw64|mingwarm" ) CASE "allmingw" ; RETURN HBMK_ISCOMP( "mingw|mingw64|mingwarm" )
@@ -13903,7 +13932,7 @@ STATIC PROCEDURE __hbshell( cFile, ... )
/* Save originals */ /* Save originals */
hbsh[ _HBSH_cDirBase ] := hb_DirBase() hbsh[ _HBSH_cDirBase ] := hb_DirBase()
hbsh[ _HBSH_cProgName ] := hb_ProgName() hbsh[ _HBSH_cProgName ] := hbmk_hb_ProgName()
/* Init */ /* Init */
@@ -14076,7 +14105,7 @@ STATIC PROCEDURE __hbshell( cFile, ... )
/* We can use this function as this is a GPL licenced application */ /* We can use this function as this is a GPL licenced application */
cFile := hb_compileBuf( ; cFile := hb_compileBuf( ;
hbmk_CoreHeaderFiles(), ; hbmk_CoreHeaderFiles(), ;
hb_ProgName(), ; hbmk_hb_ProgName(), ;
"-n2", "-w", "-es2", "-q0", ; "-n2", "-w", "-es2", "-q0", ;
hb_ArrayToParams( aOPTPRG ), ; hb_ArrayToParams( aOPTPRG ), ;
"-D" + _HBMK_SHELL, ; "-D" + _HBMK_SHELL, ;
@@ -14449,7 +14478,7 @@ STATIC FUNCTION __hbshell_plugins_load( hPlugins, aParams )
IF ! Lower( hb_FNameExt( cFile:__enumKey() ) ) == ".hrb" IF ! Lower( hb_FNameExt( cFile:__enumKey() ) ) == ".hrb"
/* We can use this function as this is a GPL licensed application */ /* 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 ENDIF
IF ! Empty( cFile ) IF ! Empty( cFile )
@@ -14839,7 +14868,7 @@ STATIC PROCEDURE __hbshell_Exec( cCommand )
BEGIN SEQUENCE WITH {| oError | __hbshell_Err( oError, cCommand ) } BEGIN SEQUENCE WITH {| oError | __hbshell_Err( oError, cCommand ) }
/* We can use this function as this is a GPL licensed application */ /* 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 ) IF Empty( cHRB )
Eval( ErrorBlock(), I_( "Syntax error." ) ) Eval( ErrorBlock(), I_( "Syntax error." ) )
ELSE ELSE
@@ -15084,7 +15113,7 @@ STATIC FUNCTION __hbshell_TryHeader( cName )
BEGIN SEQUENCE WITH __BreakBlock() 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 ], ; "-i" + hbsh[ _HBSH_hbmk ][ _HBMK_cHB_INSTALL_INC ], ;
"-u+" + cName ) ) "-u+" + cName ) )
lRetVal := .T. lRetVal := .T.
@@ -15188,7 +15217,7 @@ STATIC FUNCTION __hbshell_gtDefault()
RETURN "GTDOS" RETURN "GTDOS"
#elif defined( __PLATFORM__OS2 ) #elif defined( __PLATFORM__OS2 )
RETURN "GTOS2" 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" RETURN "GTTRM"
#else #else
RETURN _HBMK_GT_DEF_ RETURN _HBMK_GT_DEF_
@@ -15847,7 +15876,7 @@ STATIC PROCEDURE ShowHelp( hbmk, lMore, lLong )
"", ; "", ;
" " + hb_StrFormat( I_( "%1$s [options] [<script[s]>] <src[s][.prg|.c|.obj|.o|.rc|.res|.def|.po|.pot|.hbl|@.clp|.d|.ch]>" ), _SELF_NAME_ ) } " " + hb_StrFormat( I_( "%1$s [options] [<script[s]>] <src[s][.prg|.c|.obj|.o|.rc|.res|.def|.po|.pot|.hbl|@.clp|.d|.ch]>" ), _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 := { ; LOCAL aHdr_Syntax_Shell := { ;
I_( "Syntax:" ), ; I_( "Syntax:" ), ;
@@ -16935,6 +16964,13 @@ STATIC FUNCTION _hbmk_TargetName( hbmk )
RETURN cName RETURN cName
STATIC FUNCTION hbmk_hb_ProgName()
#if defined( HBMK_PROGNAME )
RETURN _HBMK_STRINGIFY( HBMK_PROGNAME )
#else
RETURN hb_ProgName()
#endif
STATIC FUNCTION LicenseString() STATIC FUNCTION LicenseString()
#pragma __cstream | RETURN %s #pragma __cstream | RETURN %s
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify