diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 3708683481..5f92d9a976 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -16,6 +16,35 @@ The license applies to all entries newer than 2009-04-28. */ +2010-07-27 12:44 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) + * utils/hbmk2/hbmk2.prg + + Added new plugin APIs: + - hbmk2_AddInput_OBJ() + - hbmk2_PathFromWorkdirToCWD() + - hbmk2_CWD() + + Changed to not abort processing if there are no input files, but + there are custom plugin input parameter. + + + bin/hbmk_l2d.hbs + + Added rough plugin to convert static libs to dynamic libs + on platforms supporting 'ar' tool (and of course the notion + of such conversion). This is meant to replace functionality + provided by bash script hb-mkdyn.sh. + Pls find cmdline example in the script header. + + * config/postinst.hbs + + Now installs hbmk_l2d.hbs + + - bin/hb-mkdyn.sh + - Deleted hb-mkdyn speciality shell tool to convert static + libs to dynamic ones. + + - bin/postinst.sh + - Deleted, it only started hb-mkdyn.sh, which was just deleted. + + * Makefile + - Do not run postinst.sh anymore. + 2010-07-27 11:26 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) - debian + package/debian diff --git a/harbour/Makefile b/harbour/Makefile index adcb68980f..1390397248 100644 --- a/harbour/Makefile +++ b/harbour/Makefile @@ -48,14 +48,7 @@ include $(ROOT)config/dir.mk ifneq ($(HB_NO_HBSCRIPT),yes) -ifeq ($(HB_SHELL),sh) - HB_POSTINST := $(TOP)$(ROOT)bin/postinst.sh -else - HB_POSTINST := -endif - install:: $(if $(wildcard $(HB_HOST_BIN_DIR)/hbrun$(HB_HOST_BIN_EXT)),+$(HB_HOST_BIN_DIR)/hbrun$(HB_HOST_BIN_EXT) --hb:gtcgi $(TOP)$(ROOT)config/postinst.hbs,@$(ECHO) $(ECHOQUOTE)! Warning: hbrun not found, config/postinst.hbs skipped.$(ECHOQUOTE)) - $(if $(wildcard $(HB_POSTINST)),+$(HB_POSTINST),) endif diff --git a/harbour/bin/hb-mkdyn.sh b/harbour/bin/hb-mkdyn.sh deleted file mode 100755 index 1609c73722..0000000000 --- a/harbour/bin/hb-mkdyn.sh +++ /dev/null @@ -1,158 +0,0 @@ -#!/bin/sh -# -# $Id$ -# - -# --------------------------------------------------------------- -# Copyright 2003 Przemyslaw Czerpak -# simple script to build shared libraries from static ones and -# object files -# -# See COPYING for licensing terms. -# --------------------------------------------------------------- - -# HB_PLATFORM="" -# HB_CCPREFIX="" -# HB_CCPATH="" - -if [ -n "${HB_PLATFORM}" ] -then - hb_plat="${HB_PLATFORM}" -else - hb_plat=`uname -s | tr -d "[-]" | tr '[A-Z]' '[a-z]' 2>/dev/null` -fi - -linker_options="" - -case "$hb_plat" in - *windows*|*mingw32*|msys*|cygwin*) hb_plat="win" ;; - *os/2*) hb_plat="os2" ;; - *dos) hb_plat="dos" ;; - *bsd) hb_plat="bsd" ;; -esac - -case "$hb_plat" in - darwin) SLIB_EXT=".dylib" ;; - win) SLIB_EXT=".dll" ;; - wce) SLIB_EXT=".dll" ;; - os2) SLIB_EXT=".dll" ;; - hpux) SLIB_EXT=".sl" ;; - *) SLIB_EXT=".so" ;; -esac - -NAME="${1%${SLIB_EXT}}" -LIB_NAME="${NAME##*/}" -DSTDIR="${NAME%${LIB_NAME}}" -[ -n "${DSTDIR}" ] || DSTDIR="./" - -if [ $# -lt 2 ] || [ -z "${LIB_NAME}" ] -then - echo "usage: `basename $0` [link options] src1.a .. srcN.a [obj1.o .. objN.o]" - exit 1 -fi - -shift - -BASE=`echo ${LIB_NAME} | sed "s/\([^.-]*\)[.-][0-9.]*/\1/g"` -VERSION="${LIB_NAME#${BASE}}" -VERSION="${VERSION#[.-]}" -REVIS="${VERSION}" -MAJOR="${REVIS%%.*}" -REVIS="${REVIS#${MAJOR}}" -REVIS="${REVIS#.}" -MINOR="${REVIS%%.*}" -REVIS="${REVIS#${MINOR}}" -REVIS="${REVIS#.}" -REVIS="${REVIS%%.*}" -[ -n "${MAJOR}" ] || MAJOR=2 -[ -n "${MINOR}" ] || MINOR=0 -[ -n "${REVIS}" ] || REVIS=0 -VERSION="${MAJOR}.${MINOR}.${REVIS}" - -OTMPDIR="" -dir=`pwd` - -cleanup() -{ - [ -z "${OTMPDIR}" ] || rm -fR "${OTMPDIR}" -} - -trap cleanup EXIT >/dev/null 2>&1 - -if [ "${SLIB_EXT}" != ".dylib" ]; then - - OTMPDIR="/tmp/hb-mkdyn-$$" - rm -fR "${OTMPDIR}" - mkdir -p "${OTMPDIR}" - cd "${OTMPDIR}" - - for f in $* - do - case "${f}" in - *.o) - if [ "${f#/}" == "${f}" ]; then - f="${dir}/${f}" - fi - if [ ! -r "${f}" ]; then - echo "cannot read file: ${f}" - exit 1 - fi - cp "${f}" "${OTMPDIR}" || exit 1 - ;; - *.a) - if [ "${f#/}" == "${f}" ]; then - f="${dir}/${f}" - fi - if [ ! -r "${f}" ]; then - echo "cannot read file: ${f}" - exit 1 - fi - d="${f%.a}" - d="${f##*/}" - mkdir $d - cd $d - ${HB_CCPATH}${HB_CCPREFIX}ar -x "${f}" || exit 1 - cd .. - ;; - *) - linker_options="${linker_options} ${f}" - ;; - esac - done - cd "${OTMPDIR}" - OBJLST=`find . -name \*.o` -fi - -if [ "${SLIB_EXT}" = ".dylib" ]; then - FULLNAME="${BASE}.${VERSION}${SLIB_EXT}" - libtool -dynamic -install_name "${BASE}${SLIB_EXT}" \ - -compatibility_version ${MAJOR}.${MINOR} -current_version ${VERSION} \ - -flat_namespace -undefined warning -multiply_defined suppress -single_module ${HB_USER_DFLAGS} \ - -o "${DSTDIR}/${FULLNAME}" "$@" && \ - ln -sf "${FULLNAME}" "${DSTDIR}${BASE}.${MAJOR}${SLIB_EXT}" && \ - ln -sf "${FULLNAME}" "${DSTDIR}${BASE}${SLIB_EXT}" -elif [ "${SLIB_EXT}" = ".dll" ]; then - FULLNAME="${LIB_NAME}${SLIB_EXT}" - if [ "$HB_COMPILER" = "mingwarm" ]; then - SYSLIBS="-lws2" - else - SYSLIBS="-luser32 -lws2_32 -ladvapi32 -lgdi32" - fi - # -Wl,--output-def,testdll.def,--out-implib,libtestdll.a - ${HB_CCPATH}${HB_CCPREFIX}gcc -shared -o "${FULLNAME}" $OBJLST ${linker_options} ${HB_USER_DFLAGS} ${SYSLIBS} ${HB_DLLIBS} && \ - cd "${dir}" && \ - rm -f "${DSTDIR}${FULLNAME}" && \ - mv -f "${OTMPDIR}/${FULLNAME}" "${DSTDIR}${FULLNAME}" -else - #FULLNAME="${BASE}-${VERSION}${SLIB_EXT}" - #FULLNAME="${BASE}{SLIB_EXT}.${VERSION}" - FULLNAME="${LIB_NAME}${SLIB_EXT}" - ${HB_CCPATH}${HB_CCPREFIX}gcc -shared -o "${FULLNAME}" $OBJLST ${linker_options} ${HB_USER_DFLAGS} && \ - cd "${dir}" && \ - mv -f "${OTMPDIR}/${FULLNAME}" "${DSTDIR}${FULLNAME}" -fi - -stat="$?" -[ $stat != 0 ] && cd "${dir}" && rm -f "${DSTDIR}${FULLNAME}" -cleanup -exit "${stat}" diff --git a/harbour/bin/hbmk_l2d.hbs b/harbour/bin/hbmk_l2d.hbs new file mode 100644 index 0000000000..e37a2c1c8d --- /dev/null +++ b/harbour/bin/hbmk_l2d.hbs @@ -0,0 +1,165 @@ +/* + * $Id$ + */ + +/* + * hbmk2 plugin script, static lib to dynamic lib conversion for + * environments supporting 'ar' tool. + * Usage: + * 'hbmk2 -hbdyn -pi= -plugin=hbmk_l2d.hbs -o -nohblib-' + * + * Copyright 2010 Viktor Szakats (harbour.01 syenar.hu) + * www - http://harbour-project.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA (or visit + * their web site at http://www.gnu.org/). + * + */ + +#pragma warninglevel=3 + +#define I_( x ) hb_i18n_gettext( x ) + +#if ! defined( __HBSCRIPT__HBRUN ) + +FUNCTION hbmk2_plugin_lib2dyn( hbmk2 ) + LOCAL cRetVal := "" + + LOCAL cSrc + + LOCAL cCommand + LOCAL nError + + LOCAL cStdOut + LOCAL cLine + + LOCAL cOldDir + + SWITCH hbmk2[ "cSTATE" ] + CASE "init" + + hbmk2[ "vars" ][ "aOBJ_Src" ] := {} + EXIT + + CASE "pre_all" + + /* Gather input parameters */ + + hbmk2[ "vars" ][ "aLIB_Src" ] := {} + + FOR EACH cSrc IN hbmk2[ "params" ] + SWITCH Lower( hbmk2_FNameExtGet( cSrc ) ) + CASE ".a" + AAdd( hbmk2[ "vars" ][ "aLIB_Src" ], cSrc ) + EXIT + ENDSWITCH + NEXT + + FOR EACH cSrc IN hbmk2[ "vars" ][ "aLIB_Src" ] + + cCommand := "ar" +; + " -t" +; + " " + hbmk2_FNameEscape( hbmk2_PathSepToTarget( hbmk2, cSrc ), hbmk2[ "nCmd_Esc" ], hbmk2[ "nCmd_FNF" ] ) + + IF hbmk2[ "lTRACE" ] + IF ! hbmk2[ "lQUIET" ] + hbmk2_OutStd( hbmk2, I_( "'ar' command:" ) ) + ENDIF + hbmk2_OutStdRaw( cCommand ) + ENDIF + + IF ! hbmk2[ "lDONTEXEC" ] + IF ( nError := hb_processRun( cCommand,, @cStdOut ) ) != 0 + hbmk2_OutErr( hbmk2, hb_StrFormat( I_( "Error: Running 'ar' executable. %1$s" ), hb_ntos( nError ) ) ) + IF ! hbmk2[ "lQUIET" ] + hbmk2_OutErrRaw( cCommand ) + ENDIF + IF ! hbmk2[ "lIGNOREERROR" ] + cRetVal := "error" + EXIT + ENDIF + ELSE + FOR EACH cLine IN hb_ATokens( StrTran( cStdOut, Chr( 13 ) ), Chr( 10 ) ) + IF ! Empty( cLine ) + cLine := hbmk2_FNameDirExtSet( hbmk2_FNameNameGet( cLine ), hbmk2[ "cWorkDir" ] ) + AAdd( hbmk2[ "vars" ][ "aOBJ_Src" ], cLine ) + hbmk2_AddInput_OBJ( hbmk2, cLine ) + ENDIF + NEXT + ENDIF + ENDIF + NEXT + + EXIT + + CASE "pre_all" + + EXIT + + CASE "pre_link" + + IF ! hbmk2[ "lCLEAN" ] .AND. ; + ! Empty( hbmk2[ "vars" ][ "aLIB_Src" ] ) + + FOR EACH cSrc IN hbmk2[ "vars" ][ "aLIB_Src" ] + + cCommand := "ar" +; + " -x" +; + " " + hbmk2_FNameEscape( hbmk2_PathSepToTarget( hbmk2, hbmk2_PathNormalize( hbmk2_PathMakeAbsolute( cSrc, hbmk2_PathFromWorkdirToCWD( hbmk2 ) ) ) ), hbmk2[ "nCmd_Esc" ], hbmk2[ "nCmd_FNF" ] ) + + IF hbmk2[ "lTRACE" ] + IF ! hbmk2[ "lQUIET" ] + hbmk2_OutStd( hbmk2, I_( "'ar' command:" ) ) + ENDIF + hbmk2_OutStdRaw( cCommand ) + ENDIF + + IF ! hbmk2[ "lDONTEXEC" ] + cOldDir := hbmk2_CWD() + DirChange( hbmk2[ "cWorkDir" ] ) + IF ( nError := hb_processRun( cCommand ) ) != 0 + DirChange( cOldDir ) + hbmk2_OutErr( hbmk2, hb_StrFormat( I_( "Error: Running 'ar' executable. %1$s" ), hb_ntos( nError ) ) ) + IF ! hbmk2[ "lQUIET" ] + hbmk2_OutErrRaw( cCommand ) + ENDIF + IF ! hbmk2[ "lIGNOREERROR" ] + cRetVal := "error" + EXIT + ENDIF + ELSE + DirChange( cOldDir ) + ENDIF + ENDIF + NEXT + ENDIF + + EXIT + + CASE "pre_c" + + EXIT + + CASE "post_all" + + IF ! hbmk2[ "lINC" ] .OR. hbmk2[ "lCLEAN" ] + AEval( hbmk2[ "vars" ][ "aOBJ_Src" ], {| tmp | FErase( tmp ) } ) + ENDIF + + EXIT + + ENDSWITCH + + RETURN cRetVal diff --git a/harbour/bin/postinst.sh b/harbour/bin/postinst.sh deleted file mode 100755 index de5daa1967..0000000000 --- a/harbour/bin/postinst.sh +++ /dev/null @@ -1,129 +0,0 @@ -#!/bin/sh -# -# $Id$ -# - -# --------------------------------------------------------------- -# Copyright 2003 Przemyslaw Czerpak -# simple script run after Harbour make install to finish install -# process -# -# See COPYING for licensing terms. -# --------------------------------------------------------------- - -if [ -z "${__running_in_posix_sh__}" ] -then - __running_in_posix_sh__=1 - export __running_in_posix_sh__ - - [ -x /usr/bin/posix/sh ] && \ - exec /usr/bin/posix/sh "$0" ${1+"$@"} - [ -x /usr/xpg4/bin/sh ] && \ - exec /usr/xpg4/bin/sh "$0" ${1+"$@"} - - exec /bin/sh "$0" ${1+"$@"} -fi - -unset __running_in_posix_sh__ - -__builtin_which() -{ - what="$1" - ret=1 - oIFS="$IFS" - IFS=: - for pathcomp in $PATH - do - if [ -x "${pathcomp}"/"${what}" ] - then - ret=0 - echo "${pathcomp}"/"${what}" - break - fi - done - IFS="$oIFS" - return $ret -} - -if [ -z "$HB_PLATFORM" ] || [ -z "$HB_COMPILER" ] || \ - [ -z "$HB_BIN_INSTALL" ] || \ - [ -z "$HB_INC_INSTALL" ] || \ - [ -z "$HB_LIB_INSTALL" ] -then - echo "The following envvars must be set:" - echo " HB_PLATFORM" - echo " HB_COMPILER" - echo " HB_BIN_INSTALL" - echo " HB_INC_INSTALL" - echo " HB_LIB_INSTALL" - exit 1 -fi - -hb_root=`dirname "$0"` -if [ "${hb_root}" = "." ] -then - hb_root=".." -else - hb_root=`dirname "${hb_root}"` -fi -if [ ! -f ${hb_root}/bin/hb-func.sh ] && [ -f ./bin/hb-func.sh ] -then - hb_root="." -fi - -. ${hb_root}/bin/hb-func.sh - -__install="` __builtin_which install `" - -# chmod 644 ${HB_INC_INSTALL}/* - -if [ "$HB_COMPILER" = "gcc" ] || \ - [ "$HB_COMPILER" = "mingw" ] || \ - [ "$HB_COMPILER" = "mingw64" ] || \ - [ "$HB_COMPILER" = "mingwarm" ] || \ - [ "$HB_COMPILER" = "cygwin" ] || \ - [ "$HB_COMPILER" = "djgpp" ] || \ - [ "$HB_COMPILER" = "icc" ] || \ - [ "$HB_COMPILER" = "sunpro" ] || \ - [ "$HB_COMPILER" = "open64" ] || \ - [ "$HB_COMPILER" = "clang" ] -then - if [ -n "${HB_TOOLS_PREF}" ]; then - hb_mkdyn="${HB_BIN_INSTALL}/${HB_TOOLS_PREF}-mkdyn" - rm -f "${hb_mkdyn}" - sed -e "s!^# HB_PLATFORM=\"\"\$!HB_PLATFORM=\"${HB_PLATFORM}\"!g" \ - -e "s!^# HB_CCPREFIX=\"\"\$![ -n \"\${HB_CCPREFIX}\" ] || HB_CCPREFIX=\"${HB_CCPREFIX}\"!g" \ - -e "s!^# HB_CCPATH=\"\"\$![ -n \"\${HB_CCPATH}\" ] || HB_CCPATH=\"${HB_CCPATH}\"!g" \ - "${hb_root}/bin/hb-mkdyn.sh" > "${hb_mkdyn}" && \ - chmod 755 "${hb_mkdyn}" - elif [ "$HB_COMPILER" = "icc" ]; then - hb_mkdyn="${HB_BIN_INSTALL}/hb-mkdyn" - rm -f "${hb_mkdyn}" - sed -e "s/gcc/icc/g" "${hb_root}/bin/hb-mkdyn.sh" > "${hb_mkdyn}" && \ - chmod 755 "${hb_mkdyn}" - elif [ "$HB_COMPILER" = "sunpro" ]; then - hb_mkdyn="${HB_BIN_INSTALL}/hb-mkdyn" - rm -f "${hb_mkdyn}" - lnopt="" - [ "$HB_BUILD_OPTIM" = "no" ] || lnopt="-fast -xnolibmopt $lnopt" - sed -e "s/gcc -shared/suncc -G ${lnopt} ${HB_ISAOPT}/g" \ - "${hb_root}/bin/hb-mkdyn.sh" > "${hb_mkdyn}" && \ - chmod 755 "${hb_mkdyn}" - elif [ "$HB_COMPILER" = "open64" ]; then - hb_mkdyn="${HB_BIN_INSTALL}/hb-mkdyn" - rm -f "${hb_mkdyn}" - sed -e "s/gcc/opencc/g" "${hb_root}/bin/hb-mkdyn.sh" > "${hb_mkdyn}" && \ - chmod 755 "${hb_mkdyn}" - elif [ "${HB_PLATFORM}" = "sunos" ] || \ - [ "${HB_PLATFORM}" = "hpux" ] || \ - [ -z "${__install}" ]; then - hb_mkdyn="${HB_BIN_INSTALL}/hb-mkdyn" - rm -f "${hb_mkdyn}" - cp "${hb_root}/bin/hb-mkdyn.sh" "${hb_mkdyn}" && \ - chmod 755 "${hb_mkdyn}" - elif [ "${HB_PLATFORM}" != "dos" ]; then - hb_mkdyn="${HB_BIN_INSTALL}/hb-mkdyn" - # Without -c some OSes _move_ the file instead of copying it! - ${__install} -c -m 755 "${hb_root}/bin/hb-mkdyn.sh" "${hb_mkdyn}" - fi -fi diff --git a/harbour/config/postinst.hbs b/harbour/config/postinst.hbs index 0b49e5ebcf..5dcd274e1d 100644 --- a/harbour/config/postinst.hbs +++ b/harbour/config/postinst.hbs @@ -73,7 +73,8 @@ PROCEDURE Main() hb_FCopy( "TODO" , GetEnv( "HB_INSTALL_PREFIX" ) + hb_ps() + "TODO" ) /* public Harbour scripts */ - FOR EACH tmp IN { "hbxpatch.hbs" } + FOR EACH tmp IN { "hbmk_l2d.hbs" ,; + "hbxpatch.hbs" } hb_FCopy( "bin" + hb_ps() + tmp, GetEnv( "HB_BIN_INSTALL" ) + hb_ps() + tmp ) NEXT ENDIF @@ -174,7 +175,6 @@ PROCEDURE Main() IF ! Empty( cBin_Tar ) - cTar_Name := GetEnv( "HB_PKGNAME" ) IF ! Empty( tmp := unix_name() ) cTar_Name += tmp diff --git a/harbour/utils/hbmk2/hbmk2.prg b/harbour/utils/hbmk2/hbmk2.prg index 185aa9fa09..d6125a4d50 100644 --- a/harbour/utils/hbmk2/hbmk2.prg +++ b/harbour/utils/hbmk2/hbmk2.prg @@ -2641,7 +2641,7 @@ FUNCTION hbmk2( aArgs, nArgTarget, /* @ */ lPause, nLevel ) ENDIF /* Start doing the make process. */ - IF ! hbmk[ _HBMK_lStopAfterInit ] .AND. ! hbmk[ _HBMK_lCreateImpLib ] .AND. ( Len( hbmk[ _HBMK_aPRG ] ) + Len( hbmk[ _HBMK_aC ] ) + Len( hbmk[ _HBMK_aCPP ] ) + Len( hbmk[ _HBMK_aOBJUSER ] ) + Len( l_aOBJA ) ) == 0 + IF ! hbmk[ _HBMK_lStopAfterInit ] .AND. ! hbmk[ _HBMK_lCreateImpLib ] .AND. ( Len( hbmk[ _HBMK_aPLUGINPars ] ) + Len( hbmk[ _HBMK_aPRG ] ) + Len( hbmk[ _HBMK_aC ] ) + Len( hbmk[ _HBMK_aCPP ] ) + Len( hbmk[ _HBMK_aOBJUSER ] ) + Len( l_aOBJA ) ) == 0 hbmk_OutErr( hbmk, I_( "Error: No source files were specified." ) ) IF hbmk[ _HBMK_lBEEP ] DoBeep( .F. ) @@ -7180,6 +7180,7 @@ STATIC PROCEDURE PlugIn_Load( hbmk, cFileName ) /* Public functions accessible for plugins */ +FUNCTION hbmk2_CWD() ; RETURN hb_pwd() FUNCTION hbmk2_FindInPath( ... ) ; RETURN FindInPath( ... ) FUNCTION hbmk2_PathNormalize( ... ) ; RETURN PathNormalize( ... ) FUNCTION hbmk2_PathMakeAbsolute( ... ) ; RETURN PathMakeAbsolute( ... ) @@ -7230,6 +7231,13 @@ STATIC FUNCTION ctx_to_hbmk( ctx ) ENDIF RETURN NIL +FUNCTION hbmk2_PathFromWorkdirToCWD( ctx ) + LOCAL hbmk := ctx_to_hbmk( ctx ) + IF hbmk != NIL + RETURN DirAddPathSep( PathMakeRelative( PathNormalize( PathMakeAbsolute( hbmk[ _HBMK_cWorkDir ], hb_pwd() ) ), hb_pwd(), .T. ) ) + ENDIF + RETURN "" + FUNCTION hbmk2_Macro( ctx, cString ) LOCAL hbmk := ctx_to_hbmk( ctx ) IF hbmk != NIL @@ -7289,6 +7297,13 @@ FUNCTION hbmk2_AddInput_RC( ctx, cFileName ) ENDIF RETURN NIL +FUNCTION hbmk2_AddInput_OBJ( ctx, cFileName ) + LOCAL hbmk := ctx_to_hbmk( ctx ) + IF hbmk != NIL .AND. ISCHARACTER( cFileName ) + AAdd( hbmk[ _HBMK_aOBJUSER ], PathSepToSelf( cFileName ) ) + ENDIF + RETURN NIL + FUNCTION hbmk2_AddInput_INSTFILE( ctx, cFileName, cGroup ) LOCAL hbmk := ctx_to_hbmk( ctx ) IF hbmk != NIL .AND. ISCHARACTER( cFileName )