📄 build.cpp
字号:
/** This file is part of QDevelop, an open-source cross-platform IDE* Copyright (C) 2006 Jean-Luc Biord** This program is free software; you can redistribute it and/or modify* it under the terms of the GNU General Public License as published by* the Free Software Foundation; either version 2 of the License, or* (at your option) any later version.** This program is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the* GNU General Public License for more details.** You should have received a copy of the GNU General Public License* along with this program; if not, write to the Free Software* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA** Contact e-mail: Jean-Luc Biord <jl.biord@free.fr>* Program URL : http://qdevelop.org**/#include "editor.h"#include "build.h"#include <QProcess>#include <QDebug>#include <QFileInfo>#include <QString>#include <QDir>#define QD qDebug() << __FILE__ << __LINE__ << ":"//Build::Build(QObject * parent, QString qmakeName, QString makeName, QString makeOptions, QString absoluteProjectName, bool qmake, bool n, bool g, QString compileFile) : QThread(parent){ connect(parent, SIGNAL(stopBuild()), this, SLOT(slotStopBuild()) ); m_isStopped = false; m_qmakeName = qmakeName; m_qmake = qmake; m_makeName = makeName; m_makeOptions = makeOptions; m_projectDirectory = QFileInfo(absoluteProjectName).absolutePath(); m_projectName = QFileInfo(absoluteProjectName).fileName(); m_clean = n; m_build = g; m_compileFile = compileFile; m_errors = 0; m_warnings = 0;}//void Build::slotIncErrors() { m_errors++; }//void Build::slotIncWarnings() { m_warnings++; }//void Build::run(){ QStringList list; m_buildProcess = new QProcess(); connect(m_buildProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(slotBuildMessages()) ); connect(m_buildProcess, SIGNAL(readyReadStandardError()), this, SLOT(slotBuildMessages()) ); m_buildProcess->setWorkingDirectory( m_projectDirectory ); if( m_qmake ) { emit message( QString(tr("Update project"))+" (qmake "+m_projectName+")..." );#ifdef Q_WS_MAC m_buildProcess->start(m_qmakeName, QStringList() <<"-spec"<< "macx-g++" << m_projectName);#else m_buildProcess->start(m_qmakeName, QStringList() << m_projectName);#endif if (!m_buildProcess->waitForFinished(800000)) { m_buildProcess->deleteLater(); return; } emit message( QString(m_buildProcess->readAll()) ); } if( m_clean ) { emit message( QString("\n"+tr("Clean Project")+" (make clean)...\n") ); m_buildProcess->start(m_makeName, QStringList("clean")); if (!m_buildProcess->waitForFinished(800000)) { m_buildProcess->deleteLater(); return; } emit message( QString(m_buildProcess->readAll()) ); } if( m_build ) { QString compilation = buildOnly(m_compileFile); if( !compilation.isEmpty() ) { m_buildProcess->start( compilation ); emit message( tr("\nCompilation of %1...\n").arg(m_compileFile) ); } else { emit message( QString("\n"+tr("Build")+" (make)...\n") ); m_buildProcess->start(m_makeName, QStringList() << m_makeOptions.split(" ", QString::SkipEmptyParts)); } if (!m_buildProcess->waitForFinished(800000)) { m_buildProcess->deleteLater(); return; } } emit message( QString(m_buildProcess->readAll()), m_projectDirectory); m_buildProcess->deleteLater();}//void Build::slotBuildMessages(){ emit message( QString::fromLocal8Bit(m_buildProcess->readAllStandardOutput()), m_projectDirectory ); emit message( QString::fromLocal8Bit(m_buildProcess->readAllStandardError()), m_projectDirectory );}//void Build::slotStopBuild(){ m_isStopped = true; emit message( QString("\n---------------------- "+tr("Build stopped")+" ----------------------\n") ); m_buildProcess->kill(); m_buildProcess->deleteLater();}//QString Build::buildOnly( QString sourceFile ){ if( sourceFile.isEmpty() ) return QString(); bool automaticCompilation = false; if( sourceFile.endsWith("-qdeveloptmp.cpp") ) { sourceFile = sourceFile.section("-qdeveloptmp.cpp",0 ,0)+".cpp"; automaticCompilation = true; } QString objectFile = sourceFile.mid(0, sourceFile.lastIndexOf("."))+".o";#ifndef WIN32 //QString name = QDir( m_projectDirectory ).relativeFilePath( sourceFile ); //return m_makeName+" "+ name.mid(0, name.lastIndexOf("."))+".o";#endif QString shortObjectFile = objectFile; if( !objectFile.section("/", -1, -1).isEmpty() ) shortObjectFile = shortObjectFile.section("/", -1, -1).section(".", 0, 0)+".o"; QString directives; QFile makefile(m_projectDirectory+"/"+"Makefile"); if (!makefile.open(QIODevice::ReadOnly | QIODevice::Text)) return QString(); QString target, makefileFile, CXX, DEFINES, CXXFLAGS, INCPATH; while (!makefile.atEnd()) { QString line = QString( makefile.readLine() ); // This block is for Windows where the Makefile include Makefile.Debug or Makefile.Release. // Not used under Linux if( line.section(" ", 0, 0).simplified() == "first:" && (line.section(" ", 1, 1).simplified()=="debug" || line.section(" ", 1, 1).simplified()=="release")) target = line.section(" ", 1, 1).simplified(); if( line.section("=", 0, 0).simplified() == "MAKEFILE" ) makefileFile = line.section("=", 1, 1).simplified(); if( !target.isEmpty() && line.section(":", 0, 0) == target ) { makefileFile = line.section(" ", 1, 1).simplified().replace("$(MAKEFILE)", makefileFile); makefile.close(); makefile.setFileName( m_projectDirectory+"/"+makefileFile ); if (!makefile.open(QIODevice::ReadOnly | QIODevice::Text)) return QString(); target = QString(); continue; } // Common block for Windows and Linux if( line.section("=", 0, 0).simplified() == "CXX" ) CXX = line.section("=", 1, 1).simplified(); if( line.section("=", 0, 0).simplified() == "DEFINES" ) DEFINES = line.section("=", 1, 1).simplified(); if( line.section("=", 0, 0).simplified() == "CXXFLAGS" ) CXXFLAGS = line.section("=", 1, 1).simplified().replace("$(DEFINES)", DEFINES); if( line.section("=", 0, 0).simplified() == "INCPATH" ) INCPATH = line.section("=", 1, 1).simplified(); if( line.section("-o ", 1, 1).section(" ", 0, 0).replace("\\", "/").simplified().right(shortObjectFile.length()) == shortObjectFile ) { line = line.simplified(); line = line.replace("$(CXX)", CXX); line = line.replace("$(CXXFLAGS)", CXXFLAGS); line = line.replace("$(INCPATH)", INCPATH); directives = line; break; } } if( automaticCompilation ) { QString s = sourceFile.section(".cpp", 0, 0).section("/", -1); directives.replace(s+".o", s+"-qdeveloptmp.o"); directives.replace(s+".cpp", s+"-qdeveloptmp.cpp"); } return directives;}//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -