#!/bin/sh
#
# Generated by qconf 1.5 ( http://delta.affinix.com/qconf/ )
#

show_usage() {
cat <<EOT
Usage: $0 [OPTION]...

This script creates necessary configuration files to build/install.

Main options:
  --prefix=[path]        Base path for build/install.  Default: /usr/local
  --bindir=[path]        Directory for binaries.  Default: PREFIX/bin
  --includedir=[path]    Directory for headers.  Default: PREFIX/include
  --libdir=[path]        Directory for libraries.  Default: PREFIX/lib
  --datadir=[path]       Directory for data.  Default: PREFIX/share
  --qtdir=[path]         Directory where Qt is installed.
  --static               Create a static library instead of shared.
  --verbose              Show extra configure output.
  --help                 This help text.

Project options:
  --release                   Build with debugging turned off (default).
  --debug                     Build with debugging turned on.
  --debug-and-release         Build two versions, with and without debugging
                              turned on (windows/mac only).
  --no-separate-debug-info    Do not store debug information in a separate
                              file (unix only, default for mac).
  --separate-debug-info       Strip debug information into a separate .debug
                              file (unix only, default for non-mac).
  --no-framework              Do not build as a Mac framework.
  --framework                 Build as a Mac framework (default).
  --universal                 Build with Mac universal binary support.
  --mac-sdk=[path]            Path to Mac universal SDK (PPC host only).
  --disable-tests             Don't build examples and unittests.
  --certstore-path=[path]     Path to the SSL/X509 Certificate store file.
  --certstore-internal        Force the use of the bundled store.

EOT
}

# which/make detection adapted from Qt
which_command() {
	OLD_HOME=$HOME
	HOME=/dev/null
	export HOME

	WHICH=`which which 2>/dev/null`
	if echo $WHICH | grep 'shell built-in command' >/dev/null 2>&1; then
		WHICH=which
	elif [ -z "$WHICH" ]; then
		if which which >/dev/null 2>&1; then
			WHICH=which
		else
			for a in /usr/ucb /usr/bin /bin /usr/local/bin; do
				if [ -x $a/which ]; then
					WHICH=$a/which
					break;
				fi
			done
		fi
	fi

	if [ -z "$WHICH" ]; then
		OLD_IFS=$IFS
		IFS=:
		for a in $PATH; do
			if [ -x $a/$1 ]; then
				echo "$a/$1"
				IFS=$OLD_IFS
				export IFS
				HOME=$OLD_HOME
				export HOME
				return 0
			fi
		done
		IFS=$OLD_IFS
		export IFS
	else
		a=`"$WHICH" "$1" 2>/dev/null`
		if [ ! -z "$a" -a -x "$a" ]; then
			echo "$a"
			HOME=$OLD_HOME
			export HOME
			return 0
		fi
	fi
	HOME=$OLD_HOME
	export HOME
	return 1
}
WHICH=which_command

# find a make command
if [ -z "$MAKE" ]; then
	MAKE=
	for mk in gmake make; do
		if $WHICH $mk >/dev/null 2>&1; then
			MAKE=`$WHICH $mk`
			break
		fi
	done
	if [ -z "$MAKE" ]; then
		echo "You don't seem to have 'make' or 'gmake' in your PATH."
		echo "Cannot proceed."
		exit 1
	fi
fi

show_qt_info() {
	printf "Be sure you have a proper Qt 4.0 build environment set up.  This means not\n"
	printf "just Qt, but also a C++ compiler, a make tool, and any other packages\n"
	printf "necessary for compiling C++ programs.\n"
	printf "\n"
	printf "If you are certain everything is installed, then it could be that Qt 4 is not\n"
	printf "being recognized or that a different version of Qt is being detected by\n"
	printf "mistake (for example, this could happen if \$QTDIR is pointing to a Qt 3\n"
	printf "installation).  At least one of the following conditions must be satisfied:\n"
	printf "\n"
	printf " 1) --qtdir is set to the location of Qt\n"
	printf " 2) \$QTDIR is set to the location of Qt\n"
	printf " 3) QtCore is in the pkg-config database\n"
	printf " 4) qmake is in the \$PATH\n"
	printf "\n"
	printf "This script will use the first one it finds to be true, checked in the above\n"
	printf "order.  #3 and #4 are the recommended options.  #1 and #2 are mainly for\n"
	printf "overriding the system configuration.\n"
	printf "\n"
}

while [ $# -gt 0 ]; do
	optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
	case "$1" in
		--prefix=*)
			PREFIX=$optarg
			shift
			;;

		--bindir=*)
			BINDIR=$optarg
			shift
			;;

		--includedir=*)
			INCDIR=$optarg
			shift
			;;

		--libdir=*)
			LIBDIR=$optarg
			shift
			;;

		--datadir=*)
			DATADIR=$optarg
			shift
			;;

		--qtdir=*)
			EX_QTDIR=$optarg
			shift
			;;

		--static)
			QC_STATIC="Y"
			shift
			;;

		--release)
			QC_RELEASE="Y"
			shift
			;;

		--debug)
			QC_DEBUG="Y"
			shift
			;;

		--debug-and-release)
			QC_DEBUG_AND_RELEASE="Y"
			shift
			;;

		--no-separate-debug-info)
			QC_NO_SEPARATE_DEBUG_INFO="Y"
			shift
			;;

		--separate-debug-info)
			QC_SEPARATE_DEBUG_INFO="Y"
			shift
			;;

		--no-framework)
			QC_NO_FRAMEWORK="Y"
			shift
			;;

		--framework)
			QC_FRAMEWORK="Y"
			shift
			;;

		--universal)
			QC_UNIVERSAL="Y"
			shift
			;;

		--mac-sdk=*)
			QC_MAC_SDK=$optarg
			shift
			;;

		--disable-tests)
			QC_DISABLE_TESTS="Y"
			shift
			;;

		--certstore-path=*)
			QC_CERTSTORE_PATH=$optarg
			shift
			;;

		--certstore-internal)
			QC_CERTSTORE_INTERNAL="Y"
			shift
			;;

		--verbose)
			QC_VERBOSE="Y"
			shift
			;;
		--help) show_usage; exit ;;
		*) show_usage; exit ;;
	esac
done

PREFIX=${PREFIX:-/usr/local}
BINDIR=${BINDIR:-$PREFIX/bin}
INCDIR=${INCDIR:-$PREFIX/include}
LIBDIR=${LIBDIR:-$PREFIX/lib}
DATADIR=${DATADIR:-$PREFIX/share}

echo "Configuring Qt Cryptographic Architecture (QCA) ..."

if [ "$QC_VERBOSE" = "Y" ]; then
echo
echo PREFIX=$PREFIX
echo BINDIR=$BINDIR
echo INCDIR=$INCDIR
echo LIBDIR=$LIBDIR
echo DATADIR=$DATADIR
echo EX_QTDIR=$EX_QTDIR
echo QC_STATIC=$QC_STATIC
echo QC_RELEASE=$QC_RELEASE
echo QC_DEBUG=$QC_DEBUG
echo QC_DEBUG_AND_RELEASE=$QC_DEBUG_AND_RELEASE
echo QC_NO_SEPARATE_DEBUG_INFO=$QC_NO_SEPARATE_DEBUG_INFO
echo QC_SEPARATE_DEBUG_INFO=$QC_SEPARATE_DEBUG_INFO
echo QC_NO_FRAMEWORK=$QC_NO_FRAMEWORK
echo QC_FRAMEWORK=$QC_FRAMEWORK
echo QC_UNIVERSAL=$QC_UNIVERSAL
echo QC_MAC_SDK=$QC_MAC_SDK
echo QC_DISABLE_TESTS=$QC_DISABLE_TESTS
echo QC_CERTSTORE_PATH=$QC_CERTSTORE_PATH
echo QC_CERTSTORE_INTERNAL=$QC_CERTSTORE_INTERNAL
echo
fi

printf "Verifying Qt 4 build environment ... "

# run qmake -v and check version
qmake_check_v4() {
	if [ -x "$1" ]; then
		if echo `$1 -v 2>&1` | grep "Qt version 4\." >/dev/null 2>&1; then
			return 0
		elif [ "$QC_VERBOSE" = "Y" ]; then
			echo "Warning: $1 not for Qt 4"
		fi
	fi
	return 1
}

if [ "$QC_VERBOSE" = "Y" ]; then
	echo
fi

qm=""
names="qmake-qt4 qmake4 qmake"

# qt4 check: --qtdir
if [ -z "$qm" ] && [ ! -z "$EX_QTDIR" ]; then
	for n in $names; do
		qstr=$EX_QTDIR/bin/$n
		if qmake_check_v4 "$qstr"; then
			qm=$qstr
			break;
		fi
	done
fi
if [ -z "$qm" ] && [ "$QC_VERBOSE" = "Y" ]; then
	echo "Warning: qmake not found via --qtdir"
fi

# qt4 check: QTDIR
if [ -z "$qm" ] && [ ! -z "$QTDIR" ]; then
	for n in $names; do
		qstr=$QTDIR/bin/$n
		if qmake_check_v4 "$qstr"; then
			qm=$qstr
			break;
		fi
	done
fi
if [ -z "$qm" ] && [ "$QC_VERBOSE" = "Y" ]; then
	echo "Warning: qmake not found via \$QTDIR"
fi

# qt4 check: pkg-config
if [ -z "$qm" ]; then
	str=`pkg-config QtCore --variable=exec_prefix 2>/dev/null`
	if [ ! -z "$str" ]; then
		for n in $names; do
			qstr=$str/bin/$n
			if qmake_check_v4 "$qstr"; then
				qm=$qstr
				break;
			fi
		done
	fi
fi
if [ -z "$qm" ] && [ "$QC_VERBOSE" = "Y" ]; then
	echo "Warning: qmake not found via pkg-config"
fi

# qt4 check: PATH
if [ -z "$qm" ]; then
	for n in $names; do
		qstr=`$WHICH $n 2>/dev/null`
		if qmake_check_v4 "$qstr"; then
			qm=$qstr
			break;
		fi
	done
fi
if [ -z "$qm" ] && [ "$QC_VERBOSE" = "Y" ]; then
	echo "Warning: qmake not found via \$PATH"
fi

if [ -z "$qm" ]; then
	if [ "$QC_VERBOSE" = "Y" ]; then
		echo " -> fail"
	else
		echo "fail"
	fi
	printf "\n"
	printf "Reason: Unable to find the 'qmake' tool for Qt 4.\n"
	printf "\n"
	show_qt_info
	exit 1;
fi
if [ "$QC_VERBOSE" = "Y" ]; then
	echo qmake found in $qm
fi

# try to determine the active makespec
defmakespec=$QMAKESPEC
if [ -z "$defmakespec" ]; then
	if $WHICH readlink >/dev/null 2>&1; then
		READLINK=`$WHICH readlink`
	fi
	if [ ! -z "$READLINK" ]; then
		qt_mkspecsdir=`$qm -query QT_INSTALL_DATA`/mkspecs
		if [ -d "$qt_mkspecsdir" ] && [ -h "$qt_mkspecsdir/default" ]; then
			defmakespec=`$READLINK $qt_mkspecsdir/default`
		fi
	fi
fi

if [ "$QC_VERBOSE" = "Y" ]; then
	echo makespec is $defmakespec
fi

qm_spec=""
# if the makespec is macx-xcode, force macx-g++
if [ "$defmakespec" = "macx-xcode" ]; then
	qm_spec=macx-g++
	QMAKESPEC=$qm_spec
	export QMAKESPEC
	if [ "$QC_VERBOSE" = "Y" ]; then
		echo overriding makespec to $qm_spec
	fi
fi

