#!/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_dir4=`pwd`/scripts/mkqtdecl4 inst_dir5=`pwd`/scripts/mkqtdecl5 src_dir=`pwd`/src src_name4=gsiqt4 src_name5=gsiqt5 src_name=$src_name4 inst_dir=$inst_dir4 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.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.pri; 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