📄 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>
void
UnixMakefileGenerator::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 + -