mirror of https://github.com/KLayout/klayout.git
223 lines
5.4 KiB
Bash
223 lines
5.4 KiB
Bash
|
|
#!/bin/bash -e
|
||
|
|
|
||
|
|
#
|
||
|
|
# A script to produce the Qt declaration files
|
||
|
|
#
|
||
|
|
# This script utilizes the extraction framework from mkqtdecl_common. The extraction
|
||
|
|
# framework is based on a C++ parser and a configuration file that specifies details
|
||
|
|
# about the translation.
|
||
|
|
#
|
||
|
|
# By default, the script will take the Qt headers from /opt/qt/4.6.3 and /opt/qt/5.5.1
|
||
|
|
# for Qt4 and Qt5 respectively.
|
||
|
|
#
|
||
|
|
# Call it from project level as
|
||
|
|
#
|
||
|
|
# ./scripts/mkqtdecl.sh -update # Qt4
|
||
|
|
# ./scripts/mkqtdecl.sh -update -qt5 # Qt5
|
||
|
|
#
|
||
|
|
# For more options see
|
||
|
|
#
|
||
|
|
# ./scripts/mkqtdecl.sh -h
|
||
|
|
#
|
||
|
|
#
|
||
|
|
# Copyright (C) 2006-2017 Matthias Koefferlein
|
||
|
|
#
|
||
|
|
# 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||
|
|
|
||
|
|
dry=0
|
||
|
|
sync=0
|
||
|
|
update=0
|
||
|
|
diff=0
|
||
|
|
reuse=0
|
||
|
|
qt="/opt/qt/4.6.3/include"
|
||
|
|
qt5="/opt/qt/5.5.1/include"
|
||
|
|
inst_dir_common=`pwd`/scripts/mkqtdecl_common
|
||
|
|
inst_dir=`pwd`/scripts/mkqtdecl
|
||
|
|
inst_dir5=`pwd`/scripts/mkqtdecl5
|
||
|
|
src_dir=`pwd`/src
|
||
|
|
src_name=gsiqt
|
||
|
|
src_name5=gsiqt5
|
||
|
|
|
||
|
|
while [ "$1" != "" ]; do
|
||
|
|
|
||
|
|
a="$1"
|
||
|
|
shift
|
||
|
|
|
||
|
|
case "$a" in
|
||
|
|
-h)
|
||
|
|
echo "Produce Qt declaration"
|
||
|
|
echo "Usage:"
|
||
|
|
echo " mkqtdecl.sh -update Produce and synchronize"
|
||
|
|
echo " mkqtdecl.sh -dry Dry run - produce, but don't synchronize"
|
||
|
|
echo " mkqtdecl.sh -sync Sync only - don't produce, but synchronize"
|
||
|
|
echo " mkqtdecl.sh -diff Show differences - don't produce and don't synchronize"
|
||
|
|
echo " mkqtdecl.sh -qt path_to_include Use the specified include path"
|
||
|
|
echo " mkqtdecl.sh -qt5 Use setup for Qt 5.x (use before -qt)"
|
||
|
|
echo " mkqtdecl.sh -reuse Don't parse C++ container again"
|
||
|
|
exit 0
|
||
|
|
;;
|
||
|
|
-dry)
|
||
|
|
dry=1
|
||
|
|
;;
|
||
|
|
-sync)
|
||
|
|
sync=1
|
||
|
|
;;
|
||
|
|
-update)
|
||
|
|
update=1
|
||
|
|
;;
|
||
|
|
-diff)
|
||
|
|
diff=1
|
||
|
|
;;
|
||
|
|
-reuse)
|
||
|
|
reuse=1
|
||
|
|
;;
|
||
|
|
-qt)
|
||
|
|
qt="$1"
|
||
|
|
shift
|
||
|
|
;;
|
||
|
|
-qt5)
|
||
|
|
qt="$qt5"
|
||
|
|
inst_dir="$inst_dir5"
|
||
|
|
src_name="$src_name5"
|
||
|
|
;;
|
||
|
|
*)
|
||
|
|
echo "*** ERROR: unknown command option $a"
|
||
|
|
exit 1
|
||
|
|
;;
|
||
|
|
esac
|
||
|
|
|
||
|
|
done
|
||
|
|
|
||
|
|
if [ `expr $update + $sync + $dry + $diff` != 1 ]; then
|
||
|
|
echo "*** ERROR: either -update, -diff, -dry or -sync must be given"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Production flags
|
||
|
|
# -diff -> update=0, dry=1
|
||
|
|
# -dry -> update=1, dry=1
|
||
|
|
# -sync -> update=0, dry=0
|
||
|
|
# -update -> update=1, dry=0
|
||
|
|
if [ $diff != 0 ]; then
|
||
|
|
dry=1
|
||
|
|
elif [ $dry != 0 ]; then
|
||
|
|
update=1
|
||
|
|
fi
|
||
|
|
|
||
|
|
if [ ! -e $src_dir ]; then
|
||
|
|
echo "*** ERROR: Source directory ($src_dir) not found - run script in repository root"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
if [ ! -e $inst_dir ]; then
|
||
|
|
echo "*** ERROR: Installation path ($inst_dir) not found - run script in repository root"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
if [ ! -e $inst_dir_common ]; then
|
||
|
|
echo "*** ERROR: Installation path ($inst_dir_common) not found - run script in repository root"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
if ! ruby -v >/dev/null 2>&1; then
|
||
|
|
echo "*** ERROR: ruby not installed"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
if ! ruby -e "require 'oj'" 2>&1; then
|
||
|
|
echo "*** ERROR: ruby gem 'oj' not installed"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
if ! ruby -e "require 'treetop'" 2>&1; then
|
||
|
|
echo "*** ERROR: ruby gem 'treetop' not installed"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
work_dir="./mkqtdecl.tmp"
|
||
|
|
|
||
|
|
if [ $update != 0 ]; then
|
||
|
|
|
||
|
|
if [ -e $work_dir ] && [ $reuse == 0 ]; then
|
||
|
|
rm -rf $work_dir
|
||
|
|
fi
|
||
|
|
|
||
|
|
mkdir -p $work_dir
|
||
|
|
cd $work_dir
|
||
|
|
|
||
|
|
cp $inst_dir/{allofqt.cpp,mkqtdecl.conf,mkqtdecl.properties,mkqtdecl.events} .
|
||
|
|
cp $inst_dir_common/{cpp_parser_classes.rb,cpp_classes.rb,c++.treetop,parse.rb,reader_ext.rb,produce.rb} .
|
||
|
|
|
||
|
|
if [ $reuse == 0 ]; then
|
||
|
|
|
||
|
|
echo "Running gcc preprocessor .."
|
||
|
|
# By using -D_GCC_LIMITS_H_ we make the gcc not include constants such as ULONG_MAX which will
|
||
|
|
# remain as such. This way the generated code is more generic.
|
||
|
|
gcc -I$qt -fPIC -D_GCC_LIMITS_H_ -E -o allofqt.x allofqt.cpp
|
||
|
|
|
||
|
|
echo "Stripping hash lines .."
|
||
|
|
egrep -v '^#' <allofqt.x >allofqt.e
|
||
|
|
rm allofqt.x
|
||
|
|
|
||
|
|
echo "Parsing and producing db .."
|
||
|
|
./parse.rb -i allofqt.e -o allofqt.db
|
||
|
|
|
||
|
|
fi
|
||
|
|
|
||
|
|
mkdir -p generated
|
||
|
|
|
||
|
|
echo "Producing code .."
|
||
|
|
./produce.rb -i allofqt.db
|
||
|
|
|
||
|
|
else
|
||
|
|
cd $work_dir
|
||
|
|
fi
|
||
|
|
|
||
|
|
if [ ! -e generated ]; then
|
||
|
|
echo "*** ERROR: production output ("`pwd`"/generated) does not exist - production failed?"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
cd generated
|
||
|
|
|
||
|
|
if [ $dry != 0 ]; then
|
||
|
|
echo "Synchronizing dry run .."
|
||
|
|
else
|
||
|
|
echo "Synchronizing .."
|
||
|
|
fi
|
||
|
|
|
||
|
|
count=0
|
||
|
|
for f in {*.cc,*.h} qtdecl.pro; do
|
||
|
|
needs_update=0
|
||
|
|
if ! [ -e $src_dir/$src_name/$f ]; then
|
||
|
|
echo "# INFO: creating new file $src_dir/$src_name/$f"
|
||
|
|
needs_update=1
|
||
|
|
elif ! cmp -s $f $src_dir/$src_name/$f; then
|
||
|
|
echo "# INFO: out of date: syncing file $src_dir/$src_name/$f"
|
||
|
|
needs_update=1
|
||
|
|
fi
|
||
|
|
if [ $needs_update != 0 ]; then
|
||
|
|
count=`expr $count + 1`
|
||
|
|
if [ $dry != 0 ]; then
|
||
|
|
echo cp $f $src_dir/$src_name/$f
|
||
|
|
else
|
||
|
|
echo === cp $f $src_dir/$src_name/$f
|
||
|
|
cp $f $src_dir/$src_name/$f
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
|
||
|
|
if [ $dry != 0 ]; then
|
||
|
|
echo "# INFO: $count files to synchronize"
|
||
|
|
else
|
||
|
|
echo "# INFO: $count files synchronized"
|
||
|
|
fi
|
||
|
|
|