XQuilla/wintools/s_win32_common
2020-02-17 22:05:20 +01:00

195 lines
6 KiB
Text

#
# $Id: s_win32_common,v 1.4 2006/09/26 14:41:01 gmfeinberg Exp $
#
# Common functions used by both .dsp and .vcproj file generation
#
#
# Generate simple file list, matching on module name and optional filter
#
add_files()
{
sources="$1"
match="$2"
fmatch="$3"
srctemplate="$4"
filelist="$5"
nomatch="$6"
for srcpath in `egrep "$match" $sources | egrep "$fmatch" | \
egrep -v "$nomatch" | sed -e 's/[ ].*//'`
do
# take the path name and break it up, converting / to \\.
# so many backslashes needed because of shell quoting and
# sed quoting -- we'll end up with two backslashes for every
# forward slash, but we need that when feeding that to the
# later sed command.
set - `echo $srcpath | sed -e 's;\(.*\)/;../../\\1 ;' \
-e 's;/;\\\\\\\\;g'`
srcdir="$1"
srcfile="$2"
sed -e "s/@srcdir@/$srcdir/g" \
-e "s/@srcfile@/$srcfile/g" \
< $srctemplate >> $filelist
done
}
#
# Generate the file list for the project into the output file specified.
# Include grouped/filtered files, if specified
#
create_file_list()
{
projname="$1" # name of the project/output file
match="$2" # the string used to egrep the $sources file
sources="$3" # a modified version of $SRCFILES to facilitate matches
srctemplate="$4" # template file for the src file fragments
filelist="$5" # output file for the list
rm -f $filelist
filtermatch="$match.filters="
filters=`egrep $filtermatch $sources | sed -e "s/^$filtermatch//"`
if [ "$filters" != "" ] ; then
for filter in $filters
do
# start a filter
sed -e "s/@filtname@/$filter/g" \
< $FILT_START >> $filelist
# special-case "impl" subdirectories and add another level of
# grouping. This mechanism is hard-coded to "impl" subdirectories,
# and will not work for other subdirectories.
implmatch="/$filter/impl"
doimpl=`egrep $implmatch $sources`
if [ "$doimpl" != "" ] ; then
sed -e "s/@filtname@/impl/g" \
< $FILT_START >> $filelist
add_files $sources $match $implmatch $srctemplate $filelist *
cat $FILT_END >> $filelist
else
implmatch="*"
fi
filtmatch="/$filter/"
# add files for that filter, removing any "impl" matches
add_files $sources $match $filtmatch $srctemplate $filelist $implmatch
# end the filter
cat $FILT_END >> $filelist
done
else
# no filter, just add files (filter match is *)
add_files $sources $match "*" $srctemplate $filelist *
fi
}
#
# function to create an individual project file
#
create_project()
{
projname="$1" # name of the project (will be $projname.{dsp,vcproj})
match="$2" # the string used to egrep the $sources file
sources="$3" # a modified version of $SRCFILES to facilitate matches
projtemplate="$4" # template file for the project
srctemplate="$5" # template file for the src file fragments
output=$6 # project output file name
# destination targets for build components
# OUTDIR must be defined in the driving script
libDest="$OUTDIR/\$(ConfigurationName)"
binRelDest="$OUTDIR/\$(ConfigurationName)"
binDebugDest="$OUTDIR/\$(ConfigurationName)"
jarDest="$OUTDIR"
outdir="$OUTDIR"
# incl is a placeholder for additional includes.
# right now, it's redundant
incl="../../include"
filelist=$output.insert
create_file_list $projname $match $sources \
$srctemplate $filelist
sed -e "/@SOURCE_FILES@/r$filelist" \
-e "/@SOURCE_FILES@/d" \
-e "s/@project_name@/$projname/g" \
-e "s!@lib_dest@!$libDest!g" \
-e "s!@bin_rel_dest@!$binRelDest!g" \
-e "s!@bin_debug_dest@!$binDebugDest!g" \
-e "s!@jar_dest@!$jarDest!g" \
-e "s!@outdir@!$outdir!g" \
-e "s!@include@!$incl!g" \
-e "s/@XQILLA_VERSION_MAJOR@/$XQILLA_VERSION_MAJOR/g" \
-e "s/@XQILLA_VERSION_MINOR@/$XQILLA_VERSION_MINOR/g" \
-f lib_paths.sed \
< $projtemplate > $output.new
# Set the file mode to 644 because the IDE needs a writeable file
cmp $output.new $output > /dev/null 2>&1 ||
(echo "Building $output" && rm -f $output &&
cp $output.new $output && chmod 664 $output)
rm -f $filelist $output.new
}
generate_projects()
{
TMPA=/tmp/swin32vcproj$$a
trap "rm -f $TMPA; exit 1" 1 2 3 15
# create a copy of the srcfiles with comments and empty lines removed.
# add a space at the end of each list of modules so that each module
# can be unambiguously matched e.g. ' dynamic '
sed -e "s/#.*$//" \
-e "/^[ ]*$/d" \
-e "s/[ ][ ]*/ /" \
-e "s/[ ]*$//" \
-e "/[ ]/!d" \
-e "s/$/ /" < $SRCFILES > $TMPA
#
# get a list of all modules mentioned. Eliminate ".filters" lines
#
MODULES="`egrep -v '.filters' $TMPA | sed -e 's/^[^ ]* //' \
| tr ' ' '\012' | sort | uniq`"
for module in $MODULES
do
case "$module" in
lib )
create_project xqilla " $module " $TMPA \
$LIB_SRC $FILT_FILE_SRC $BUILDDIR/xqilla.$EXT
;;
dll=* )
dllname=`echo $module | sed -e 's/^dll=//'`
if [ -f $TEMPLATEDIR/$dllname.$EXT.src ] ; then
srcname=$TEMPLATEDIR/$dllname.$EXT.src
else
srcname=$DLL_SRC
fi
create_project $dllname " $module " $TMPA \
$srcname $FILE_SRC $BUILDDIR/$dllname.$EXT
;;
app=* )
appname=`echo $module | sed -e 's/^app=//'`
if [ -f $TEMPLATEDIR/$appname.$EXT.src ] ; then
srcname=$TEMPLATEDIR/$appname.$EXT.src
else
srcname=$APP_SRC
fi
create_project $appname " $module " $TMPA \
$srcname $FILE_SRC $BUILDDIR/$appname.$EXT
;;
test=* )
appname=`echo $module | sed -e 's/^test=//'`
create_project $appname " $module " $TMPA \
$TEST_SRC $FILE_SRC $BUILDDIR/$appname.$EXT
;;
* )
echo "s_win32_common: module name $module in $SRCFILES is unknown type"
;;
esac
done
rm -f $TMPA
}