From 00f9ac93c248b019e72757da9c5d8121a5fd1bf5 Mon Sep 17 00:00:00 2001 From: Bjoern Breitmeyer Date: Fri, 11 May 2012 10:24:28 +0200 Subject: Fixed Wince Makefile environment Integrated the checksdk tool into qmake and made the makefiles selfcontained, so configure make, is now enough to build qt for wince Change-Id: I29076702eca2ec23d4d06bb3d5c5cef9d4f95161 Reviewed-by: Oswald Buddenhagen --- qmake/Makefile.unix | 7 +- qmake/Makefile.win32 | 2 +- qmake/Makefile.win32-g++ | 3 +- qmake/generators/win32/cesdkhandler.cpp | 127 ++++++++++++++++++++++++++++++++ qmake/generators/win32/cesdkhandler.h | 94 +++++++++++++++++++++++ qmake/generators/win32/msvc_nmake.cpp | 25 +++++++ qmake/qmake.pri | 6 +- 7 files changed, 258 insertions(+), 6 deletions(-) create mode 100644 qmake/generators/win32/cesdkhandler.cpp create mode 100644 qmake/generators/win32/cesdkhandler.h diff --git a/qmake/Makefile.unix b/qmake/Makefile.unix index ad430e2930..b1df49aab3 100644 --- a/qmake/Makefile.unix +++ b/qmake/Makefile.unix @@ -13,7 +13,7 @@ OBJS=project.o property.o main.o makefile.o unixmake2.o unixmake.o \ mingw_make.o option.o winmakefile.o projectgenerator.o \ meta.o makefiledeps.o metamakefile.o xmloutput.o pbuilder_pbx.o \ borland_bmake.o msvc_vcproj.o msvc_vcxproj.o msvc_nmake.o msvc_objectmodel.o msbuild_objectmodel.o \ - gbuild.o + gbuild.o cesdkhandler.o #qt code QOBJS=qtextcodec.o qutfcodec.o qstring.o qstringbuilder.o qtextstream.o qiodevice.o qmalloc.o qglobal.o \ @@ -36,7 +36,7 @@ DEPEND_SRC=project.cpp property.cpp meta.cpp main.cpp generators/makefile.cpp ge generators/mac/pbuilder_pbx.cpp generators/mac/xmloutput.cpp generators/metamakefile.cpp \ generators/makefiledeps.cpp option.cpp generators/win32/mingw_make.cpp generators/makefile.cpp \ generators/win32/msvc_vcproj.cpp generators/win32/msvc_vcxproj.cpp generators/win32/msvc_objectmodel.cpp generators/win32/msbuild_objectmodel.cpp generators/win32/msbuild_objectmodel.cpp generators/win32/msvc_nmake.cpp generators/win32/borland_bmake.cpp \ - generators/integrity/gbuild.cpp \ + generators/integrity/gbuild.cpp generators/win32/cesdkhandler.cpp \ $(SOURCE_PATH)/src/corelib/codecs/qtextcodec.cpp $(SOURCE_PATH)/src/corelib/codecs/qutfcodec.cpp \ $(SOURCE_PATH)/src/corelib/tools/qstring.cpp $(SOURCE_PATH)/src/corelib/io/qfile.cpp \ $(SOURCE_PATH)/src/corelib/io/qfiledevice.cpp \ @@ -160,6 +160,9 @@ msvc_vcxproj.o: $(QMKSRC)/generators/win32/msvc_vcxproj.cpp msvc_nmake.o: $(QMKSRC)/generators/win32/msvc_nmake.cpp $(CXX) -c -o $@ $(CXXFLAGS) $< +cesdkhandler.o: $(QMKSRC)/generators/win32/cesdkhandler.cpp + $(CXX) -c -o $@ $(CXXFLAGS) $< + pbuilder_pbx.o: $(QMKSRC)/generators/mac/pbuilder_pbx.cpp $(CXX) -c -o $@ $(CXXFLAGS) $< diff --git a/qmake/Makefile.win32 b/qmake/Makefile.win32 index 029546f69d..ad6d4448d7 100644 --- a/qmake/Makefile.win32 +++ b/qmake/Makefile.win32 @@ -61,7 +61,7 @@ OBJS = project.obj main.obj makefile.obj unixmake.obj unixmake2.obj mingw makefiledeps.obj metamakefile.obj xmloutput.obj pbuilder_pbx.obj \ borland_bmake.obj msvc_nmake.obj msvc_vcproj.obj msvc_vcxproj.obj \ msvc_objectmodel.obj msbuild_objectmodel.obj registry.obj \ - gbuild.obj + gbuild.obj cesdkhandler.obj !IFDEF QMAKE_OPENSOURCE_EDITION CFLAGS = $(CFLAGS) -DQMAKE_OPENSOURCE_EDITION diff --git a/qmake/Makefile.win32-g++ b/qmake/Makefile.win32-g++ index 1966a8bbbc..d06d958ca3 100644 --- a/qmake/Makefile.win32-g++ +++ b/qmake/Makefile.win32-g++ @@ -64,7 +64,8 @@ OBJS = project.o main.o makefile.o unixmake.o unixmake2.o mingw_make.o \ option.o winmakefile.o projectgenerator.o property.o meta.o \ makefiledeps.o metamakefile.o xmloutput.o pbuilder_pbx.o \ borland_bmake.o msvc_nmake.o msvc_vcproj.o msvc_vcxproj.o \ - msvc_objectmodel.o msbuild_objectmodel.o registry.o gbuild.o + msvc_objectmodel.o msbuild_objectmodel.o registry.o gbuild.o \ + cesdkhandler.o ifdef QMAKE_OPENSOURCE_EDITION CFLAGS += -DQMAKE_OPENSOURCE_EDITION diff --git a/qmake/generators/win32/cesdkhandler.cpp b/qmake/generators/win32/cesdkhandler.cpp new file mode 100644 index 0000000000..de6a55112b --- /dev/null +++ b/qmake/generators/win32/cesdkhandler.cpp @@ -0,0 +1,127 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/ +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.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 the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "cesdkhandler.h" + +#include +#include +#include + +QT_BEGIN_NAMESPACE + +CeSdkInfo::CeSdkInfo() : m_major(0) , m_minor(0) +{ +} + +CeSdkHandler::CeSdkHandler() +{ +} + +bool CeSdkHandler::parse() +{ + // look at the file at %VCInstallDir%/vcpackages/WCE.VCPlatform.config + // and scan through all installed sdks... + m_list.clear(); + m_vcInstallDir = QString::fromLatin1(qgetenv("VCInstallDir")); + if (m_vcInstallDir.isEmpty()) + return false; + + QDir vStudioDir(m_vcInstallDir); + if (!vStudioDir.cd(QLatin1String("vcpackages"))) + return false; + + QFile configFile(vStudioDir.absoluteFilePath(QLatin1String("WCE.VCPlatform.config"))); + if (!configFile.open(QIODevice::ReadOnly)) + return false; + + QString currentElement; + CeSdkInfo currentItem; + QXmlStreamReader xml(&configFile); + while (!xml.atEnd()) { + xml.readNext(); + if (xml.isStartElement()) { + currentElement = xml.name().toString(); + if (currentElement == QLatin1String("Platform")) { + currentItem = CeSdkInfo(); + } else if (currentElement == QLatin1String("Directories")) { + QXmlStreamAttributes attr = xml.attributes(); + currentItem.m_include = fixPaths(attr.value(QLatin1String("Include")).toString()); + currentItem.m_lib = fixPaths(attr.value(QLatin1String("Library")).toString()); + currentItem.m_bin = fixPaths(attr.value(QLatin1String("Path")).toString()); + } + } else if (xml.isEndElement()) { + if (xml.name().toString() == QLatin1String("Platform")) + m_list.append(currentItem); + } else if (xml.isCharacters() && !xml.isWhitespace()) { + if (currentElement == QLatin1String("PlatformName")) + currentItem.m_name = xml.text().toString(); + else if (currentElement == QLatin1String("OSMajorVersion")) + currentItem.m_major = xml.text().toString().toInt(); + else if (currentElement == QLatin1String("OSMinorVersion")) + currentItem.m_minor = xml.text().toString().toInt(); + } + } + + if (xml.error() && xml.error() != QXmlStreamReader::PrematureEndOfDocumentError) { + qWarning() << "XML ERROR:" << xml.lineNumber() << ": " << xml.errorString(); + return false; + } + + return m_list.size() > 0 ? true : false; +} + +QString CeSdkHandler::fixPaths(QString path) const +{ + QRegExp searchStr(QLatin1String("(\\$\\(\\w+\\))")); + QString fixedString = path; + for (int index = fixedString.indexOf(searchStr, 0); + index >= 0; + index = fixedString.indexOf(searchStr, index)) { + const QString capture = searchStr.cap(0); + fixedString.replace(index, capture.length(), capture.toUpper()); + index += capture.length(); // don't count the zero terminator + fixedString.insert(index, '\\'); // the configuration file lacks a directory separator for env vars + ++index; + } + return fixedString; +} + +QT_END_NAMESPACE diff --git a/qmake/generators/win32/cesdkhandler.h b/qmake/generators/win32/cesdkhandler.h new file mode 100644 index 0000000000..8d35694e5d --- /dev/null +++ b/qmake/generators/win32/cesdkhandler.h @@ -0,0 +1,94 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/ +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.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 the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CE_SDK_HANDLER_INCL +#define CE_SDK_HANDLER_INCL + +#include +#include + +QT_BEGIN_NAMESPACE + +class CeSdkInfo +{ +public: + CeSdkInfo(); + inline QString name() const { return m_name; } + inline QString binPath() const { return m_bin; } + inline QString includePath() const { return m_include; } + inline QString libPath() const { return m_lib; } + inline bool isValid() const; + inline int majorVersion() const { return m_major; } + inline int minorVersion() const { return m_minor; } + inline bool isSupported() const { return m_major >= 5; } +private: + friend class CeSdkHandler; + QString m_name; + QString m_bin; + QString m_include; + QString m_lib; + int m_major; + int m_minor; +}; + +bool CeSdkInfo::isValid() const +{ + return !m_name.isEmpty() && + !m_bin.isEmpty() && + !m_include.isEmpty() && + !m_lib.isEmpty(); +} + +class CeSdkHandler +{ +public: + CeSdkHandler(); + bool parse(); + inline QList listAll() const { return m_list; } +private: + inline QString fixPaths(QString path) const; + QList m_list; + QString m_vcInstallDir; +}; + +QT_END_NAMESPACE + +#endif diff --git a/qmake/generators/win32/msvc_nmake.cpp b/qmake/generators/win32/msvc_nmake.cpp index db6651cb88..adf8883b01 100644 --- a/qmake/generators/win32/msvc_nmake.cpp +++ b/qmake/generators/win32/msvc_nmake.cpp @@ -41,6 +41,7 @@ #include "msvc_nmake.h" #include "option.h" +#include "cesdkhandler.h" #include #include #include @@ -76,6 +77,30 @@ NmakeMakefileGenerator::writeMakefile(QTextStream &t) if(Option::mkfile::do_stub_makefile) return MakefileGenerator::writeStubMakefile(t); #endif + if (!project->isHostBuild()) { + const QHash &variables = project->variables(); + if (variables.contains("XQMAKESPEC") + && !variables["XQMAKESPEC"].isEmpty() + && variables["XQMAKESPEC"].first().contains("wince", Qt::CaseInsensitive)) { + CeSdkHandler sdkhandler; + sdkhandler.parse(); + const QString sdkName = variables["CE_SDK"].join(" ") + + " (" + variables["CE_ARCH"].join(" ") + ")"; + const QList sdkList = sdkhandler.listAll(); + CeSdkInfo sdk; + foreach (const CeSdkInfo &info, sdkList) { + if (info.name().compare(sdkName, Qt::CaseInsensitive ) == 0) { + sdk = info; + break; + } + } + if (sdk.isValid()) { + t << "\nINCLUDE = " << sdk.includePath(); + t << "\nLIB = " << sdk.libPath(); + t << "\nPATH = " << sdk.binPath() << "\n"; + } + } + } writeNmakeParts(t); return MakefileGenerator::writeMakefile(t); } diff --git a/qmake/qmake.pri b/qmake/qmake.pri index cfa0c1359d..68b78f8d21 100644 --- a/qmake/qmake.pri +++ b/qmake/qmake.pri @@ -14,7 +14,8 @@ SOURCES += project.cpp property.cpp main.cpp generators/makefile.cpp \ generators/win32/msvc_vcproj.cpp \ generators/win32/msvc_vcxproj.cpp \ generators/win32/msvc_objectmodel.cpp generators/win32/msbuild_objectmodel.cpp \ - generators/integrity/gbuild.cpp + generators/integrity/gbuild.cpp \ + generators/win32/cesdkhandler.cpp HEADERS += project.h property.h generators/makefile.h \ generators/unix/unixmake.h meta.h option.h cachekeys.h \ @@ -24,7 +25,8 @@ HEADERS += project.h property.h generators/makefile.h \ generators/win32/msvc_vcproj.h \ generators/win32/msvc_vcxproj.h \ generators/win32/msvc_objectmodel.h generators/win32/msbuild_objectmodel.h \ - generators/integrity/gbuild.h + generators/integrity/gbuild.h \ + generators/win32/cesdkhandler.h contains(QT_EDITION, OpenSource) { DEFINES += QMAKE_OPENSOURCE_EDITION -- cgit v1.2.3