util/scripts/make_qfeatures_dot_h
changeset 0 1918ee327afb
child 3 41300fa6a67c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/util/scripts/make_qfeatures_dot_h	Mon Jan 11 14:00:40 2010 +0000
@@ -0,0 +1,197 @@
+#!/usr/bin/perl
+#############################################################################
+##
+## Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+## All rights reserved.
+## Contact: Nokia Corporation (qt-info@nokia.com)
+##
+## This file is part of the test suite of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:LGPL$
+## No Commercial Usage
+## This file contains pre-release code and may not be distributed.
+## You may use this file in accordance with the terms and conditions
+## contained in the Technology Preview License Agreement accompanying
+## this package.
+##
+## GNU Lesser General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU Lesser
+## General Public License version 2.1 as published by the Free Software
+## Foundation and appearing in the file LICENSE.LGPL included in the
+## packaging of this file.  Please review the following information to
+## ensure the GNU Lesser General Public License version 2.1 requirements
+## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+##
+## In addition, as a special exception, Nokia gives you certain additional
+## rights.  These rights are described in the Nokia Qt LGPL Exception
+## version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+##
+## If you have questions regarding the use of this file, please contact
+## Nokia at qt-info@nokia.com.
+##
+##
+##
+##
+##
+##
+##
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+#
+# Usage:  make_qfeatures_dot_h
+#
+# Generates src/corelib/global/qfeatures.h from src/corelib/global/qfeatures.txt.
+#
+# The qfeatures.txt file can contain redundancies, and this program
+# will show them.
+#
+
+if ($ENV{QTSRCDIR} ne '') {
+    $qtbase=$ENV{QTSRCDIR};
+} else {
+    $qtbase=$ENV{QTDIR};
+}
+
+open FL, "$qtbase/src/corelib/global/qfeatures.txt"
+    or die "Cannot open $qtbase/src/corelib/global/qfeatures.txt";
+
+while (<FL>) {
+    if ( /^Feature: (\S*)/ ) {
+	print STDERR "Duplicate: $1\n" if $macro{$1};
+	$macro{$macro=$1}=1;
+    } elsif ( /^Requires: (.*?)\s*$/ ) {
+	$deps{$macro}=$1;
+	map { $dep{"$macro $_"}=1 } split /\s+/, $1;
+    } elsif ( /^Name: (.*?)\s*$/ ) {
+	$label{$macro}=$1;
+    }
+}
+
+close FL;
+
+sub depends {
+    my($x,$y) = @_;
+    return 1 if $dep{"$x $y"};
+    return 0 if $dep{"$y $x"};
+    return 0 if $x eq $y;
+    my $d;
+    for $d (split /\s+/, $deps{$x}) {
+	return 1 if depends($d,$y);
+    }
+    return 0;
+}
+sub dependants_rec {
+    my($x) = @_;
+    my $n = 0;
+    my $d = 0;
+    $dependants_rec_count++;
+    if ( $dependants_rec_count > $dependants_rec_limit ) {
+	if ( $circularity_start eq $x ) {
+	    print STDERR "Circular dependency: $circularity\n";
+	    exit;
+	}
+	$circularity_start=$x if !$circularity_start;
+	$circularity="$x $circularity";
+    }
+    for $d (split /\s+/, $deps{$x}) {
+	$n += 1 + dependants_rec($d);
+    }
+    $dependants_rec_count--;
+    return $n;
+}
+sub dependants {
+    $dependants_rec_limit=keys %macro if !$dependants_rec_limit;
+    $dependants_rec_count=0;
+    return dependants_rec @_;
+}
+sub dependencysort {
+    my($x, $y) = @_;
+    my $xd = dependants($x);
+    my $yd = dependants($y);
+    return $xd-$yd if $xd != $yd;
+    return $x cmp $y;
+}
+
+@macros = sort { dependencysort($a,$b) } keys %macro;
+
+for $macro ( @macros ) {
+    for $d1 (split /\s+/, $deps{$macro} ) {
+	for $d2 (split /\s+/, $deps{$macro} ) {
+	    print STDERR "Redundancy in $macro - $d1 depends on $d2\n" if depends($d1,$d2);
+	}
+	print STDERR "Unknown in $macro - $d1\n" if !$macro{$d1};
+    }
+}
+
+open OUT, ">$qtbase/src/corelib/global/qfeatures.h"
+    or die "Cannot open $qtbase/src/corelib/global/qfeatures.h for writing";
+
+print OUT
+'/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*
+ * All features and their dependencies.
+ *
+ * This list is generated from $QTDIR/src/corelib/global/qfeatures.txt
+ */
+
+';
+
+
+for $macro ( @macros ) {
+    print OUT "// $label{$macro}\n";
+    if ( $deps{$macro} ) {
+	print OUT "#if !defined(QT_NO_$macro)";
+	print OUT " && (", (join " || ", map { "defined(QT_NO_$_)" } split /\s+/, $deps{$macro}), ")";
+	print OUT "\n";
+	print OUT "#define QT_NO_$macro\n";
+	print OUT "#endif\n";
+    } else {
+	print OUT "//#define QT_NO_$macro\n";
+    }
+    print OUT "\n";
+}
+
+close OUT;