⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unixmake2.cpp

📁 Linux下的基于X11的图形开发环境。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/****************************************************************************** $Id: qt/unixmake2.cpp   3.1.1   edited Nov 20 00:34 $**** Definition of ________ class.**** Created : 970521**** Copyright (C) 1992-2002 Trolltech AS.  All rights reserved.**** This file is part of the network module of the Qt GUI Toolkit.**** This file may be distributed under the terms of the Q Public License** as defined by Trolltech AS of Norway and appearing in the file** LICENSE.QPL included in the packaging of this file.**** This file may be distributed and/or modified under the terms of the** GNU General Public License version 2 as published by the Free Software** Foundation and appearing in the file LICENSE.GPL included in the** packaging of this file.**** Licensees holding valid Qt Enterprise Edition licenses may use this** file in accordance with the Qt Commercial License Agreement provided** with the Software.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.**** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for**   information about Qt Commercial License Agreements.** See http://www.trolltech.com/qpl/ for QPL licensing information.** See http://www.trolltech.com/gpl/ for GPL licensing information.**** Contact info@trolltech.com if any conditions of this licensing are** not clear to you.************************************************************************/#include "unixmake.h"#include "option.h"#include <qregexp.h>#include <qfile.h>#include <qdir.h>#include <time.h>UnixMakefileGenerator::UnixMakefileGenerator(QMakeProject *p) : MakefileGenerator(p), init_flag(FALSE), include_deps(FALSE){}boolUnixMakefileGenerator::writeMakefile(QTextStream &t){    writeHeader(t);    if(!project->variables()["QMAKE_FAILED_REQUIREMENTS"].isEmpty()) {	t << "all clean:" << "\n\t"	  << "@echo \"Some of the required modules ("	  << var("QMAKE_FAILED_REQUIREMENTS") << ") are not available.\"" << "\n\t"	  << "@echo \"Skipped.\"" << endl << endl;	writeMakeQmake(t);	return TRUE;    }    if (project->variables()["TEMPLATE"].first() == "app" ||	project->variables()["TEMPLATE"].first() == "lib") {	writeMakeParts(t);	return MakefileGenerator::writeMakefile(t);    } else if(project->variables()["TEMPLATE"].first() == "subdirs") {	writeSubdirs(t);	return TRUE;    }    return FALSE;}voidUnixMakefileGenerator::writeMakeParts(QTextStream &t){    QString deps = fileFixify(Option::output.name()), prl;    bool do_incremental = (project->isActiveConfig("incremental") &&			   !project->variables()["QMAKE_INCREMENTAL"].isEmpty() &&			   (!project->variables()["QMAKE_APP_FLAG"].isEmpty() ||			    !project->isActiveConfig("staticlib"))), 	 src_incremental=FALSE, moc_incremental=FALSE;    t << "####### Compiler, tools and options" << endl << endl;    t << "CC       = ";    if (project->isActiveConfig("thread") &&	! project->variables()["QMAKE_CC_THREAD"].isEmpty())	t << var("QMAKE_CC_THREAD") << endl;    else	t << var("QMAKE_CC") << endl;    t << "CXX      = ";    if (project->isActiveConfig("thread") &&	! project->variables()["QMAKE_CXX_THREAD"].isEmpty())	t << var("QMAKE_CXX_THREAD") << endl;    else	t << var("QMAKE_CXX") << endl;    t << "LEX      = " << var("QMAKE_LEX") << endl;    t << "YACC     = " << var("QMAKE_YACC") << endl;    t << "CFLAGS   = " << var("QMAKE_CFLAGS") << " "      << varGlue("PRL_EXPORT_DEFINES","-D"," -D","") << " "      << varGlue("DEFINES","-D"," -D","") << endl;    t << "CXXFLAGS = " << var("QMAKE_CXXFLAGS") << " "      << varGlue("PRL_EXPORT_DEFINES","-D"," -D","") << " "      << varGlue("DEFINES","-D"," -D","") << endl;    t << "LEXFLAGS = " << var("QMAKE_LEXFLAGS") << endl;    t << "YACCFLAGS= " << var("QMAKE_YACCFLAGS") << endl;    t << "INCPATH  = " << "-I" << specdir();    {	QString pwd = fileFixify(QDir::currentDirPath());	if(pwd.isEmpty())	    pwd = ".";	t << " -I" << pwd;    }    t << varGlue("INCLUDEPATH"," -I", " -I", "") << endl;    if(!project->isActiveConfig("staticlib")) {	t << "LINK     = ";	if (project->isActiveConfig("thread") &&	    ! project->variables()["QMAKE_LINK_THREAD"].isEmpty())	    t << var("QMAKE_LINK_THREAD") << endl;	else	    t << var("QMAKE_LINK") << endl;	t << "LFLAGS   = " << var("QMAKE_LFLAGS") << endl;	t << "LIBS     = " << "$(SUBLIBS) " << var("QMAKE_LIBDIR_FLAGS") << " " << var("QMAKE_LIBS") << endl;    }    t << "AR       = " << var("QMAKE_AR") << endl;    t << "RANLIB   = " << var("QMAKE_RANLIB") << endl;    t << "MOC      = " << var("QMAKE_MOC") << endl;    t << "UIC      = "	<< var("QMAKE_UIC") << endl;    t << "QMAKE    = "	<< (project->isEmpty("QMAKE_QMAKE") ? QString("qmake") : var("QMAKE_QMAKE")) << endl;    t << "TAR      = "	<< var("QMAKE_TAR") << endl;    t << "GZIP     = " << var("QMAKE_GZIP") << endl;    t << "COPY     = " << var("QMAKE_COPY") << endl;    t << "COPY_FILE= " << var("QMAKE_COPY_FILE") << endl;    t << "COPY_DIR = " << var("QMAKE_COPY_DIR") << endl;    t << "DEL_FILE = " << var("QMAKE_DEL_FILE") << endl;    t << "SYMLINK  = " << var("QMAKE_SYMBOLIC_LINK") << endl;    t << "DEL_DIR  = " << var("QMAKE_DEL_DIR") << endl;    t << "MOVE     = " << var("QMAKE_MOVE") << endl;    t << "CHK_DIR_EXISTS= " << var("QMAKE_CHK_DIR_EXISTS") << endl;    t << "MKDIR    = " << var("QMAKE_MKDIR") << endl;    t << endl;    t << "####### Output directory" << endl << endl;    if (! project->variables()["OBJECTS_DIR"].isEmpty())	t << "OBJECTS_DIR = " << var("OBJECTS_DIR") << endl;    else	t << "OBJECTS_DIR = ./" << endl;    t << endl;    /* files */    t << "####### Files" << endl << endl;    t << "HEADERS = " << varList("HEADERS") << endl;    t << "SOURCES = " << varList("SOURCES") << endl;    if(do_incremental) {	QStringList &objs = project->variables()["OBJECTS"], &incrs = project->variables()["QMAKE_INCREMENTAL"], incrs_out;	t << "OBJECTS = ";	for(QStringList::Iterator objit = objs.begin(); objit != objs.end(); ++objit) {	    bool increment = FALSE;	    for(QStringList::Iterator incrit = incrs.begin(); incrit != incrs.end(); ++incrit) {		if((*objit).find(QRegExp((*incrit), TRUE, TRUE)) != -1) {		    increment = TRUE;		    incrs_out.append((*objit));		    break;		}	    }	    if(!increment)		t << "\\\n\t\t" << (*objit);	}	if(incrs_out.count() == objs.count()) { //we just switched places, no real incrementals to be done!	    t << incrs_out.join(" \\\n\t\t") << endl;	} else if(!incrs_out.count()) {	    t << endl;	} else {	    src_incremental = TRUE;	    t << endl;	    t << "INCREMENTAL_OBJECTS = " << incrs_out.join(" \\\n\t\t") << endl;	}    } else {	t << "OBJECTS = " << varList("OBJECTS") << endl;    }    t << "FORMS = " << varList("FORMS") << endl;    t << "UICDECLS = " << varList("UICDECLS") << endl;    t << "UICIMPLS = " << varList("UICIMPLS") << endl;    QString srcMoc = varList("SRCMOC"), objMoc = varList("OBJMOC");    t << "SRCMOC   = " << srcMoc << endl;    if(do_incremental) {	QStringList &objs = project->variables()["OBJMOC"],		   &incrs = project->variables()["QMAKE_INCREMENTAL"], incrs_out;	t << "OBJMOC = ";	for(QStringList::Iterator objit = objs.begin(); objit != objs.end(); ++objit) {	    bool increment = FALSE;	    for(QStringList::Iterator incrit = incrs.begin(); incrit != incrs.end(); ++incrit) {		if((*objit).find(QRegExp((*incrit), TRUE, TRUE)) != -1) {		    increment = TRUE;		    incrs_out.append((*objit));		    break;		}	    }	    if(!increment)		t << "\\\n\t\t" << (*objit);	}	if(incrs_out.count() == objs.count()) { //we just switched places, no real incrementals to be done!	    t << incrs_out.join(" \\\n\t\t") << endl;	} else if(!incrs_out.count()) {	    t << endl;	} else {	    moc_incremental = TRUE;	    t << endl;	    t << "INCREMENTAL_OBJMOC = " << incrs_out.join(" \\\n\t\t") << endl;	}    } else {	t << "OBJMOC = " << objMoc << endl;    }    if(do_incremental && !moc_incremental && !src_incremental)	do_incremental = FALSE;    t << "DIST	   = " << valList(fileFixify(project->variables()["DISTFILES"])) << endl;    t << "QMAKE_TARGET = " << var("QMAKE_ORIG_TARGET") << endl;    t << "DESTDIR  = " << var("DESTDIR") << endl;    t << "TARGET   = " << var("TARGET") << endl;    if(project->isActiveConfig("plugin") ) {	t << "TARGETD   = " << var("TARGET") << endl;    } else if (!project->isActiveConfig("staticlib") && project->variables()["QMAKE_APP_FLAG"].isEmpty()) {	t << "TARGETA	= " << var("TARGETA") << endl;	if (project->isEmpty("QMAKE_HPUX_SHLIB")) {	    t << "TARGETD	= " << var("TARGET_x.y.z") << endl;	    t << "TARGET0	= " << var("TARGET_") << endl;	    t << "TARGET1	= " << var("TARGET_x") << endl;	    t << "TARGET2	= " << var("TARGET_x.y") << endl;	} else {	    t << "TARGETD	= " << var("TARGET_x") << endl;	    t << "TARGET0	= " << var("TARGET_") << endl;	}    }    t << endl;    // blasted incldues    QStringList &qeui = project->variables()["QMAKE_EXTRA_UNIX_INCLUDES"];    QStringList::Iterator it;    for( it = qeui.begin(); it != qeui.end(); ++it)	t << "include " << (*it) << endl;    /* rules */    t << "first: all" << endl;    t << "####### Implicit rules" << endl << endl;    t << ".SUFFIXES: .c";    QStringList::Iterator cppit;    for(cppit = Option::cpp_ext.begin(); cppit != Option::cpp_ext.end(); ++cppit)	t << " " << (*cppit);    t << endl << endl;    for(cppit = Option::cpp_ext.begin(); cppit != Option::cpp_ext.end(); ++cppit)	t << (*cppit) << ".o:\n\t" << var("QMAKE_RUN_CXX_IMP") << endl << endl;    t << ".c.o:\n\t" << var("QMAKE_RUN_CC_IMP") << endl << endl;    if(include_deps) {	QString cmd=var("QMAKE_CFLAGS_DEPS") + " ";	cmd += varGlue("DEFINES","-D"," -D","") + varGlue("PRL_EXPORT_DEFINES"," -D"," -D","");	if(!project->isEmpty("QMAKE_ABSOLUTE_SOURCE_PATH"))	    cmd += " -I" + project->first("QMAKE_ABSOLUTE_SOURCE_PATH") + " ";	cmd += " $(INCPATH) " + varGlue("DEPENDPATH", "-I", " -I", "");	QString odir;	if(!project->variables()["OBJECTS_DIR"].isEmpty())	    odir = project->first("OBJECTS_DIR");	t << "###### Dependencies" << endl << endl;	t << odir << ".deps/%.d: %.cpp\n\t"	  << "@echo Creating depend for $<" << "\n\t"	  << "@test -d $(@D) || mkdir -p $(@D)" << "\n\t"	  << "@$(CXX) " << cmd << " $< | sed \"s,^\\($(*F).o\\):," << odir << "\\1:,g\" >$@" << endl << endl;	t << odir << ".deps/%.d: %.c\n\t"	  << "@echo Creating depend for $<" << "\n\t"	  << "@test -d $(@D) || mkdir -p $(@D)" << "\n\t"	  << "@$(CC) " << cmd << " $< | sed \"s,^\\($(*F).o\\):," << odir << "\\1:,g\" >$@" << endl << endl;	QString src[] = { "SOURCES", "UICIMPLS", "SRCMOC", QString::null };	for(int x = 0; !src[x].isNull(); x++) {	    QStringList &l = project->variables()[src[x]];	    for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {		if(!(*it).isEmpty()) {		    QString d_file;		    if((*it).endsWith(".c")) {			d_file = (*it).left((*it).length() - 2);		    } else {			for(QStringList::Iterator cppit = Option::cpp_ext.begin();			    cppit != Option::cpp_ext.end(); ++cppit) {			    if((*it).endsWith((*cppit))) {				d_file = (*it).left((*it).length() - (*cppit).length());				break;			    }			}		    }		    if(!d_file.isEmpty()) {			d_file = odir + ".deps/" + d_file + ".d";			QStringList deps = findDependencies((*it)).grep(QRegExp(Option::moc_ext + "$"));			if(!deps.isEmpty())			    t << d_file << ": " << deps.join(" ") << endl;			t << "-include " << d_file << endl;		    }		}	    }	}    }    t << "####### Build rules" << endl << endl;    if(!project->variables()["SUBLIBS"].isEmpty()) {	QString libdir = "tmp/";	if(!project->isEmpty("SUBLIBS_DIR"))	    libdir = project->first("SUBLIBS_DIR");	t << "SUBLIBS= ";	QStringList &l = project->variables()["SUBLIBS"];	for(QStringList::Iterator it = l.begin(); it != l.end(); ++it)	    t << libdir << "lib" << (*it) << ".a ";	t << endl << endl;    }    if(project->isActiveConfig("depend_prl") && !project->isEmpty("QMAKE_PRL_INTERNAL_FILES")) {	QStringList &l = project->variables()["QMAKE_PRL_INTERNAL_FILES"];	QStringList::Iterator it;	for(it = l.begin(); it != l.end(); ++it) {	    QMakeProject proj;	    if(proj.read((*it), QDir::currentDirPath()) && !proj.isEmpty("QMAKE_PRL_BUILD_DIR")) {		QString dir;		int slsh = (*it).findRev(Option::dir_sep);		if(slsh != -1)		    dir = (*it).left(slsh + 1);		QString targ = dir + proj.first("QMAKE_PRL_TARGET");		deps += " " + targ;		t << targ << ":" << "\n\t"		  << "@echo \"Creating '" << targ << "'\"" << "\n\t"		  << "(cd " << proj.first("QMAKE_PRL_BUILD_DIR") << ";"		  << "$(MAKE) )" << endl;	    }	}    }    if(!project->variables()["QMAKE_APP_FLAG"].isEmpty()) {	QString destdir = project->first("DESTDIR");	if(do_incremental) {	    //incremental target	    QString incr_target = var("TARGET") + "_incremental";	    if(incr_target.find(Option::dir_sep) != -1)		incr_target = incr_target.right(incr_target.length() -						(incr_target.findRev(Option::dir_sep) + 1));	    QString incr_deps, incr_objs;	    if(project->first("QMAKE_INCREMENTAL_STYLE") == "ld") {		QString incr_target_dir = var("OBJECTS_DIR") + incr_target + Option::obj_ext;		//actual target		t << incr_target_dir << ": $(OBJECTS)" << "\n\t"		  << "ld -r  -o "<< incr_target_dir << " $(OBJECTS)" << endl;		//communicated below		deps.prepend(incr_target_dir + " ");		incr_deps = "$(UICDECLS) $(INCREMENTAL_OBJECTS) $(INCREMENTAL_OBJMOC) $(OBJMOC)";		if(!incr_objs.isEmpty())		    incr_objs += " ";		incr_objs += incr_target_dir;	    } else {		//actual target		QString incr_target_dir = var("DESTDIR") + "lib" + incr_target + "." +					  project->variables()["QMAKE_EXTENSION_SHLIB"].first();		QString incr_lflags = var("QMAKE_LFLAGS_SHLIB") + " ";		if(project->isActiveConfig("debug"))		    incr_lflags += var("QMAKE_LFLAGS_DEBUG");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -