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:
@@ -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
|
||||||
|
|||||||
@@ -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
94
config/wasm/emcc.mk
Normal 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
9
config/wasm/global.mk
Normal 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
23
config/wasm/libs.mk
Normal 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
|
||||||
@@ -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'}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user