| \ wrapper again. This is all done by loading the index file(s?), |
\ wrapper again. This is all done by loading the index file(s?), |
| \ which define words for the wrappers in a separate wordlist. |
\ which define words for the wrappers in a separate wordlist. |
| |
|
| \ The files are built in .../lib/gforth/$VERSION/libcc/ or |
\ The files are built in .../lib/gforth$ARCH/$VERSION/libcc/ or |
| \ ~/.gforth/libcc/$HOST/. |
\ ~/.gforth$ARCH/libcc/$HOST/. |
| |
|
| \ Todo: conversion between function pointers and xts (both directions) |
\ Todo: conversion between function pointers and xts (both directions) |
| |
|
| \G One line of C declarations for the C interface |
\G One line of C declarations for the C interface |
| -1 parse save-c-prefix-line ; |
-1 parse save-c-prefix-line ; |
| |
|
| s" #include <gforth/" version-string s+ s" /libcc.h>" append ( c-addr u ) |
s" #include <gforth" arch-modifier s+ s" /" s+ version-string s+ s" /libcc.h>" append ( c-addr u ) |
| 2dup save-c-prefix-line drop free throw |
2dup save-c-prefix-line drop free throw |
| |
|
| \ Types (for parsing) |
\ Types (for parsing) |
| \ addr points to the return type index of a c-function descriptor |
\ addr points to the return type index of a c-function descriptor |
| dup { descriptor } |
dup { descriptor } |
| count { ret } count 2dup { d: pars } chars + count { d: c-name } |
count { ret } count 2dup { d: pars } chars + count { d: c-name } |
| ." void " lib-modulename 2@ type ." _LTX_" descriptor wrapper-function-name 2dup type drop free throw |
." void " |
| |
[ lib-suffix s" .la" str= [IF] ] ." lib" lib-modulename 2@ type ." _LTX_" [ [THEN] ] |
| |
descriptor wrapper-function-name 2dup type drop free throw |
| .\" (GFORTH_ARGS)\n" |
.\" (GFORTH_ARGS)\n" |
| .\" {\n Cell MAYBE_UNUSED *sp = gforth_SP;\n Float MAYBE_UNUSED *fp = gforth_FP;\n " |
.\" {\n Cell MAYBE_UNUSED *sp = gforth_SP;\n Float MAYBE_UNUSED *fp = gforth_FP;\n " |
| pars c-name 2over count-stacks ret gen-wrapped-stmt .\" ;\n" |
pars c-name 2over count-stacks ret gen-wrapped-stmt .\" ;\n" |
| libcc-named-dir-v 2@ ; |
libcc-named-dir-v 2@ ; |
| |
|
| : libcc-tmp-dir ( -- c-addr u ) |
: libcc-tmp-dir ( -- c-addr u ) |
| s" ~/.gforth/libcc-tmp/" ; |
s" ~/.gforth" arch-modifier s+ s" /libcc-tmp/" s+ ; |
| |
|
| : prepend-dirname ( c-addr1 u1 c-addr2 u2 -- c-addr3 u3 ) |
: prepend-dirname ( c-addr1 u1 c-addr2 u2 -- c-addr3 u3 ) |
| 2over s+ 2swap drop free throw ; |
2over s+ 2swap drop free throw ; |
| |
|
| : open-wrappers ( -- addr|0 ) |
: open-wrappers ( -- addr|0 ) |
| lib-filename 2@ s" .la" s+ |
lib-filename 2@ dirname s" lib" s+ lib-filename 2@ basename s+ lib-suffix s+ |
| 2dup libcc-named-dir string-prefix? if ( c-addr u ) |
2dup libcc-named-dir string-prefix? if ( c-addr u ) |
| \ see if we can open it in the path |
\ see if we can open it in the path |
| libcc-named-dir nip /string |
libcc-named-dir nip /string |
| libtool-cc append libtool-flags append s" -module -rpath " s+ ] sliteral |
libtool-cc append libtool-flags append s" -module -rpath " s+ ] sliteral |
| lib-filename 2@ dirname replace-rpath s+ s" " append |
lib-filename 2@ dirname replace-rpath s+ s" " append |
| lib-filename 2@ append s" .lo -o " append |
lib-filename 2@ append s" .lo -o " append |
| lib-filename 2@ append s" .la" append ( c-addr u ) |
lib-filename 2@ dirname append s" lib" append |
| |
lib-filename 2@ basename append s" .la" append ( c-addr u ) |
| c-libs 2@ append |
c-libs 2@ append |
| \ 2dup type cr |
\ 2dup type cr |
| 2dup system drop free throw $? abort" libtool link failed" |
2dup system drop free throw $? abort" libtool link failed" |
| compile-wrapper-function1 ; |
compile-wrapper-function1 ; |
| |
|
| : init-libcc ( -- ) |
: init-libcc ( -- ) |
| s" ~/.gforth/libcc-named/" libcc-named-dir-v 2! |
s" ~/.gforth" arch-modifier s+ s" /libcc-named/" s+ libcc-named-dir-v 2! |
| [IFDEF] $init |
[IFDEF] $init |
| libcc-path $init |
libcc-path $init |
| libcc-named-dir libcc-path also-path |
libcc-named-dir libcc-path also-path |