gen_files() {
cat >$1/modules.cpp <<EOT
#line 1 "qt42.qcm"
/*
-----BEGIN QCMOD-----
name: Qt >= 4.2
-----END QCMOD-----
*/
class qc_qt42 : public ConfObj
{
public:
	qc_qt42(Conf *c) : ConfObj(c) {}
	QString name() const { return "Qt >= 4.2"; }
	QString shortname() const { return "qt42"; }
	bool exec()
	{
		conf->debug(QString("QT_VERSION = 0x%1").arg(QString::number(QT_VERSION, 16)));
		if(QT_VERSION >= 0x040200)
			return true;
		else
			return false;
	}
};
#line 1 "buildmode.qcm"
/*
-----BEGIN QCMOD-----
name: buildmode
section: project
arg: release,Build with debugging turned off (default).
arg: debug,Build with debugging turned on.
arg: debug-and-release,Build two versions, with and without debugging turned on (windows/mac only).
arg: no-separate-debug-info,Do not store debug information in a separate file (unix only, default for mac).
arg: separate-debug-info,Strip debug information into a separate .debug file (unix only, default for non-mac).
-----END QCMOD-----
*/

#define QC_BUILDMODE
bool qc_buildmode_release = false;
bool qc_buildmode_debug = false;
bool qc_buildmode_separate_debug_info = false;

class qc_buildmode : public ConfObj
{
public:
	qc_buildmode(Conf *c) : ConfObj(c) {}
	QString name() const { return "buildmode"; }
	QString shortname() const { return "buildmode"; }

	// no output
	QString checkString() const { return QString(); }

	bool exec()
	{
		// first, parse out the options
		bool opt_release = false;
		bool opt_debug = false;
		bool opt_debug_and_release = false;
		bool opt_no_separate_debug_info = false;
		bool opt_separate_debug_info = false;

		if(conf->getenv("QC_RELEASE") == "Y")
			opt_release = true;
		if(conf->getenv("QC_DEBUG") == "Y")
			opt_debug = true;
		if(conf->getenv("QC_DEBUG_AND_RELEASE") == "Y")
			opt_debug_and_release = true;
		if(conf->getenv("QC_NO_SEPARATE_DEBUG_INFO") == "Y")
			opt_no_separate_debug_info = true;
		if(conf->getenv("QC_SEPARATE_DEBUG_INFO") == "Y")
			opt_separate_debug_info = true;

#if !defined(Q_OS_WIN) && !defined(Q_OS_MAC)
		if(opt_debug_and_release)
		{
			printf("\nError: The --debug-and-release option is for windows/mac only.\n");
			exit(1);
		}
#endif

#ifdef Q_OS_WIN
		if(opt_no_separate_debug_info)
		{
			printf("\nError: The --no-separate-debug-info option is for unix only.\n");
			exit(1);
		}

		if(opt_separate_debug_info)
		{
			printf("\nError: The --separate-debug-info option is for unix only.\n");
			exit(1);
		}
#endif

		// sanity check exclusive options
		int x;

		// build mode
		x = 0;
		if(opt_release)
			++x;
		if(opt_debug)
			++x;
		if(opt_debug_and_release)
			++x;
		if(x > 1)
		{
			printf("\nError: Use only one of --release, --debug, or --debug-and-release.\n");
			exit(1);
		}

		// debug info
		x = 0;
		if(opt_no_separate_debug_info)
			++x;
		if(opt_separate_debug_info)
			++x;
		if(x > 1)
		{
			printf("\nError: Use only one of --separate-debug-info or --no-separate-debug-info\n");
			exit(1);
		}

		// now process the options

		if(opt_release)
			qc_buildmode_release = true;
		else if(opt_debug)
			qc_buildmode_debug = true;
		else if(opt_debug_and_release)
		{
			qc_buildmode_release = true;
			qc_buildmode_debug = true;
		}
		else // default
			qc_buildmode_release = true;

		if(opt_separate_debug_info)
			qc_buildmode_separate_debug_info = true;
		else if(opt_no_separate_debug_info)
		{
			// nothing to do
		}
		else // default
		{
#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC)
			qc_buildmode_separate_debug_info = true;
#endif
		}

		// make the string
		QStringList opts;
		QString other;

		if(qc_buildmode_release && qc_buildmode_debug)
		{
			opts += "debug_and_release";
			opts += "build_all";
		}
		else if(qc_buildmode_release)
			opts += "release";
		else // qc_buildmode_debug
			opts += "debug";

		if(qc_buildmode_separate_debug_info)
		{
			opts += "separate_debug_info";
			other += "QMAKE_CFLAGS += -g\n";
			other += "QMAKE_CXXFLAGS += -g\n";
		}

		QString str = QString("CONFIG += ") + opts.join(" ") + '\n';
		conf->addExtra(str);

		if(!other.isEmpty())
			conf->addExtra(other);

		return true;
	}
};
#line 1 "buildmode_framework.qcm"
/*
-----BEGIN QCMOD-----
name: buildmode_framework
section: project
arg: no-framework,Do not build as a Mac framework.
arg: framework,Build as a Mac framework (default).
-----END QCMOD-----
*/

#define QC_BUILDMODE_FRAMEWORK
bool qc_buildmode_framework_enabled = false;

class qc_buildmode_framework : public ConfObj
{
public:
	qc_buildmode_framework(Conf *c) : ConfObj(c) {}
	QString name() const { return "buildmode_framework"; }
	QString shortname() const { return "buildmode_framework"; }

	// no output
	QString checkString() const { return QString(); }

	bool exec()
	{
		// first, parse out the options
		bool opt_no_framework = false;
		bool opt_framework = false;

		if(conf->getenv("QC_NO_FRAMEWORK") == "Y")
			opt_no_framework = true;
		if(conf->getenv("QC_FRAMEWORK") == "Y")
			opt_framework = true;

		bool staticmode = false;
		if(conf->getenv("QC_STATIC") == "Y")
			staticmode = true;

#ifndef Q_OS_MAC
		if(opt_framework)
		{
			printf("\nError: The --framework option is for mac only.\n");
			exit(1);
		}
#endif

		if(opt_framework && qc_buildmode_debug)
		{
			printf("\nError: Cannot use both --framework and --debug.\n");
			exit(1);
		}

		// sanity check exclusive options
		int x;

		// framework
		if(opt_framework && staticmode)
		{
			printf("\nError: Cannot use both --framework and --static.\n");
			exit(1);
		}

		x = 0;
		if(opt_no_framework)
			++x;
		if(opt_framework)
			++x;
		if(x > 1)
		{
			printf("\nError: Use only one of --framework or --no-framework.\n");
			exit(1);
		}

#ifdef Q_OS_MAC
		// now process the options

		if(opt_framework)
			qc_buildmode_framework_enabled = true;
		else if(opt_no_framework)
		{
			// nothing to do
		}
		else // default
		{
			if(!staticmode && !qc_buildmode_debug)
				qc_buildmode_framework_enabled = true;
		}

		if(qc_buildmode_framework_enabled)
			conf->addExtra("CONFIG += lib_bundle");
#endif

		return true;
	}
};
#line 1 "universal.qcm"
/*
-----BEGIN QCMOD-----
name: Mac universal binary support
section: project
arg: universal,Build with Mac universal binary support.
arg: mac-sdk=[path],Path to Mac universal SDK (PPC host only).
-----END QCMOD-----
*/

#define QC_UNIVERSAL
bool qc_universal_enabled = false;
QString qc_universal_sdk;

//----------------------------------------------------------------------------
// qc_universal
//----------------------------------------------------------------------------
class qc_universal : public ConfObj
{
public:
	qc_universal(Conf *c) : ConfObj(c) {}
	QString name() const { return "Mac universal binary support"; }
	QString shortname() const { return "universal"; }
	QString checkString() const { return QString(); }

	bool exec()
	{
#ifdef Q_OS_MAC
		if(qc_getenv("QC_UNIVERSAL") == "Y")
		{
			qc_universal_enabled = true;

			QString str =
			"contains(QT_CONFIG,x86):contains(QT_CONFIG,ppc) {\n"
			"	CONFIG += x86 ppc\n"
			"}\n";

			QString sdk = qc_getenv("QC_MAC_SDK");
			if(!sdk.isEmpty())
			{
				str += QString("QMAKE_MAC_SDK = %1\n").arg(sdk);
				qc_universal_sdk = sdk;
			}

			conf->addExtra(str);
		}
#endif
		return true;
	}
};
#line 1 "extra.qcm"
/*
-----BEGIN QCMOD-----
name: extra
section: project
arg: disable-tests,Don't build examples and unittests.
-----END QCMOD-----
*/

class qc_extra : public ConfObj
{
public:
	qc_extra(Conf *c) : ConfObj(c) {}
	QString name() const { return "extra"; }
	QString shortname() const { return "extra"; }

	// no output
	QString checkString() const { return QString(); }

	bool exec()
	{
#ifndef Q_OS_WIN
		// --prefix=\$pwd ?
		QString datadir;
		if(QFile::exists(conf->getenv("PREFIX") + "/qca.pro"))
			datadir = "\$\$PREFIX";
		else
			datadir = "\$\$DATADIR/qca";

		conf->addExtra(makeEscapedDefine("DATADIR", datadir));
#endif

		QString str;
		QFile f;

#ifndef Q_OS_WIN
		// HAVE_SYS_FILIO_H
		if(conf->findHeader("sys/filio.h", QStringList(), &str))
		{
			if(!str.isEmpty())
				conf->addIncludePath(str);
			conf->addDefine("HAVE_SYS_FILIO_H");
		}

		// MLOCK_NOT_VOID_PTR
		str =
		"# include <stdlib.h>\n"
		"# include <sys/mman.h>\n"
		"int main() { void *f = 0; return mlock(f,8); }\n";
		if(!conf->doCompileAndLink(str, QStringList(), QString(), QString()))
		{
			conf->debug("mlock(2) does not take a void *");
			conf->addDefine("MLOCK_NOT_VOID_PTR");
		}

		str = QString();
#endif

		if(conf->getenv("QC_DISABLE_TESTS") == "Y")
			str += "QCA_NO_TESTS = 1\n";

		conf->addExtra(str);

		bool release = true;
		bool debug = false;
		bool debug_info = false;
		bool universal = false;
		QString sdk;

#ifdef QC_BUILDMODE
		release = qc_buildmode_release;
		debug = qc_buildmode_debug;
		debug_info = qc_buildmode_separate_debug_info;
#endif

#ifdef QC_UNIVERSAL
		universal = qc_universal_enabled;
		sdk = qc_universal_sdk;
#endif

		// write confapp.pri
		str = QString();
#ifndef Q_OS_WIN
                QString var = conf->getenv("BINDIR");
                if(!var.isEmpty())
			str += QString("BINDIR = %1\n").arg(var);
#endif
		if(debug) // debug or debug-and-release
			str += QString("CONFIG += debug\n");
		else // release
			str += QString("CONFIG += release\n");
		if(debug_info)
		{
			str += QString("CONFIG += separate_debug_info\n");
			str += "QMAKE_CFLAGS += -g\n";
			str += "QMAKE_CXXFLAGS += -g\n";
		}
		if(universal)
		{
			str +=
			"contains(QT_CONFIG,x86):contains(QT_CONFIG,ppc) {\n"
			"	CONFIG += x86 ppc\n"
			"}\n";

			if(!sdk.isEmpty())
				str += QString("QMAKE_MAC_SDK = %1\n").arg(sdk);
		}
		f.setFileName("confapp.pri");
		if(f.open(QFile::WriteOnly | QFile::Truncate))
			f.write(str.toLatin1());
		f.close();

#ifdef Q_OS_WIN
		QString prefix = QDir::currentPath();
		QString incdir = prefix + "/include";
		QString libdir = prefix + "/lib";
#else
		QString prefix = conf->getenv("PREFIX");
		QString incdir = conf->getenv("INCDIR");
		QString libdir = conf->getenv("LIBDIR");
#endif

		// write qmake-feature file
		QString crypto_in;
		f.setFileName("crypto.prf.in");
		if(f.open(QFile::ReadOnly))
		{
			crypto_in = QString::fromUtf8(f.readAll());
			f.close();
		}

		str = QString("QCA_INCDIR = %1\n").arg(incdir);
		str += QString("QCA_LIBDIR = %1\n").arg(libdir);
		str += crypto_in;

		f.setFileName("crypto.prf");
		if(f.open(QFile::WriteOnly | QFile::Truncate))
		{
			f.write(str.toLatin1());
			f.close();
		}

#ifndef Q_OS_WIN
		str = QString(
		"prffiles.path = %1/mkspecs/features\n"
		"prffiles.files = crypto.prf\n"
		"INSTALLS += prffiles\n"
		).arg(QLibraryInfo::location(QLibraryInfo::DataPath));
		conf->addExtra(str);

		// write pkg-config files

		QString pkg_template1 = QString(
		"prefix=%1\n"
		"exec_prefix=\${prefix}\n"
		"libdir=%2\n"
		"includedir=%3/QtCrypto\n"
		"\n");

		QString pkg_template2 = QString(
		"Name: %1\n"
		"Description: Qt Cryptographic Architecture library\n"
		"Version: 2.0.2\n");

		QString pkg_template3 = QString(
		"Requires: %1\n");

		QString pkg_template4 = QString(
		"Libs: -L\${libdir} -l%1\n"
		"Cflags: -I\${includedir}\n"
		"\n");

		QStringList pcfiles;

		QDir dir = QDir::current();
		dir.mkdir("lib");
		dir.cd("lib");
		dir.mkdir("pkgconfig");

		bool do_pc_normal = false;
		bool do_pc_debug = false;

#ifdef Q_OS_MAC
		if(release)
			do_pc_normal = true;
		if(debug)
			do_pc_debug = true;
#else
		do_pc_normal = true;
#endif

		if(do_pc_normal)
		{
			str =  pkg_template1.arg(prefix, libdir, incdir);
			str += pkg_template2.arg("QCA");
			str += pkg_template3.arg("QtCore");
			str += pkg_template4.arg("qca");
			f.setFileName("lib/pkgconfig/qca2.pc");
			if(f.open(QFile::WriteOnly | QFile::Truncate))
				f.write(str.toLatin1());
			f.close();
			pcfiles += "lib/pkgconfig/qca2.pc";
		}

		if(do_pc_debug)
		{
			str =  pkg_template1.arg(prefix, libdir, incdir);
			str += pkg_template2.arg("QCA_debug");
			str += pkg_template3.arg("QtCore_debug");
			str += pkg_template4.arg("qca_debug");
			f.setFileName("lib/pkgconfig/qca2_debug.pc");
			if(f.open(QFile::WriteOnly | QFile::Truncate))
				f.write(str.toLatin1());
			f.close();
			pcfiles += "lib/pkgconfig/qca2_debug.pc";
		}

		if(!pcfiles.isEmpty())
		{
        		str = QString(
			"pcfiles.path = \$\$LIBDIR/pkgconfig\n"
			"pcfiles.files = %1\n"
			"INSTALLS += pcfiles\n"
			).arg(pcfiles.join(" "));
			conf->addExtra(str);
		}
#endif

		return true;
	}

	QString makeEscapedDefine(const QString &var, const QString &val)
	{
		QString str = QString(
		"DEFINES += %1=\\\\\\\\\\\\\\"%2\\\\\\\\\\\\\\"\n"
		).arg(var).arg(val);
		return str;
	}
};
#line 1 "certstore.qcm"
/*
-----BEGIN QCMOD-----
name: certstore
section: project
arg: certstore-path=[path],Path to the SSL/X509 Certificate store file.
arg: certstore-internal,Force the use of the bundled store.
-----END QCMOD-----
*/

class qc_certstore : public ConfObj
{
public:
	qc_certstore(Conf *c) : ConfObj(c) {}
	QString name() const { return "certstore"; }
	QString shortname() const { return "certstore"; }

	bool exec()
	{
		bundled = false;

#if defined(Q_OS_WIN) || defined(Q_OS_MAC)
		// use built-in
		return true;
#else
		if(conf->getenv("QC_CERTSTORE_INTERNAL") != "Y")
		{
			QStringList pathsToTry;

			path = conf->getenv("QC_CERTSTORE_PATH");
			if(!path.isEmpty())
			{
				conf->addExtra(makeEscapedDefine("QCA_SYSTEMSTORE_PATH", path));
				return true;
			}

			// This is from Debian
			pathsToTry.append( QString("/etc/ssl/certs/ca-certificates.crt") );

			// Fedora Core 2 uses these
			pathsToTry.append( QString("/usr/share/ssl/cert.pem") );
			pathsToTry.append( QString("/usr/share/ssl/certs/ca-bundle.crt") );

			// Fedora Core 5 changes to this
			pathsToTry.append( QString("/etc/pki/tls/cert.pem") );

			for(int n = 0; n < pathsToTry.count(); ++n)
			{
        			if(QFile::exists(pathsToTry[n]))
				{
					path = pathsToTry[n];
					break;
				}
			}
		}

		// fall back to bundled
		if(path.isEmpty())
		{
			// --prefix=\$pwd ?
			if(QFile::exists(conf->getenv("PREFIX") + "/certs/rootcerts.pem"))
				path = "\$\$PREFIX/certs/rootcerts.pem";
			else
				path = "\$\$DATADIR/qca/certs/rootcerts.pem";

			QString extra =
			"sharedfiles.path = \$\$DATADIR/qca\n"
			"sharedfiles.files = certs\n"
			"INSTALLS += sharedfiles\n";
			conf->addExtra(extra);
			bundled = true;
		}

		conf->addExtra(makeEscapedDefine("QCA_SYSTEMSTORE_PATH", path));

		return true;
#endif
	}

	QString makeEscapedDefine(const QString &var, const QString &val)
	{
		QString str = QString(
		"DEFINES += %1=\\\\\\\\\\\\\\"%2\\\\\\\\\\\\\\"\n"
		).arg(var).arg(val);
		return str;
	}

	QString resultString() const
	{
#if defined(Q_OS_WIN)
		return "using Windows built-in";
#elif defined(Q_OS_MAC)
		return "using Mac built-in";
#else
		if(success)
		{
			if(bundled)
				return "using bundled";
			else
				return path;
		}
		else
			return ConfObj::resultString();
#endif
	}

private:
	QString path;
	bool bundled;
};

EOT
cat >$1/modules_new.cpp <<EOT
    o = new qc_qt42(conf);
    o->required = true;
    o->disabled = false;
    o = new qc_buildmode(conf);
    o->required = true;
    o->disabled = false;
    o = new qc_buildmode_framework(conf);
    o->required = true;
    o->disabled = false;
    o = new qc_universal(conf);
    o->required = true;
    o->disabled = false;
    o = new qc_extra(conf);
    o->required = true;
    o->disabled = false;
    o = new qc_certstore(conf);
    o->required = true;
    o->disabled = false;

EOT
cat >$1/conf4.h <<EOT
/*
Copyright (C) 2004-2008  Justin Karneges

This file is free software; unlimited permission is given to copy and/or
distribute it, with or without modifications, as long as this notice is
preserved.
*/

#ifndef QC_CONF4_H
#define QC_CONF4_H

#include <QtCore>

class Conf;

enum VersionMode { VersionMin, VersionExact, VersionMax, VersionAny };

// ConfObj
//
// Subclass ConfObj to create a new configuration module.
class ConfObj
{
public:
	Conf *conf;
	bool required;
	bool disabled;
	bool success;

	ConfObj(Conf *c);
	virtual ~ConfObj();

	// long or descriptive name of what is being checked/performed
	// example: "KDE >= 3.3"
	virtual QString name() const = 0;

	// short name
	// example: "kde"
	virtual QString shortname() const = 0;

	// string to display during check
	// default: "Checking for [name] ..."
	virtual QString checkString() const;

	// string to display after check
	// default: "yes" or "no", based on result of exec()
	virtual QString resultString() const;

	// this is where the checking code goes
	virtual bool exec() = 0;
};

// Conf
//
// Interact with this class from your ConfObj to perform detection
// operations and to output configuration parameters.
class Conf
{
public:
	bool debug_enabled;
	QString qmake_path;
	QString qmakespec;
	QString maketool;

	QString DEFINES;
	QString INCLUDEPATH;
	QString LIBS;
	QString extra;

	QList<ConfObj*> list;
	QMap<QString,QString> vars;

	Conf();
	~Conf();

	QString getenv(const QString &var);
	QString qvar(const QString &s);

	bool exec();

	void debug(const QString &s);

	QString expandIncludes(const QString &inc);
	QString expandLibs(const QString &lib);

	int doCommand(const QString &s, QByteArray *out = 0);
	int doCommand(const QString &prog, const QStringList &args, QByteArray *out = 0);

	bool doCompileAndLink(const QString &filedata, const QStringList &incs, const QString &libs, const QString &proextra, int *retcode = 0);
	bool checkHeader(const QString &path, const QString &h);
	bool findHeader(const QString &h, const QStringList &ext, QString *inc);
	bool checkLibrary(const QString &path, const QString &name);
	bool findLibrary(const QString &name, QString *lib);
	QString findProgram(const QString &prog);
	bool findSimpleLibrary(const QString &incvar, const QString &libvar, const QString &incname, const QString &libname, QString *incpath, QString *libs);
	bool findFooConfig(const QString &path, QString *version, QStringList *incs, QString *libs, QString *otherflags);
	bool findPkgConfig(const QString &name, VersionMode mode, const QString &req_version, QString *version, QStringList *incs, QString *libs, QString *otherflags);

	void addDefine(const QString &str);
	void addLib(const QString &str);
	void addIncludePath(const QString &str);
	void addExtra(const QString &str);

private:
	bool first_debug;

	friend class ConfObj;
	void added(ConfObj *o);
};

#endif

EOT
cat >$1/conf4.cpp <<EOT
/*
Copyright (C) 2004-2008  Justin Karneges

This file is free software; unlimited permission is given to copy and/or
distribute it, with or without modifications, as long as this notice is
preserved.
*/

#include "conf4.h"

#include <stdio.h>
#include <stdlib.h>

class MocTestObject : public QObject
{
	Q_OBJECT
public:
	MocTestObject() {}
};

QString qc_getenv(const QString &var)
{
	char *p = ::getenv(var.toLatin1().data());
	if(!p)
		return QString();
	return QString(p);
}

QStringList qc_pathlist()
{
	QStringList list;
	QString path = qc_getenv("PATH");
	if(!path.isEmpty())
	{
#ifdef Q_OS_WIN
		list = path.split(';', QString::SkipEmptyParts);
#else
		list = path.split(':', QString::SkipEmptyParts);
#endif
	}
#ifdef Q_OS_WIN
	list.prepend(".");
#endif
	return list;
}

QString qc_findprogram(const QString &prog)
{
	QString out;
	QStringList list = qc_pathlist();
	for(int n = 0; n < list.count(); ++n)
	{
		QFileInfo fi(list[n] + '/' + prog);
		if(fi.exists() && fi.isExecutable())
		{
			out = fi.filePath();
			break;
		}

#ifdef Q_OS_WIN
		// on windows, be sure to look for .exe
		if(prog.right(4).toLower() != ".exe")
		{
			fi = QFileInfo(list[n] + '/' + prog + ".exe");
			if(fi.exists() && fi.isExecutable())
			{
				out = fi.filePath();
				break;
			}
		}
#endif
	}
	return out;
}

QString qc_findself(const QString &argv0)
{
#ifdef Q_OS_WIN
	if(argv0.contains('\\'))
#else
	if(argv0.contains('/'))
#endif
		return argv0;
	else
		return qc_findprogram(argv0);
}

int qc_runcommand(const QString &command, QByteArray *out, bool showOutput)
{
	QString fullcmd = command;
	if(!showOutput)
	{
#ifdef Q_OS_WIN
		fullcmd += " 2>NUL";
#else
		fullcmd += " 2>/dev/null";
#endif
	}

#ifdef Q_OS_WIN
	FILE *f = _popen(fullcmd.toLatin1().data(), "r");
#else
	FILE *f = popen(fullcmd.toLatin1().data(), "r");
#endif
	if(!f)
		return -1;
	if(out)
		out->clear();
	while(1)
	{
		char c = (char)fgetc(f);
		if(feof(f))
			break;
		if(out)
			out->append(c);
		if(showOutput)
			fputc(c, stdout);
	}
#ifdef Q_OS_WIN
	int ret = _pclose(f);
#else
	int ret = pclose(f);
#endif
	if(ret == -1)
		return -1;
	return ret;
}

int qc_runprogram(const QString &prog, const QStringList &args, QByteArray *out, bool showOutput)
{
	QString fullcmd = prog;
	QString argstr = args.join(" ");
	if(!argstr.isEmpty())
		fullcmd += QString(" ") + argstr;
	return qc_runcommand(fullcmd, out, showOutput);

	// TODO: use QProcess once it is fixed
	/*
	QProcess process;
	if(showOutput)
		process.setReadChannelMode(ForwardedChannels);
	process.start(prog, args);
	process.waitForFinished(-1);
	return process.exitCode();
	*/
}

bool qc_removedir(const QString &dirPath)
{
	QDir dir(dirPath);
	if(!dir.exists())
		return false;
	QStringList list = dir.entryList();
	foreach(QString s, list)
	{
		if(s == "." || s == "..")
			continue;
		QFileInfo fi(dir.filePath(s));
		if(fi.isDir())
		{
			if(!qc_removedir(fi.filePath()))
				return false;
		}
		else
		{
			if(!dir.remove(s))
				return false;
		}
	}
	QString dirName = dir.dirName();
	if(!dir.cdUp())
		return false;
	if(!dir.rmdir(dirName))
		return false;
	return true;
}

void qc_splitcflags(const QString &cflags, QStringList *incs, QStringList *otherflags)
{
	incs->clear();
	otherflags->clear();

	QStringList cflagsList = cflags.split(" ");
	for(int n = 0; n < cflagsList.count(); ++n)
	{
		QString str = cflagsList[n];
		if(str.startsWith("-I"))
		{
			// we want everything except the leading "-I"
			incs->append(str.remove(0, 2));
		}
		else
		{
			// we want whatever is left
			otherflags->append(str);
		}
	}
}

QString qc_escapeArg(const QString &str)
{
	QString out;
	for(int n = 0; n < (int)str.length(); ++n) {
		if(str[n] == '-')
			out += '_';
		else
			out += str[n];
	}
	return out;
}

//----------------------------------------------------------------------------
// ConfObj
//----------------------------------------------------------------------------
ConfObj::ConfObj(Conf *c)
{
	conf = c;
	conf->added(this);
	required = false;
	disabled = false;
	success = false;
}

ConfObj::~ConfObj()
{
}

QString ConfObj::checkString() const
{
	return QString("Checking for %1 ...").arg(name());
}

QString ConfObj::resultString() const
{
	if(success)
		return "yes";
	else
		return "no";
}

//----------------------------------------------------------------------------
// qc_internal_pkgconfig
//----------------------------------------------------------------------------
class qc_internal_pkgconfig : public ConfObj
{
public:
	QString pkgname, desc;
	VersionMode mode;
	QString req_ver;

        qc_internal_pkgconfig(Conf *c, const QString &_name, const QString &_desc, VersionMode _mode, const QString &_req_ver) : ConfObj(c)
	{
		pkgname = _name;
		desc = _desc;
		mode = _mode;
		req_ver = _req_ver;
	}

	QString name() const { return desc; }
	QString shortname() const { return pkgname; }

	bool exec()
	{
		QStringList incs;
		QString version, libs, other;
		if(!conf->findPkgConfig(pkgname, mode, req_ver, &version, &incs, &libs, &other))
			return false;

		for(int n = 0; n < incs.count(); ++n)
			conf->addIncludePath(incs[n]);
		if(!libs.isEmpty())
			conf->addLib(libs);
		//if(!other.isEmpty())
		//	conf->addExtra(QString("QMAKE_CFLAGS += %1\n").arg(other));
		return true;
	}
};

//----------------------------------------------------------------------------
// Conf
//----------------------------------------------------------------------------
Conf::Conf()
{
	// TODO: no more vars?
	//vars.insert("QMAKE_INCDIR_X11", new QString(X11_INC));
	//vars.insert("QMAKE_LIBDIR_X11", new QString(X11_LIBDIR));
	//vars.insert("QMAKE_LIBS_X11",   new QString(X11_LIB));
	//vars.insert("QMAKE_CC", CC);

	debug_enabled = false;
}

Conf::~Conf()
{
	qDeleteAll(list);
}

void Conf::added(ConfObj *o)
{
	list.append(o);
}

QString Conf::getenv(const QString &var)
{
	return qc_getenv(var);
}

void Conf::debug(const QString &s)
{
	if(debug_enabled)
	{
		if(first_debug)
			printf("\n");
		first_debug = false;
		printf(" * %s\n", qPrintable(s));
	}
}

bool Conf::exec()
{
	for(int n = 0; n < list.count(); ++n)
	{
		ConfObj *o = list[n];

		// if this was a disabled-by-default option, check if it was enabled
		if(o->disabled)
		{
			QString v = QString("QC_ENABLE_") + qc_escapeArg(o->shortname());
			if(getenv(v) != "Y")
				continue;
		}
		// and the opposite?
		else
		{
			QString v = QString("QC_DISABLE_") + qc_escapeArg(o->shortname());
			if(getenv(v) == "Y")
				continue;
		}

		bool output = true;
		QString check = o->checkString();
		if(check.isEmpty())
			output = false;

		if(output)
		{
			printf("%s", check.toLatin1().data());
			fflush(stdout);
		}

		first_debug = true;
		bool ok = o->exec();
		o->success = ok;

		if(output)
		{
			QString result = o->resultString();
			if(!first_debug)
				printf(" -> %s\n", result.toLatin1().data());
			else
				printf(" %s\n", result.toLatin1().data());
		}

		if(!ok && o->required)
		{
			printf("\nError: need %s!\n", o->name().toLatin1().data());
			return false;
		}
	}
	return true;
}

QString Conf::qvar(const QString &s)
{
	return vars.value(s);
}

QString Conf::expandIncludes(const QString &inc)
{
	return QString("-I") + inc;
}

QString Conf::expandLibs(const QString &lib)
{
	return QString("-L") + lib;
}

int Conf::doCommand(const QString &s, QByteArray *out)
{
	debug(QString("[%1]").arg(s));
	int r = qc_runcommand(s, out, debug_enabled);
	debug(QString("returned: %1").arg(r));
	return r;
}

int Conf::doCommand(const QString &prog, const QStringList &args, QByteArray *out)
{
	QString fullcmd = prog;
	QString argstr = args.join(" ");
	if(!argstr.isEmpty())
		fullcmd += QString(" ") + argstr;
	debug(QString("[%1]").arg(fullcmd));
	int r = qc_runprogram(prog, args, out, debug_enabled);
	debug(QString("returned: %1").arg(r));
	return r;
}

bool Conf::doCompileAndLink(const QString &filedata, const QStringList &incs, const QString &libs, const QString &proextra, int *retcode)
{
#ifdef Q_OS_WIN
	QDir tmp("qconftemp");
#else
	QDir tmp(".qconftemp");
#endif

	if(!tmp.mkdir("atest"))
	{
		debug("unable to create atest dir");
		return false;
	}
	QDir dir(tmp.filePath("atest"));
	if(!dir.exists())
	{
		debug("atest dir does not exist");
		return false;
	}

	QString fname = dir.filePath("atest.cpp");
	QString out = "atest";
	QFile f(fname);
	if(!f.open(QFile::WriteOnly | QFile::Truncate))
	{
		debug("unable to open atest.cpp for writing");
		return false;
	}
	if(f.write(filedata.toLatin1()) == -1)
	{
		debug("error writing to atest.cpp");
		return false;
	}
	f.close();

	debug(QString("Wrote atest.cpp:\n%1").arg(filedata));

	QString pro = QString(
		"CONFIG  += console\n"
		"CONFIG  -= qt app_bundle\n"
		"DESTDIR  = \$\$PWD\n"
		"SOURCES += atest.cpp\n");
	QString inc = incs.join(" ");
	if(!inc.isEmpty())
		pro += "INCLUDEPATH += " + inc + '\n';
	if(!libs.isEmpty())
		pro += "LIBS += " + libs + '\n';
	pro += proextra;

	fname = dir.filePath("atest.pro");
	f.setFileName(fname);
	if(!f.open(QFile::WriteOnly | QFile::Truncate))
	{
		debug("unable to open atest.pro for writing");
		return false;
	}
	if(f.write(pro.toLatin1()) == -1)
	{
		debug("error writing to atest.pro");
		return false;
	}
	f.close();

	debug(QString("Wrote atest.pro:\n%1").arg(pro));

	QString oldpath = QDir::currentPath();
	QDir::setCurrent(dir.path());

	bool ok = false;
	int r = doCommand(qmake_path, QStringList() << "atest.pro");
	if(r == 0)
	{
		r = doCommand(maketool, QStringList());
		if(r == 0)
		{
			ok = true;
			if(retcode)
			{
				QString runatest = out;
#ifdef Q_OS_UNIX
				runatest.prepend("./");
#endif
				*retcode = doCommand(runatest, QStringList());
			}
		}
		r = doCommand(maketool, QStringList() << "distclean");
		if(r != 0)
			debug("error during atest distclean");
	}

	QDir::setCurrent(oldpath);

	// cleanup
	//dir.remove("atest.pro");
	//dir.remove("atest.cpp");
	//tmp.rmdir("atest");

	// remove whole dir since distclean doesn't always work
	qc_removedir(tmp.filePath("atest"));

	if(!ok)
		return false;
	return true;
}

bool Conf::checkHeader(const QString &path, const QString &h)
{
	QFileInfo fi(path + '/' + h);
	if(fi.exists())
		return true;
	return false;
}

bool Conf::findHeader(const QString &h, const QStringList &ext, QString *inc)
{
	if(checkHeader("/usr/include", h))
	{
		*inc = "";
		return true;
	}
	QStringList dirs;
	dirs += "/usr/local/include";
	dirs += ext;
	for(QStringList::ConstIterator it = dirs.begin(); it != dirs.end(); ++it)
	{
		if(checkHeader(*it, h))
		{
			*inc = *it;
			return true;
		}
	}
	return false;
}

bool Conf::checkLibrary(const QString &path, const QString &name)
{
	QString str =
		//"#include <stdio.h>\n"
		"int main()\n"
		"{\n"
		//"    printf(\"library checker running\\\\n\");\n"
		"    return 0;\n"
		"}\n";

	QString libs;
	if(!path.isEmpty())
		libs += QString("-L") + path + ' ';
	libs += QString("-l") + name;
	if(!doCompileAndLink(str, QStringList(), libs, QString()))
		return false;
	return true;
}

bool Conf::findLibrary(const QString &name, QString *lib)
{
	if(checkLibrary("", name))
	{
		*lib = "";
		return true;
	}
	if(checkLibrary("/usr/local/lib", name))
	{
		*lib = "/usr/local/lib";
		return true;
	}
	return false;
}

QString Conf::findProgram(const QString &prog)
{
	return qc_findprogram(prog);
}

bool Conf::findSimpleLibrary(const QString &incvar, const QString &libvar, const QString &incname, const QString &libname, QString *incpath, QString *libs)
{
	QString inc, lib;
	QString s;

	s = getenv(incvar);
	if(!s.isEmpty()) {
		if(!checkHeader(s, incname))
			return false;
		inc = s;
	}
	else {
		if(!findHeader(incname, QStringList(), &s))
			return false;
		inc = s;
	}

	s = getenv(libvar);
	if(!s.isEmpty()) {
		if(!checkLibrary(s, libname))
			return false;
		lib = s;
	}
	else {
		if(!findLibrary(libname, &s))
			return false;
		lib = s;
	}

	QString lib_out;
	if(!lib.isEmpty())
		lib_out += QString("-L") + s;
	lib_out += QString("-l") + libname;

	*incpath = inc;
	*libs = lib_out;
	return true;
}

bool Conf::findFooConfig(const QString &path, QString *version, QStringList *incs, QString *libs, QString *otherflags)
{
	QStringList args;
	QByteArray out;
	int ret;

	args += "--version";
	ret = doCommand(path, args, &out);
	if(ret != 0)
		return false;

	QString version_out = QString::fromLatin1(out).trimmed();

	args.clear();
	args += "--libs";
	ret = doCommand(path, args, &out);
	if(ret != 0)
		return false;

	QString libs_out = QString::fromLatin1(out).trimmed();

	args.clear();
	args += "--cflags";
	ret = doCommand(path, args, &out);
	if(ret != 0)
		return false;

	QString cflags = QString::fromLatin1(out).trimmed();

	QStringList incs_out, otherflags_out;
	qc_splitcflags(cflags, &incs_out, &otherflags_out);

	*version = version_out;
	*incs = incs_out;
	*libs = libs_out;
	*otherflags = otherflags_out.join(" ");
	return true;
}

bool Conf::findPkgConfig(const QString &name, VersionMode mode, const QString &req_version, QString *version, QStringList *incs, QString *libs, QString *otherflags)
{
	QStringList args;
	QByteArray out;
	int ret;

	args += name;
	args += "--exists";
	ret = doCommand("pkg-config", args, &out);
	if(ret != 0)
		return false;

	if(mode != VersionAny)
	{
		args.clear();
		args += name;
		if(mode == VersionMin)
			args += QString("--atleast-version=%1").arg(req_version);
		else if(mode == VersionMax)
			args += QString("--max-version=%1").arg(req_version);
		else
			args += QString("--exact-version=%1").arg(req_version);
		ret = doCommand("pkg-config", args, &out);
		if(ret != 0)
			return false;
	}

	args.clear();
	args += name;
	args += "--modversion";
	ret = doCommand("pkg-config", args, &out);
	if(ret != 0)
		return false;

	QString version_out = QString::fromLatin1(out).trimmed();

	args.clear();
	args += name;
	args += "--libs";
	ret = doCommand("pkg-config", args, &out);
	if(ret != 0)
		return false;

	QString libs_out = QString::fromLatin1(out).trimmed();

	args.clear();
	args += name;
	args += "--cflags";
	ret = doCommand("pkg-config", args, &out);
	if(ret != 0)
		return false;

	QString cflags = QString::fromLatin1(out).trimmed();

	QStringList incs_out, otherflags_out;
	qc_splitcflags(cflags, &incs_out, &otherflags_out);

	*version = version_out;
	*incs = incs_out;
	*libs = libs_out;
	*otherflags = otherflags_out.join(" ");
	return true;
}

void Conf::addDefine(const QString &str)
{
	if(DEFINES.isEmpty())
		DEFINES = str;
	else
		DEFINES += QString(" ") + str;
	debug(QString("DEFINES += %1").arg(str));
}

void Conf::addLib(const QString &str)
{
	if(LIBS.isEmpty())
		LIBS = str;
	else
		LIBS += QString(" ") + str;
	debug(QString("LIBS += %1").arg(str));
}

void Conf::addIncludePath(const QString &str)
{
	if(INCLUDEPATH.isEmpty())
		INCLUDEPATH = str;
	else
		INCLUDEPATH += QString(" ") + str;
	debug(QString("INCLUDEPATH += %1").arg(str));
}

void Conf::addExtra(const QString &str)
{
	extra += str + '\n';
	debug(QString("extra += %1").arg(str));
}

//----------------------------------------------------------------------------
// main
//----------------------------------------------------------------------------
#include "conf4.moc"

#ifdef HAVE_MODULES
# include"modules.cpp"
#endif

int main()
{
	Conf *conf = new Conf;
	ConfObj *o;
	o = 0;
#ifdef HAVE_MODULES
# include"modules_new.cpp"
#endif

	conf->debug_enabled = (qc_getenv("QC_VERBOSE") == "Y") ? true: false;
	if(conf->debug_enabled)
		printf(" -> ok\n");
	else
		printf("ok\n");

	QString confCommand = qc_getenv("QC_COMMAND");
	QString proName = qc_getenv("QC_PROFILE");
	conf->qmake_path = qc_getenv("QC_QMAKE");
	conf->qmakespec = qc_getenv("QC_QMAKESPEC");
	conf->maketool = qc_getenv("QC_MAKETOOL");

	if(conf->debug_enabled)
		printf("conf command: [%s]\n", qPrintable(confCommand));

	QString confPath = qc_findself(confCommand);
	if(confPath.isEmpty())
	{
		printf("Error: cannot find myself; rerun with an absolute path\n");
		return 1;
	}

	QString srcdir = QFileInfo(confPath).absolutePath();
	QString builddir = QDir::current().absolutePath();
	QString proPath = QDir(srcdir).filePath(proName);

	if(conf->debug_enabled)
	{
		printf("conf path:    [%s]\n", qPrintable(confPath));
		printf("srcdir:       [%s]\n", qPrintable(srcdir));
		printf("builddir:     [%s]\n", qPrintable(builddir));
		printf("profile:      [%s]\n", qPrintable(proPath));
		printf("qmake path:   [%s]\n", qPrintable(conf->qmake_path));
		printf("qmakespec:    [%s]\n", qPrintable(conf->qmakespec));
		printf("make tool:    [%s]\n", qPrintable(conf->maketool));
		printf("\n");
	}

	bool success = false;
	if(conf->exec())
	{
		QFile f("conf.pri");
		if(!f.open(QFile::WriteOnly | QFile::Truncate))
		{
			printf("Error writing %s\n", qPrintable(f.fileName()));
			return 1;
		}

		QString str;
		str += "# qconf\n\n";

		QString var;
		var = qc_getenv("PREFIX");
		if(!var.isEmpty())
			str += QString("PREFIX = %1\n").arg(var);
		var = qc_getenv("BINDIR");
		if(!var.isEmpty())
			str += QString("BINDIR = %1\n").arg(var);
		var = qc_getenv("INCDIR");
		if(!var.isEmpty())
			str += QString("INCDIR = %1\n").arg(var);
		var = qc_getenv("LIBDIR");
		if(!var.isEmpty())
			str += QString("LIBDIR = %1\n").arg(var);
		var = qc_getenv("DATADIR");
		if(!var.isEmpty())
			str += QString("DATADIR = %1\n").arg(var);
		str += '\n';

		if(qc_getenv("QC_STATIC") == "Y")
			str += "CONFIG += staticlib\n";

		// TODO: don't need this?
		//str += "QT_PATH_PLUGINS = " + QString(qInstallPathPlugins()) + '\n';

		if(!conf->DEFINES.isEmpty())
			str += "DEFINES += " + conf->DEFINES + '\n';
		if(!conf->INCLUDEPATH.isEmpty())
			str += "INCLUDEPATH += " + conf->INCLUDEPATH + '\n';
		if(!conf->LIBS.isEmpty())
			str += "LIBS += " + conf->LIBS + '\n';
		if(!conf->extra.isEmpty())
			str += conf->extra;
		str += '\n';

		QByteArray cs = str.toLatin1();
		f.write(cs);
		f.close();
		success = true;
	}
	QString qmake_path = conf->qmake_path;
	QString qmakespec = conf->qmakespec;
	delete conf;

	if(!success)
		return 1;

	// run qmake on the project file
	QStringList args;
	if(!qmakespec.isEmpty())
	{
		args += "-spec";
		args += qmakespec;
	}
	args += proPath;
	int ret = qc_runprogram(qmake_path, args, 0, true);
	if(ret != 0)
		return 1;

	return 0;
}

EOT
cat >$1/conf4.pro <<EOT
CONFIG  += console
CONFIG  -= app_bundle
QT      -= gui
TARGET   = conf
DESTDIR  = \$\$PWD

HEADERS += conf4.h
SOURCES += conf4.cpp


DEFINES += HAVE_MODULES

EOT
}

