/*
-----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 (mac only).
arg: no-separate-debug-info,Do not store debug information in a separate file (default for mac).
arg: separate-debug-info,Strip debug information into a separate .debug file (default for non-mac).
arg: no-framework,Do not build as a Mac framework.
arg: framework,Build as a Mac framework (default).
-----END QCMOD-----
*/

#define QC_BUILDMODE
bool qc_buildmode_release = false;
bool qc_buildmode_debug = false;
bool qc_buildmode_framework = 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_framework = false;
		bool opt_framework = 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_FRAMEWORK") == "Y")
			opt_no_framework = true;
		if(conf->getenv("QC_FRAMEWORK") == "Y")
			opt_framework = 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;

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

#ifndef Q_OS_MAC
		if(opt_debug_and_release)
		{
			printf("\nError: The --debug-and-release option is for mac only.\n");
			exit(1);
		}

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

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

		// 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);
		}

		// 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);
		}

		// 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_framework)
			qc_buildmode_framework = true;
		else if(opt_no_framework)
		{
			// nothing to do
		}
		else // default
		{
			if(!staticmode && !opt_debug)
				qc_buildmode_framework = true;
		}

		if(opt_separate_debug_info)
			qc_buildmode_separate_debug_info = true;
		else if(opt_no_separate_debug_info)
		{
			// nothing to do
		}
		else // default
		{
#ifndef 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";

#ifdef Q_OS_MAC
		if(qc_buildmode_framework)
			opts += "lib_bundle";
#endif

		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;
	}
};
