416 lines
12 KiB
Bash
416 lines
12 KiB
Bash
#!/bin/sh
|
|
#
|
|
# $Id$
|
|
#
|
|
|
|
# ---------------------------------------------------------------
|
|
# Copyright 2003 Przemyslaw Czerpak <druzus@polbox.com>
|
|
# simple script to build binaries .tgz from Harbour sources
|
|
#
|
|
# See doc/license.txt for licensing terms.
|
|
# ---------------------------------------------------------------
|
|
|
|
# please add your distro suffix if it not belong to the one recognized below
|
|
# and remember that order checking can be important
|
|
hb_platform=`rel=$(rpm -q --queryformat='.%{VERSION}' mandrake-release 2>/dev/null) && echo "mdk$rel"|tr -d "."`
|
|
[ "${hb_platform}" = "" ] && hb_platform=`rel=$(rpm -q --queryformat='.%{VERSION}' redhat-release 2>/dev/null) && echo "rh$rel"|tr -d "."`
|
|
|
|
[ "${hb_platform}" = "" ] || hb_platform="-${hb_platform}"
|
|
|
|
name="harbour"
|
|
hb_ver="0.43.0"
|
|
hb_lnkso="yes"
|
|
hb_pref="hb"
|
|
hb_libs="vm pp rtl rdd dbfdbt dbffpt dbfcdx dbfntx macro common lang codepage gtnul gtcrs gtsln gtcgi gtstd gtpca odbc ct debug profiler"
|
|
export C_USR="-DHB_FM_STATISTICS_OFF -O3"
|
|
if [ -z "$HB_ARCHITECTURE" ]; then export HB_ARCHITECTURE=linux; fi
|
|
if [ -z "$HB_COMPILER" ]; then export HB_COMPILER=gcc; fi
|
|
if [ -z "$HB_GPM_MOUSE" ]; then export HB_GPM_MOUSE=yes; fi
|
|
if [ -z "$HB_GT_LIB" ]; then export HB_GT_LIB=gtcrs; fi
|
|
if [ -z "$HB_MULTI_GT" ]; then export HB_MULTI_GT=no; fi
|
|
if [ -z "$HB_MT" ]; then export HB_MT=no; fi
|
|
|
|
export HB_BIN_INSTALL="/usr/bin"
|
|
export HB_INC_INSTALL="/usr/include/${name}"
|
|
export HB_LIB_INSTALL="/usr/lib/${name}"
|
|
|
|
# buid
|
|
umask 022
|
|
make clean
|
|
make
|
|
pushd contrib/libct
|
|
make clean
|
|
make
|
|
popd
|
|
|
|
# install
|
|
if [ -z "$TMPDIR" ]; then TMPDIR="/tmp"; fi
|
|
HB_INST_PREF="$TMPDIR/$name.bin.$USER.$$"
|
|
rm -fR "${HB_INST_PREF}"
|
|
|
|
_DEFAULT_BIN_DIR=$HB_BIN_INSTALL
|
|
_DEFAULT_INC_DIR=$HB_INC_INSTALL
|
|
_DEFAULT_LIB_DIR=$HB_LIB_INSTALL
|
|
export HB_BIN_INSTALL="$HB_INST_PREF/$HB_BIN_INSTALL"
|
|
export HB_INC_INSTALL="$HB_INST_PREF/$HB_INC_INSTALL"
|
|
export HB_LIB_INSTALL="$HB_INST_PREF/$HB_LIB_INSTALL"
|
|
|
|
mkdir -p $HB_BIN_INSTALL
|
|
mkdir -p $HB_INC_INSTALL
|
|
mkdir -p $HB_LIB_INSTALL
|
|
make -i install
|
|
pushd contrib/libct
|
|
make -i install
|
|
popd
|
|
|
|
# build fm lib with memory statistic
|
|
pushd source/vm
|
|
TMP_C_USR=$C_USR
|
|
C_USR=${C_USR//-DHB_FM_STATISTICS_OFF/-DHB_PARANOID_MEM_CHECK}
|
|
rm -f fm.o
|
|
make fm.o
|
|
ar -r $HB_LIB_INSTALL/libfm.a fm.o
|
|
rm -f fm.o
|
|
if [ $HB_MT = "MT" ]; then
|
|
make fm.o 'HB_LIBCOMP_MT=YES'
|
|
ar -r $HB_LIB_INSTALL/libfmmt.a fm.o
|
|
rm -f fm.o
|
|
fi
|
|
C_USR=$TMP_C_USR
|
|
popd
|
|
|
|
# Keep the size of the binaries to a minimim.
|
|
strip $HB_BIN_INSTALL/*
|
|
# Keep the size of the libraries to a minimim.
|
|
strip --strip-debug $HB_LIB_INSTALL/*
|
|
|
|
install -m755 bin/hb-mkslib.sh $HB_BIN_INSTALL/hb-mkslib
|
|
|
|
pushd $HB_LIB_INSTALL
|
|
LIBS=""
|
|
LIBSMT=""
|
|
for l in ${hb_libs}
|
|
do
|
|
case $l in
|
|
debug|profiler) ;;
|
|
*)
|
|
ls="lib${l}.a"
|
|
if [ -f lib${l}mt.a ]
|
|
then
|
|
lm="lib${l}mt.a"
|
|
else
|
|
lm="${ls}"
|
|
fi
|
|
if [ "${HB_MULTI_GT}" = "yes" ] || \
|
|
[ "${l#gt}" = "${l}" ] || \
|
|
[ "${l}" == "${HB_GT_LIB}" ]
|
|
then
|
|
if [ -f $ls ]
|
|
then
|
|
LIBS="$LIBS $ls"
|
|
fi
|
|
if [ -f $lm ]
|
|
then
|
|
LIBSMT="$LIBSMT $lm"
|
|
fi
|
|
fi
|
|
;;
|
|
esac
|
|
done
|
|
$HB_BIN_INSTALL/hb-mkslib lib${name}-${hb_ver}.so $LIBS
|
|
[ $HB_MT != "MT" ] || $HB_BIN_INSTALL/hb-mkslib lib${name}mt-${hb_ver}.so $LIBSMT
|
|
for l in lib${name}-${hb_ver}.so lib${name}mt-${hb_ver}.so
|
|
do
|
|
if [ -f $l ]
|
|
then
|
|
ll=${l%-${hb_ver}.so}.so
|
|
ln -s $l $ll && ln -s ${name}/$l $HB_INST_PREF/usr/lib/$ll
|
|
fi
|
|
done
|
|
#export LD_LIBRARY_PATH="$HB_LIB_INSTALL:$LD_LIBRARY_PATH"
|
|
popd
|
|
|
|
# Add a harbour compiler wrapper.
|
|
cat > $HB_BIN_INSTALL/${hb_pref}-build <<EOF
|
|
#!/bin/bash
|
|
|
|
if [ \$# == 0 ]; then
|
|
echo "syntax: \$0 [<options,...>] <file>[.prg|.o]
|
|
|
|
\"${hb_pref}cc\", \"${hb_pref}cmp\", \"${hb_pref}lnk\" and \"${hb_pref}mk\" parameters:
|
|
-o<outputfilename> # output file name
|
|
\"${hb_pref}lnk\" and \"${hb_pref}mk\" parameters:
|
|
-static # link with static ${name} libs
|
|
-fullstatic # link with all static libs
|
|
-shared # link with shared libs (default)
|
|
-mt # link with multi-thread libs
|
|
-gt<hbgt> # link with <hbgt> GT driver, can be repeated to
|
|
# link with more GTs. The first one will be
|
|
# the default at runtime
|
|
-fmstat # link with the memory statistics lib
|
|
-nofmstat # do not link with the memory statistics lib (default)
|
|
-main=<main_func> # set the name of main program function/procedure.
|
|
# if not set then 'MAIN' is used or if it doesn't
|
|
# exist the name of first public function/procedure
|
|
# in first linked object module (link)
|
|
"
|
|
exit 1
|
|
elif [ "\$*" == "mk-links" ]; then
|
|
DIR="\${0%/*}"
|
|
NAME="\${0##*/}"
|
|
if [ "\${DIR}" != "\${NAME}" ]; then
|
|
for n in ${hb_pref}cc ${hb_pref}cmp ${hb_pref}mk ${hb_pref}lnk gharbour harbour-link; do
|
|
ln -sf "\${NAME}" "\${DIR}/\${n}"
|
|
done
|
|
fi
|
|
exit
|
|
fi
|
|
|
|
## default parameters
|
|
HB_STATIC="no"
|
|
HB_MT=""
|
|
HB_GT="${HB_GT_LIB#gt}"
|
|
HB_MG="${HB_MULTI_GT}"
|
|
|
|
HB_GT_REQ=""
|
|
HB_FM_REQ=""
|
|
HB_MAIN_FUNC=""
|
|
_TMP_FILE_="/tmp/hb-build-\$USER-\$\$.c"
|
|
|
|
## parse params
|
|
P=( "\$@" ); n=0; DIROUT="."; FILEOUT=""
|
|
while [ \$n -lt \${#P[@]} ]; do
|
|
v=\${P[\$n]}; p=""
|
|
case "\$v" in
|
|
-o*)
|
|
d="\${v#-o}"; p="\${v}"
|
|
if [ -d "\${d}" ]; then
|
|
DIROUT="\${d%/}"
|
|
elif [ -d "\${d%/*}" ]; then
|
|
DIROUT="\${d%/*}"; FILEOUT="\${d##*/}"; p="-o\${d%.*}"
|
|
elif [ -n "\${d}" ]; then
|
|
FILEOUT="\${d}"; p="-o\${d%.*}"
|
|
fi ;;
|
|
-static) HB_STATIC="yes" ;;
|
|
-fullstatic) HB_STATIC="full" ;;
|
|
-shared) HB_STATIC="no" ;;
|
|
-mt) HB_MT="MT" ;;
|
|
-gt*) HB_GT_REQ="\${HB_GT_REQ} \${v#-gt}" ;;
|
|
-fmstat) HB_FM_REQ="STAT" ;;
|
|
-nofmstat) HB_FM_REQ="NOSTAT" ;;
|
|
-main=*) HB_MAIN_FUNC="\${v#*=}" ;;
|
|
-*) p="\${v}" ;;
|
|
*) [ -z \${FILEOUT} ] && FILEOUT="\${v##*/}"; p="\${v}" ;;
|
|
esac
|
|
[ -n "\$p" ] && PP[\$n]="\$p"
|
|
n=\$[\$n + 1]
|
|
done
|
|
P=( "\${PP[@]}" )
|
|
|
|
case "\${HB_MT}" in
|
|
[Mm][Tt]|[Yy][Ee][Ss]|1) HB_MT="MT";;
|
|
*) HB_MT="";;
|
|
esac
|
|
|
|
SYSTEM_LIBS="-lm -lncurses -lslang -lgpm"
|
|
# use pthread system library for MT programs
|
|
if [ "\${HB_MT}" = "MT" ]; then
|
|
SYSTEM_LIBS="-lpthread \${SYSTEM_LIBS}"
|
|
fi
|
|
|
|
HB_GT_STAT=""
|
|
[ -z "\${HB_GT_REQ}" ] && HB_GT_REQ="\${HB_GT}"
|
|
if [ "\${HB_MG}" != "yes" ]; then
|
|
[ "\${HB_STATIC}" = "yes" ] && HB_GT_STAT=\`echo \${HB_GT_REQ}|tr A-Z a-z\`
|
|
HB_GT_REQ=""
|
|
else
|
|
HB_GT_REQ=\`echo \${HB_GT_REQ}|tr a-z A-Z\`
|
|
fi
|
|
HB_MAIN_FUNC=\`echo \${HB_MAIN_FUNC}|tr a-z A-Z\`
|
|
|
|
# set environment variables
|
|
export HB_ARCHITECTURE="${HB_ARCHITECTURE}"
|
|
export HB_COMPILER="${HB_COMPILER}"
|
|
[ -z "\${HB_BIN_INSTALL}" ] && export HB_BIN_INSTALL="${_DEFAULT_BIN_DIR}"
|
|
[ -z "\${HB_INC_INSTALL}" ] && export HB_INC_INSTALL="${_DEFAULT_INC_DIR}"
|
|
[ -z "\${HB_LIB_INSTALL}" ] && export HB_LIB_INSTALL="${_DEFAULT_LIB_DIR}"
|
|
|
|
# be sure that ${name} binaries are in your path
|
|
export PATH="\${HB_BIN_INSTALL}:\${PATH}"
|
|
|
|
HB_PATHS="-I\${HB_INC_INSTALL}"
|
|
GCC_PATHS="\${HB_PATHS} -L\${HB_LIB_INSTALL}"
|
|
LINK_OPT=""
|
|
if [ "\${HB_STATIC}" = "full" ]; then
|
|
LINK_OPT="\${LINK_OPT} -static"
|
|
HB_STATIC="yes"
|
|
fi
|
|
|
|
HARBOUR_LIBS=""
|
|
if [ "\${HB_STATIC}" = "yes" ]; then
|
|
libs="${hb_libs}"
|
|
else
|
|
l="${name}"
|
|
[ "\${HB_MT}" = "MT" ] && [ -f "\${HB_LIB_INSTALL}/lib\${l}mt.so" ] && l="\${l}mt"
|
|
[ -f "\${HB_LIB_INSTALL}/lib\${l}.so" ] && HARBOUR_LIBS="\${HARBOUR_LIBS} -l\${l}"
|
|
libs="debug profiler"
|
|
fi
|
|
for l in \${libs}
|
|
do
|
|
if [ "\${HB_MG}" = "yes" ] || [ "\${l#gt}" = "\${l}" ] || [ "\${l}" == "gt\${HB_GT_STAT}" ]; then
|
|
[ "\${HB_MT}" = "MT" ] && [ -f "\${HB_LIB_INSTALL}/lib\${l}mt.a" ] && l="\${l}mt"
|
|
[ -f "\${HB_LIB_INSTALL}/lib\${l}.a" ] && HARBOUR_LIBS="\${HARBOUR_LIBS} -l\${l}"
|
|
fi
|
|
done
|
|
HARBOUR_LIBS="-Wl,--start-group \${HARBOUR_LIBS} -Wl,--end-group"
|
|
l="fm"
|
|
[ "\${HB_MT}" = "MT" ] && [ -f "\${HB_LIB_INSTALL}/lib\${l}mt.a" ] && l="\${l}mt"
|
|
if [ -f "\${HB_LIB_INSTALL}/lib\${l}.a" ]; then
|
|
if [ "\${HB_STATIC}" = "yes" ] && [ "\${HB_FM_REQ}" = "STAT" ]; then
|
|
HARBOUR_LIBS="-l\${l} \${HARBOUR_LIBS}"
|
|
else
|
|
HARBOUR_LIBS="\${HARBOUR_LIBS} -l\${l}"
|
|
fi
|
|
fi
|
|
|
|
FOUTC="\${DIROUT}/\${FILEOUT%.*}.c"
|
|
FOUTO="\${DIROUT}/\${FILEOUT%.*}.o"
|
|
FOUTE="\${DIROUT}/\${FILEOUT%.[Pp][Rr][Gg]}"
|
|
FOUTE="\${FOUTE%.[oc]}"
|
|
|
|
hb_cc()
|
|
{
|
|
harbour "\$@" \${HB_PATHS} && [ -f "\${FOUTC}" ]
|
|
}
|
|
|
|
hb_link()
|
|
{
|
|
if [ -n "\${HB_MAIN_FUNC}" ]; then
|
|
HB_MAIN_FUNC="@\${HB_MAIN_FUNC}"
|
|
elif [ -f "\${FOUTO}" ]; then
|
|
HB_MAIN_FUNC=\`hb_lnk_main "\${FOUTO}"\`
|
|
fi
|
|
if [ -n "\${HB_GT_REQ}" ] || [ -n "\${HB_FM_REQ}" ] || [ -n "\${HB_MAIN_FUNC}" ]; then
|
|
hb_lnk_request > \${_TMP_FILE_} && \\
|
|
gcc "\$@" "\${_TMP_FILE_}" \${LINK_OPT} \${GCC_PATHS} \${HARBOUR_LIBS} \${SYSTEM_LIBS} -o "\${FOUTE}"
|
|
else
|
|
gcc "\$@" \${LINK_OPT} \${GCC_PATHS} \${HARBOUR_LIBS} \${SYSTEM_LIBS} -o "\${FOUTE}"
|
|
fi
|
|
}
|
|
|
|
hb_cmp()
|
|
{
|
|
hb_cc "\$@" && \\
|
|
gcc -g -c "\${FOUTC}" -o "\${FOUTO}" \${GCC_PATHS} && \\
|
|
rm -f "\${FOUTC}"
|
|
}
|
|
|
|
hb_lnk_request()
|
|
{
|
|
echo "#include \\"hbapi.h\\""
|
|
if [ "\${HB_STATIC}" = "yes" ] || [ -n "\${HB_FM_REQ}" ]; then
|
|
for gt in \${HB_GT_REQ}; do
|
|
echo "extern HB_FUNC( HB_GT_\${gt} );"
|
|
done
|
|
if [ -n "\${HB_FM_REQ}" ]; then
|
|
echo "extern HB_FUNC( HB_FM_\${HB_FM_REQ} );"
|
|
fi
|
|
echo "void hb_lnk_ForceLink_build( void )"
|
|
echo "{"
|
|
for gt in \${HB_GT_REQ}; do
|
|
echo " HB_FUNCNAME( HB_GT_\${gt} )();"
|
|
done
|
|
if [ -n "\${HB_FM_REQ}" ]; then
|
|
echo " HB_FUNCNAME( HB_FM_\${HB_FM_REQ} )();"
|
|
fi
|
|
echo "}"
|
|
fi
|
|
gt="\${HB_GT_REQ%% *}"
|
|
if [ -n "\$gt" ] || [ -n "\${HB_MAIN_FUNC}" ]; then
|
|
echo "#include \\"hbinit.h\\""
|
|
echo "extern char * s_defaultGT;"
|
|
echo "extern char * s_pszLinkedMain;"
|
|
echo "HB_CALL_ON_STARTUP_BEGIN( hb_lnk_SetDefault_build )"
|
|
if [ -n "\$gt" ]; then
|
|
echo " s_defaultGT = \\"\$gt\\";"
|
|
fi
|
|
if [ -n "\${HB_MAIN_FUNC}" ]; then
|
|
echo " s_pszLinkedMain = \\"\${HB_MAIN_FUNC}\\";"
|
|
fi
|
|
echo "HB_CALL_ON_STARTUP_END( hb_lnk_SetDefault_build )"
|
|
fi
|
|
}
|
|
|
|
hb_lnk_main()
|
|
{
|
|
(nm \$1 -g -n --defined-only|sed -e '/HB_FUN_/ ! d' -e 's/^[0-9a-fA-F]* T HB_FUN_//'|head -1|grep -v '^MAIN\$')2>/dev/null
|
|
# (nm \$1 -n --defined-only|sed -e '/HB_FUN_/ ! d' -e 's/^[0-9a-fA-F]* [Tt] HB_FUN_//'|head -1|grep -v '^MAIN\$')2>/dev/null
|
|
}
|
|
|
|
hb_cleanup()
|
|
{
|
|
rm -f "\${_TMP_FILE_}"
|
|
}
|
|
|
|
trap hb_cleanup EXIT &>/dev/null
|
|
|
|
## get basename
|
|
HB="\${0##*/}"
|
|
|
|
case "\${HB}" in
|
|
*cc)
|
|
hb_cc "\${P[@]}"
|
|
;;
|
|
*cmp|gharbour)
|
|
hb_cmp "\${P[@]}"
|
|
;;
|
|
*lnk|harbour-link)
|
|
hb_link "\${P[@]}"
|
|
;;
|
|
*mk)
|
|
hb_cmp "\${P[@]}" && \\
|
|
hb_link "\${FOUTO}" && \\
|
|
strip "\${FOUTE}" && \\
|
|
rm -f "\${FOUTO}"
|
|
;;
|
|
esac
|
|
EOF
|
|
chmod 755 $HB_BIN_INSTALL/${hb_pref}-build
|
|
$HB_BIN_INSTALL/${hb_pref}-build mk-links
|
|
|
|
mkdir -p $HB_INST_PREF/etc/harbour
|
|
install -m644 source/rtl/gtcrs/hb-charmap.def $HB_INST_PREF/etc/harbour/hb-charmap.def
|
|
cat > $HB_INST_PREF/etc/harbour.cfg <<EOF
|
|
CC=gcc
|
|
CFLAGS=-c -I$_DEFAULT_INC_DIR -O2
|
|
VERBOSE=YES
|
|
DELTMP=YES
|
|
EOF
|
|
|
|
# Create PP
|
|
pushd contrib/dot
|
|
$HB_BIN_INSTALL/${hb_pref}mk pp -n -w -D_DEFAULT_INC_DIR=\"${_DEFAULT_INC_DIR}\"
|
|
install -m755 -s pp $HB_BIN_INSTALL/pp
|
|
ln -s pp $HB_BIN_INSTALL/pprun
|
|
install -m644 rp_dot.ch $HB_INC_INSTALL/
|
|
rm -f pp
|
|
popd
|
|
|
|
# check if we should rebuild tools with shared libs
|
|
if [ "${hb_lnkso}" = yes ]
|
|
then
|
|
export L_USR="-L${HB_LIB_INSTALL} -l${name} -lncurses -lslang -lgpm"
|
|
|
|
for utl in hbmake hbrun hbpp hbdoc hbtest
|
|
do
|
|
pushd utils/${utl}
|
|
rm -fR "./${HB_ARCHITECTURE}"
|
|
make install
|
|
strip ${HB_BIN_INSTALL}/${utl}
|
|
popd
|
|
done
|
|
fi
|
|
|
|
tar -czvf ${name}-${hb_ver}${hb_platform}.bin.tar.gz --owner=root --group=root -C "${HB_INST_PREF}" .
|
|
rm -fR "${HB_INST_PREF}"
|