export PREFIX
export BINDIR
export INCDIR
export LIBDIR
export DATADIR
export EX_QTDIR
export QC_STATIC
export QC_RELEASE
export QC_DEBUG
export QC_DEBUG_AND_RELEASE
export QC_NO_SEPARATE_DEBUG_INFO
export QC_SEPARATE_DEBUG_INFO
export QC_NO_FRAMEWORK
export QC_FRAMEWORK
export QC_UNIVERSAL
export QC_MAC_SDK
export QC_DISABLE_TESTS
export QC_CERTSTORE_PATH
export QC_CERTSTORE_INTERNAL
export QC_VERBOSE
rm -rf .qconftemp
(
	mkdir .qconftemp
	gen_files .qconftemp
	cd .qconftemp
	if [ ! -z "$qm_spec" ]; then
		$qm -spec $qm_spec conf4.pro >/dev/null
	else
		$qm conf4.pro >/dev/null
	fi
	$MAKE clean >/dev/null 2>&1
	$MAKE >../conf.log 2>&1
)

if [ "$?" != "0" ]; then
	rm -rf .qconftemp
	if [ "$QC_VERBOSE" = "Y" ]; then
		echo " -> fail"
	else
		echo "fail"
	fi
	printf "\n"
	printf "Reason: There was an error compiling 'conf'.  See conf.log for details.\n"
	printf "\n"
	show_qt_info
	if [ "$QC_VERBOSE" = "Y" ]; then
		echo "conf.log:"
		cat conf.log
	fi
	exit 1;
fi

QC_COMMAND=$0
export QC_COMMAND
QC_PROFILE=qca.pro
export QC_PROFILE
QC_QMAKE=$qm
export QC_QMAKE
QC_QMAKESPEC=$qm_spec
export QC_QMAKESPEC
QC_MAKETOOL=$MAKE
export QC_MAKETOOL
.qconftemp/conf
ret="$?"
if [ "$ret" = "1" ]; then
	rm -rf .qconftemp
	echo
	exit 1;
else
	if [ "$ret" != "0" ]; then
		rm -rf .qconftemp
		if [ "$QC_VERBOSE" = "Y" ]; then
			echo " -> fail"
		else
			echo "fail"
		fi
		echo
		echo "Reason: Unexpected error launching 'conf'"
		echo
		exit 1;
	fi
fi
rm -rf .qconftemp

echo
echo "Good, your configure finished.  Now run $MAKE."
echo
