📄 unixmake.cpp
字号:
/******************************************************************************** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved.**** This file is part of the qmake application of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file. Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://www.trolltech.com/products/qt/opensource.html**** If you are unsure which license is appropriate for your use, please** review the following information:** http://www.trolltech.com/products/qt/licensing.html or contact the** sales department at sales@trolltech.com.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "unixmake.h"#include "option.h"#include <qregexp.h>#include <qfile.h>#include <qhash.h>#include <qdir.h>#include <time.h>voidUnixMakefileGenerator::init(){ if(init_flag) return; init_flag = true; if(!project->isEmpty("QMAKE_FAILED_REQUIREMENTS")) /* no point */ return; QStringList &configs = project->variables()["CONFIG"]; //defaults if(project->isEmpty("ICON") && !project->isEmpty("RC_FILE")) project->variables()["ICON"] = project->variables()["RC_FILE"]; if(project->isEmpty("QMAKE_EXTENSION_SHLIB")) { if(project->isEmpty("QMAKE_CYGWIN_SHLIB")) { project->variables()["QMAKE_EXTENSION_SHLIB"].append("so"); } else { project->variables()["QMAKE_EXTENSION_SHLIB"].append("dll"); } } if(project->isEmpty("QMAKE_CFLAGS_PRECOMPILE")) project->variables()["QMAKE_CFLAGS_PRECOMPILE"].append("-x c-header -c"); if(project->isEmpty("QMAKE_CXXFLAGS_PRECOMPILE")) project->variables()["QMAKE_CXXFLAGS_PRECOMPILE"].append("-x c++-header -c"); if(project->isEmpty("QMAKE_CFLAGS_USE_PRECOMPILE")) project->variables()["QMAKE_CFLAGS_USE_PRECOMPILE"].append("-include"); if(project->isEmpty("QMAKE_EXTENSION_PLUGIN")) project->variables()["QMAKE_EXTENSION_PLUGIN"].append(project->first("QMAKE_EXTENSION_SHLIB")); if(project->isEmpty("QMAKE_COPY_FILE")) project->variables()["QMAKE_COPY_FILE"].append("$(COPY)"); if(project->isEmpty("QMAKE_COPY_DIR")) project->variables()["QMAKE_COPY_DIR"].append("$(COPY) -R"); if(project->isEmpty("QMAKE_INSTALL_FILE")) project->variables()["QMAKE_INSTALL_FILE"].append("$(COPY_FILE)"); if(project->isEmpty("QMAKE_INSTALL_DIR")) project->variables()["QMAKE_INSTALL_DIR"].append("$(COPY_DIR)"); if(project->isEmpty("QMAKE_LIBTOOL")) project->variables()["QMAKE_LIBTOOL"].append("libtool --silent"); if(project->isEmpty("QMAKE_SYMBOLIC_LINK")) project->variables()["QMAKE_SYMBOLIC_LINK"].append("ln -sf"); /* this should probably not be here, but I'm using it to wrap the .t files */ if(project->first("TEMPLATE") == "app") project->variables()["QMAKE_APP_FLAG"].append("1"); else if(project->first("TEMPLATE") == "lib") project->variables()["QMAKE_LIB_FLAG"].append("1"); else if(project->first("TEMPLATE") == "subdirs") { MakefileGenerator::init(); if(project->isEmpty("MAKEFILE")) project->variables()["MAKEFILE"].append("Makefile"); if(project->isEmpty("QMAKE_QMAKE")) project->variables()["QMAKE_QMAKE"].append("qmake"); if(project->variables()["QMAKE_INTERNAL_QMAKE_DEPS"].indexOf("qmake_all") == -1) project->variables()["QMAKE_INTERNAL_QMAKE_DEPS"].append("qmake_all"); return; /* subdirs is done */ } //If the TARGET looks like a path split it into DESTDIR and the resulting TARGET if(!project->isEmpty("TARGET")) { QString targ = project->first("TARGET"); int slsh = qMax(targ.lastIndexOf('/'), targ.lastIndexOf(Option::dir_sep)); if(slsh != -1) { if(project->isEmpty("DESTDIR")) project->values("DESTDIR").append(""); else if(project->first("DESTDIR").right(1) != Option::dir_sep) project->variables()["DESTDIR"] = QStringList(project->first("DESTDIR") + Option::dir_sep); project->variables()["DESTDIR"] = QStringList(project->first("DESTDIR") + targ.left(slsh+1)); project->variables()["TARGET"] = QStringList(targ.mid(slsh+1)); } } project->variables()["QMAKE_ORIG_TARGET"] = project->variables()["TARGET"]; project->variables()["QMAKE_ORIG_DESTDIR"] = project->variables()["DESTDIR"]; project->variables()["QMAKE_LIBS"] += project->variables()["LIBS"]; if((!project->isEmpty("QMAKE_LIB_FLAG") && !project->isActiveConfig("staticlib")) || (project->isActiveConfig("qt") && project->isActiveConfig("plugin"))) { if(configs.indexOf("dll") == -1) configs.append("dll"); } else if(!project->isEmpty("QMAKE_APP_FLAG") || project->isActiveConfig("dll")) { configs.removeAll("staticlib"); } if(!project->isEmpty("QMAKE_INCREMENTAL")) project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_INCREMENTAL"]; else if(!project->isEmpty("QMAKE_LFLAGS_PREBIND") && !project->variables()["QMAKE_LIB_FLAG"].isEmpty() && project->isActiveConfig("dll")) project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_PREBIND"]; if(!project->isEmpty("QMAKE_INCDIR")) project->variables()["INCLUDEPATH"] += project->variables()["QMAKE_INCDIR"]; if(!project->isEmpty("QMAKE_LIBDIR")) { const QStringList &libdirs = project->values("QMAKE_LIBDIR"); for(QStringList::ConstIterator it = libdirs.begin(); it != libdirs.end(); ++it) { if(!project->isEmpty("QMAKE_LFLAGS_RPATH") && project->isActiveConfig("rpath_libdirs")) project->variables()["QMAKE_LFLAGS"] += var("QMAKE_LFLAGS_RPATH") + (*it); project->variables()["QMAKE_LIBDIR_FLAGS"] += "-L" + (*it); } } if(project->isActiveConfig("macx") && !project->isEmpty("QMAKE_FRAMEWORKDIR")) { const QStringList &fwdirs = project->values("QMAKE_FRAMEWORKDIR"); for(QStringList::ConstIterator it = fwdirs.begin(); it != fwdirs.end(); ++it) { project->variables()["QMAKE_FRAMEWORKDIR_FLAGS"] += "-F" + (*it); } } if(!project->isEmpty("QMAKE_RPATHDIR")) { const QStringList &rpathdirs = project->values("QMAKE_RPATHDIR"); for(QStringList::ConstIterator it = rpathdirs.begin(); it != rpathdirs.end(); ++it) { if(!project->isEmpty("QMAKE_LFLAGS_RPATH")) project->variables()["QMAKE_LFLAGS"] += var("QMAKE_LFLAGS_RPATH") + QFileInfo((*it)).absoluteFilePath(); } } QString compile_flag = var("QMAKE_COMPILE_FLAG"); if(compile_flag.isEmpty()) compile_flag = "-c"; if(doPrecompiledHeaders() && !project->isEmpty("PRECOMPILED_HEADER")) { QString prefix_flags = project->first("QMAKE_CFLAGS_PREFIX_INCLUDE"); if(prefix_flags.isEmpty()) prefix_flags = "-include"; QString includename; if(!project->isEmpty("OBJECTS_DIR")) { includename = Option::fixPathToTargetOS(project->first("OBJECTS_DIR")); if(!includename.endsWith(Option::dir_sep)) includename += Option::dir_sep; } includename += project->first("QMAKE_ORIG_TARGET"); compile_flag += " " + prefix_flags + " " + includename; } if(project->isEmpty("QMAKE_RUN_CC")) project->variables()["QMAKE_RUN_CC"].append("$(CC) " + compile_flag + " $(CFLAGS) $(INCPATH) -o $obj $src"); if(project->isEmpty("QMAKE_RUN_CC_IMP")) project->variables()["QMAKE_RUN_CC_IMP"].append("$(CC) " + compile_flag + " $(CFLAGS) $(INCPATH) -o $@ $<"); if(project->isEmpty("QMAKE_RUN_CXX")) project->variables()["QMAKE_RUN_CXX"].append("$(CXX) " + compile_flag + " $(CXXFLAGS) $(INCPATH) -o $obj $src"); if(project->isEmpty("QMAKE_RUN_CXX_IMP")) project->variables()["QMAKE_RUN_CXX_IMP"].append("$(CXX) " + compile_flag + " $(CXXFLAGS) $(INCPATH) -o $@ $<"); project->variables()["QMAKE_FILETAGS"] << "SOURCES" << "GENERATED_SOURCES" << "TARGET" << "DESTDIR"; if(!project->isEmpty("QMAKE_EXTRA_COMPILERS")) { const QStringList &quc = project->variables()["QMAKE_EXTRA_COMPILERS"]; for(QStringList::ConstIterator it = quc.begin(); it != quc.end(); ++it) project->variables()["QMAKE_FILETAGS"] += project->variables()[(*it)+".input"]; } if(project->isActiveConfig("GNUmake") && !project->isEmpty("QMAKE_CFLAGS_DEPS")) include_deps = true; //do not generate deps if(project->isActiveConfig("compile_libtool")) Option::obj_ext = ".lo"; //override the .o MakefileGenerator::init(); if(project->isActiveConfig("macx") && !project->isEmpty("TARGET") && !project->isActiveConfig("compile_libtool") && ((project->first("TEMPLATE") == "app" && project->isActiveConfig("app_bundle")) || (project->first("TEMPLATE") == "lib" && project->isActiveConfig("lib_bundle") && !project->isActiveConfig("staticlib") && !project->isActiveConfig("plugin"))) && (project->isActiveConfig("build_pass") || project->isEmpty("BUILDS"))) { if(project->first("TEMPLATE") == "app") { QString bundle = project->first("TARGET"); if(!project->isEmpty("QMAKE_APPLICATION_BUNDLE_NAME")) bundle = project->first("QMAKE_APPLICATION_BUNDLE_NAME"); if(!bundle.endsWith(".app")) bundle += ".app"; project->variables()["QMAKE_BUNDLE_NAME"] = QStringList(bundle); project->variables()["QMAKE_PKGINFO"].append(project->first("DESTDIR") + bundle + "/Contents/PkgInfo"); project->variables()["ALL_DEPS"] += project->first("QMAKE_PKGINFO"); } else if(project->first("TEMPLATE") == "lib") { QString bundle = project->first("TARGET"); if(!project->isEmpty("QMAKE_FRAMEWORK_BUNDLE_NAME")) bundle = project->first("QMAKE_FRAMEWORK_BUNDLE_NAME"); if(!bundle.endsWith(".framework")) bundle += ".framework"; project->variables()["QMAKE_BUNDLE_NAME"] = QStringList(bundle); } } else { //no bundling here project->variables()["QMAKE_BUNDLE_NAME"].clear(); } if(!project->isEmpty("QMAKE_INTERNAL_INCLUDED_FILES")) project->variables()["DISTFILES"] += project->variables()["QMAKE_INTERNAL_INCLUDED_FILES"]; project->variables()["DISTFILES"] += project->projectFile(); init2(); project->variables()["QMAKE_INTERNAL_PRL_LIBS"] << "QMAKE_LIBDIR_FLAGS" << "QMAKE_FRAMEWORKDIR_FLAG" << "QMAKE_LIBS"; if(!project->isEmpty("QMAKE_MAX_FILES_PER_AR")) { bool ok; int max_files = project->first("QMAKE_MAX_FILES_PER_AR").toInt(&ok); QStringList ar_sublibs, objs = project->variables()["OBJECTS"]; if(ok && max_files > 5 && max_files < (int)objs.count()) { int obj_cnt = 0, lib_cnt = 0; QString lib; for(QStringList::Iterator objit = objs.begin(); objit != objs.end(); ++objit) { if((++obj_cnt) >= max_files) { if(lib_cnt) { lib.sprintf("lib%s-tmp%d.a", project->first("QMAKE_ORIG_TARGET").toLatin1().constData(), lib_cnt); ar_sublibs << lib; obj_cnt = 0; } lib_cnt++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -