tizentoolchain.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. /****************************************************************************
  2. **
  3. ** Copyright (C) 2013 Jarek Pelczar <jpelczar@gmail.com>
  4. **
  5. ** This file is part of Qt Creator.
  6. **
  7. ** Commercial License Usage
  8. ** Licensees holding valid commercial Qt licenses may use this file in
  9. ** accordance with the commercial license agreement provided with the
  10. ** Software or, alternatively, in accordance with the terms contained in
  11. ** a written agreement between you and Digia. For licensing terms and
  12. ** conditions see http://qt.digia.com/licensing. For further information
  13. ** use the contact form at http://qt.digia.com/contact-us.
  14. **
  15. ** GNU Lesser General Public License Usage
  16. ** Alternatively, this file may be used under the terms of the GNU Lesser
  17. ** General Public License version 2.1 as published by the Free Software
  18. ** Foundation and appearing in the file LICENSE.LGPL included in the
  19. ** packaging of this file. Please review the following information to
  20. ** ensure the GNU Lesser General Public License version 2.1 requirements
  21. ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
  22. **
  23. ** In addition, as a special exception, Digia gives you certain additional
  24. ** rights. These rights are described in the Digia Qt LGPL Exception
  25. ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
  26. **
  27. ****************************************************************************/
  28. #include "tizentoolchain.h"
  29. #include "tizenconstants.h"
  30. #include "tizenconfigurations.h"
  31. #include <QDirIterator>
  32. #include <QProcess>
  33. #include <utils/hostosinfo.h>
  34. using namespace ProjectExplorer;
  35. namespace Tizen {
  36. namespace {
  37. const QLatin1String tizen_emulator_mkspec("devices/linux-g++-tizen-emulator");
  38. const QLatin1String tizen_mobile_mkspec("devices/linux-g++-tizen-mobile");
  39. const QLatin1String tizen_ivi_mkspec("devices/linux-g++-tizen-ivi");
  40. }
  41. TizenGccToolchain::~TizenGccToolchain()
  42. {
  43. }
  44. QString TizenGccToolchain::type() const
  45. {
  46. return QLatin1String(Constants::TIZEN_TOOLCHAIN_GCC_TYPE);
  47. }
  48. QString TizenGccToolchain::typeDisplayName() const
  49. {
  50. return TizenToolchainFactory::tr("Tizen GCC");
  51. }
  52. bool TizenGccToolchain::isValid() const
  53. {
  54. return GccToolChain::isValid() &&
  55. targetAbi().isValid();
  56. }
  57. void TizenGccToolchain::addToEnvironment(Utils::Environment &env) const
  58. {
  59. GccToolChain::addToEnvironment(env);
  60. }
  61. bool TizenGccToolchain::operator ==(const ProjectExplorer::ToolChain & other) const
  62. {
  63. if(!GccToolChain::operator ==(other))
  64. return false;
  65. return true;
  66. }
  67. ProjectExplorer::ToolChainConfigWidget * TizenGccToolchain::configurationWidget()
  68. {
  69. return GccToolChain::configurationWidget();
  70. }
  71. Utils::FileName TizenGccToolchain::suggestedDebugger() const
  72. {
  73. return GccToolChain::suggestedDebugger();
  74. }
  75. QVariantMap TizenGccToolchain::toMap() const
  76. {
  77. QVariantMap vm = GccToolChain::toMap();
  78. return vm;
  79. }
  80. bool TizenGccToolchain::fromMap(const QVariantMap &data)
  81. {
  82. if(!GccToolChain::fromMap(data))
  83. return false;
  84. return isValid();
  85. }
  86. QString TizenGccToolchain::makeCommand(const Utils::Environment &environment) const
  87. {
  88. return GccToolChain::makeCommand(environment);
  89. }
  90. QList<Utils::FileName> TizenGccToolchain::suggestedMkspecList() const
  91. {
  92. return QList<Utils::FileName>() << Utils::FileName::fromString(tizen_emulator_mkspec)
  93. << Utils::FileName::fromString(tizen_mobile_mkspec)
  94. << Utils::FileName::fromString(tizen_ivi_mkspec);
  95. }
  96. QList<Abi> TizenGccToolchain::detectSupportedAbis() const
  97. {
  98. return QList<Abi>() << targetAbi();
  99. }
  100. TizenGccToolchain::TizenGccToolchain() :
  101. GccToolChain(QLatin1String(Constants::TIZEN_TOOLCHAIN_ID), false)
  102. {
  103. }
  104. TizenGccToolchain::TizenGccToolchain(const ProjectExplorer::Abi::Architecture arch, bool autoDetected) :
  105. GccToolChain(QLatin1String(Constants::TIZEN_TOOLCHAIN_ID), autoDetected)
  106. {
  107. ProjectExplorer::Abi abi = ProjectExplorer::Abi(arch,
  108. ProjectExplorer::Abi::LinuxOS,
  109. ProjectExplorer::Abi::GenericLinuxFlavor,
  110. ProjectExplorer::Abi::ElfFormat,
  111. 32);
  112. setTargetAbi(abi);
  113. setDisplayName(QString::fromLatin1("Tizen GCC (%1)")
  114. .arg(Abi::toString(abi.architecture())));
  115. }
  116. TizenGccToolchain::TizenGccToolchain(const TizenGccToolchain& other) :
  117. GccToolChain(other)
  118. {
  119. }
  120. TizenToolchainFactory::TizenToolchainFactory()
  121. {
  122. }
  123. QString TizenToolchainFactory::displayName() const
  124. {
  125. return tr("Tizen GCC");
  126. }
  127. QString TizenToolchainFactory::id() const
  128. {
  129. return QLatin1String(Constants::TIZEN_TOOLCHAIN_ID);
  130. }
  131. QList<ProjectExplorer::ToolChain *> TizenToolchainFactory::autoDetect()
  132. {
  133. return createToolchainsForSdk(TizenConfigurations::instance()->tizenConfig().m_sdkLocation.toString(),
  134. TizenConfigurations::instance()->tizenConfig().m_sbiLocation.toString());
  135. }
  136. bool TizenToolchainFactory::canRestore(const QVariantMap &data)
  137. {
  138. return idFromMap(data).startsWith(QLatin1String(Constants::TIZEN_TOOLCHAIN_ID) + QLatin1Char(':'));
  139. }
  140. ToolChain *TizenToolchainFactory::restore(const QVariantMap &data)
  141. {
  142. TizenGccToolchain * tc = new TizenGccToolchain();
  143. if(tc->fromMap(data))
  144. return tc;
  145. delete tc;
  146. return NULL;
  147. }
  148. static QList<Abi> guessGccAbi(const QString &m)
  149. {
  150. QList<Abi> abiList;
  151. QString machine = m.toLower();
  152. if (machine.isEmpty())
  153. return abiList;
  154. QStringList parts = machine.split(QRegExp(QLatin1String("[ /-]")));
  155. Abi::Architecture arch = Abi::UnknownArchitecture;
  156. Abi::OS os = Abi::UnknownOS;
  157. Abi::OSFlavor flavor = Abi::UnknownFlavor;
  158. Abi::BinaryFormat format = Abi::UnknownFormat;
  159. int width = 0;
  160. int unknownCount = 0;
  161. foreach (const QString &p, parts) {
  162. if (p == QLatin1String("unknown") || p == QLatin1String("pc") || p == QLatin1String("none")
  163. || p == QLatin1String("gnu") || p == QLatin1String("uclibc")
  164. || p == QLatin1String("86_64") || p == QLatin1String("redhat")
  165. || p == QLatin1String("gnueabi") || p == QLatin1String("w64")) {
  166. continue;
  167. } else if (p == QLatin1String("i386") || p == QLatin1String("i486") || p == QLatin1String("i586")
  168. || p == QLatin1String("i686") || p == QLatin1String("x86")) {
  169. arch = Abi::X86Architecture;
  170. } else if (p.startsWith(QLatin1String("arm"))) {
  171. arch = Abi::ArmArchitecture;
  172. width = 32;
  173. } else if (p == QLatin1String("mipsel")) {
  174. arch = Abi::MipsArchitecture;
  175. width = 32;
  176. } else if (p == QLatin1String("x86_64") || p == QLatin1String("amd64")) {
  177. arch = Abi::X86Architecture;
  178. width = 64;
  179. } else if (p == QLatin1String("powerpc64")) {
  180. arch = Abi::PowerPCArchitecture;
  181. width = 64;
  182. } else if (p == QLatin1String("powerpc")) {
  183. arch = Abi::PowerPCArchitecture;
  184. width = 32;
  185. } else if (p == QLatin1String("linux") || p == QLatin1String("linux6e")) {
  186. os = Abi::LinuxOS;
  187. if (flavor == Abi::UnknownFlavor)
  188. flavor = Abi::GenericLinuxFlavor;
  189. format = Abi::ElfFormat;
  190. } else if (p.startsWith(QLatin1String("freebsd"))) {
  191. os = Abi::BsdOS;
  192. if (flavor == Abi::UnknownFlavor)
  193. flavor = Abi::FreeBsdFlavor;
  194. format = Abi::ElfFormat;
  195. } else if (p == QLatin1String("mingw32") || p == QLatin1String("win32") || p == QLatin1String("mingw32msvc")) {
  196. arch = Abi::X86Architecture;
  197. os = Abi::WindowsOS;
  198. flavor = Abi::WindowsMSysFlavor;
  199. format = Abi::PEFormat;
  200. } else if (p == QLatin1String("apple")) {
  201. os = Abi::MacOS;
  202. flavor = Abi::GenericMacFlavor;
  203. format = Abi::MachOFormat;
  204. } else if (p == QLatin1String("darwin10")) {
  205. width = 64;
  206. } else if (p == QLatin1String("darwin9")) {
  207. width = 32;
  208. } else if (p == QLatin1String("gnueabi")) {
  209. format = Abi::ElfFormat;
  210. } else {
  211. ++unknownCount;
  212. }
  213. }
  214. if (unknownCount == parts.count())
  215. return abiList;
  216. if (os == Abi::MacOS && arch != Abi::ArmArchitecture) {
  217. // Apple does PPC and x86!
  218. abiList << Abi(arch, os, flavor, format, width);
  219. abiList << Abi(arch, os, flavor, format, width == 64 ? 32 : 64);
  220. abiList << Abi(arch == Abi::X86Architecture ? Abi::PowerPCArchitecture : Abi::X86Architecture, os, flavor, format, width);
  221. abiList << Abi(arch == Abi::X86Architecture ? Abi::PowerPCArchitecture : Abi::X86Architecture, os, flavor, format, width == 64 ? 32 : 64);
  222. } else if (arch == Abi::X86Architecture && (width == 0 || width == 64)) {
  223. // if (macros.contains("#define __x86_64 1"))
  224. // abiList << Abi(arch, os, flavor, format, 64);
  225. abiList << Abi(arch, os, flavor, format, 32);
  226. } else {
  227. abiList << Abi(arch, os, flavor, format, width);
  228. }
  229. return abiList;
  230. }
  231. QList<ProjectExplorer::ToolChain *> TizenToolchainFactory::createToolchainsForSdk(const QString& sdkPath, const QString &sbiPath)
  232. {
  233. Q_UNUSED(sbiPath)
  234. QList<ProjectExplorer::ToolChain *> result;
  235. if(sdkPath.isEmpty())
  236. return result;
  237. Utils::FileName path = Utils::FileName::fromString(sdkPath);
  238. QDirIterator it(path.appendPath(QLatin1String("tools")).toString(),
  239. QStringList() << QLatin1String("*gcc*"),
  240. QDir::Dirs);
  241. const QLatin1String bin_dir("bin");
  242. while(it.hasNext()) {
  243. const QString dirName = QFileInfo(it.next()).fileName();
  244. Utils::FileName gccPath = Utils::FileName::fromString(it.filePath()).appendPath(bin_dir);
  245. QDirIterator gcc_paths(gccPath.toString(),
  246. QStringList() << QLatin1String("*gcc"),
  247. QDir::Files|QDir::Executable);
  248. if(gcc_paths.hasNext()) {
  249. gcc_paths.next();
  250. QString fullGccPath = gcc_paths.filePath();
  251. QList<Abi> abis = guessGccAbi(dirName);
  252. if(!abis.empty()) {
  253. TizenGccToolchain * tc = new TizenGccToolchain(abis[0].architecture(),
  254. true);
  255. tc->setCompilerCommand(Utils::FileName::fromString(fullGccPath));
  256. result.append(tc);
  257. }
  258. }
  259. }
  260. return result;
  261. }
  262. bool TizenToolchainFactory::canCreate()
  263. {
  264. return false;
  265. }
  266. ProjectExplorer::ToolChain * TizenToolchainFactory::create()
  267. {
  268. return new TizenGccToolchain();
  269. }
  270. } // namespace Tizen