//====================================================================== void HeaderComponent::updateExporters() noexcept { auto selectedName = getSelectedExporterName(); exporterBox.clear(); auto preferredExporterIndex = -1; int i = 0; for (Project::ExporterIterator exporter (*project); exporter.next(); ++i) { exporterBox.addItem (exporter->getName(), i + 1); if (selectedName == exporter->getName()) exporterBox.setSelectedId (i + 1); if (exporter->canLaunchProject() && preferredExporterIndex == -1) preferredExporterIndex = i; } if (exporterBox.getSelectedItemIndex() == -1) exporterBox.setSelectedItemIndex (preferredExporterIndex != -1 ? preferredExporterIndex : 0); updateExporterButton(); }
void LibraryModule::createLocalHeaderWrapper (ProjectSaver& projectSaver, const File& originalHeader, const File& localHeader) const { Project& project = projectSaver.project; MemoryOutputStream out; out << "// This is an auto-generated file to redirect any included" << newLine << "// module headers to the correct external folder." << newLine << newLine; StringArray paths, guards; for (Project::ExporterIterator exporter (project); exporter.next();) { const RelativePath headerFromProject (exporter->getModuleFolderRelativeToProject (getID(), projectSaver) .getChildFile (originalHeader.getFileName())); const RelativePath fileFromHere (headerFromProject.rebased (project.getProjectFolder(), localHeader.getParentDirectory(), RelativePath::unknown)); paths.add (fileFromHere.toUnixStyle().quoted()); guards.add ("defined (" + exporter->getExporterIdentifierMacro() + ")"); } writeGuardedInclude (out, paths, guards); out << newLine; projectSaver.replaceFileIfDifferent (localHeader, out); }
void Project::updateDeprecatedProjectSettingsInteractively() { jassert (! ProjucerApplication::getApp().isRunningCommandLine); for (Project::ExporterIterator exporter (*this); exporter.next();) exporter->updateDeprecatedProjectSettingsInteractively(); }
void EnabledModuleList::addModule (const File& moduleManifestFile, bool copyLocally) { ModuleDescription info (moduleManifestFile); if (info.isValid()) { const String moduleID (info.getID()); if (! isModuleEnabled (moduleID)) { ValueTree module (Ids::MODULES); module.setProperty (Ids::ID, moduleID, nullptr); state.addChild (module, -1, getUndoManager()); sortAlphabetically(); shouldShowAllModuleFilesInProject (moduleID) = true; shouldCopyModuleFilesLocally (moduleID) = copyLocally; RelativePath path (moduleManifestFile.getParentDirectory().getParentDirectory(), project.getProjectFolder(), RelativePath::projectFolder); for (Project::ExporterIterator exporter (project); exporter.next();) exporter->getPathForModuleValue (moduleID) = path.toUnixStyle(); } } }
void Project::updateOldStyleConfigList() { ValueTree deprecatedConfigsList (projectRoot.getChildWithName (ProjectExporter::configurations)); if (deprecatedConfigsList.isValid()) { projectRoot.removeChild (deprecatedConfigsList, nullptr); for (Project::ExporterIterator exporter (*this); exporter.next();) { if (exporter->getNumConfigurations() == 0) { ValueTree newConfigs (deprecatedConfigsList.createCopy()); if (! exporter->isXcode()) { for (int j = newConfigs.getNumChildren(); --j >= 0;) { ValueTree config (newConfigs.getChild(j)); config.removeProperty (Ids::osxSDK, nullptr); config.removeProperty (Ids::osxCompatibility, nullptr); config.removeProperty (Ids::osxArchitecture, nullptr); } } exporter->settings.addChild (newConfigs, 0, nullptr); } } } }
File EnabledModuleList::findLocalModuleFolder (const String& moduleID, bool useExportersForOtherOSes) { for (Project::ExporterIterator exporter (project); exporter.next();) { if (useExportersForOtherOSes || exporter->mayCompileOnCurrentOS()) { const String path (exporter->getPathForModuleString (moduleID)); if (path.isNotEmpty()) { const File moduleFolder (project.resolveFilename (path)); if (moduleFolder.exists()) { if (ModuleDescription (moduleFolder).isValid()) return moduleFolder; File f = moduleFolder.getChildFile (moduleID); if (ModuleDescription (f).isValid()) return f; f = moduleFolder.getChildFile ("modules") .getChildFile (moduleID); if (ModuleDescription (f).isValid()) return f; } } } } return File(); }
bool HeaderComponent::canCurrentExporterLaunchProject() const noexcept { for (Project::ExporterIterator exporter (*project); exporter.next();) if (exporter->getName() == getSelectedExporterName() && exporter->canLaunchProject()) return true; return false; }
void EnabledModuleList::removeModule (String moduleID) // must be pass-by-value, and not a const ref! { for (int i = state.getNumChildren(); --i >= 0;) if (state.getChild(i) [Ids::ID] == moduleID) state.removeChild (i, getUndoManager()); for (Project::ExporterIterator exporter (project); exporter.next();) exporter->removePathForModule (moduleID); }
void EnabledModuleList::removeModule (const String& moduleID) { for (int i = state.getNumChildren(); --i >= 0;) if (state.getChild(i) [Ids::ID] == moduleID) state.removeChild (i, getUndoManager()); for (Project::ExporterIterator exporter (project); exporter.next();) exporter->removePathForModule (moduleID); }
void Project::moveOldPropertyFromProjectToAllExporters (Identifier name) { if (projectRoot.hasProperty (name)) { for (Project::ExporterIterator exporter (*this); exporter.next();) exporter->settings.setProperty (name, projectRoot [name], nullptr); projectRoot.removeProperty (name, nullptr); } }
StringArray ProjectContentComponent::getExportersWhichCanLaunch() const { StringArray s; if (project != nullptr) for (Project::ExporterIterator exporter (*project); exporter.next();) if (exporter->canLaunchProject()) s.add (exporter->getName()); return s; }
void ProjectContentComponent::openInIDE (int exporterIndex, bool saveFirst) { if (saveFirst) saveProject(); int i = 0; if (project != nullptr) for (Project::ExporterIterator exporter (*project); exporter.next();) if (exporter->canLaunchProject()) if (i++ == exporterIndex && exporter->launchProject()) break; }
void ProjectExporter::createDefaultModulePaths() { for (Project::ExporterIterator exporter (project); exporter.next();) { if (areCompatibleExporters (*this, *exporter)) { for (int i = project.getModules().getNumModules(); --i >= 0;) { String modID (project.getModules().getModuleID(i)); getPathForModuleValue (modID) = exporter->getPathForModuleValue (modID).getValue(); } break; } } }
static Array<File> getAllPossibleModulePathsFromExporters (Project& project) { StringArray paths; for (Project::ExporterIterator exporter (project); exporter.next();) { auto& modules = project.getModules(); auto n = modules.getNumModules(); for (int i = 0; i < n; ++i) { auto id = modules.getModuleID (i); if (modules.shouldUseGlobalPath (id)) continue; const auto path = exporter->getPathForModuleString (id); if (path.isNotEmpty()) paths.addIfNotAlreadyThere (path); } String oldPath (exporter->getLegacyModulePath()); if (oldPath.isNotEmpty()) paths.addIfNotAlreadyThere (oldPath); } Array<File> files; for (auto& path : paths) { auto f = project.resolveFilename (path); if (f.isDirectory()) { files.addIfNotAlreadyThere (f); if (f.getChildFile ("modules").isDirectory()) files.addIfNotAlreadyThere (f.getChildFile ("modules")); } } return files; }
void Project::setMissingDefaultValues() { if (! projectRoot.hasProperty (ComponentBuilder::idProperty)) projectRoot.setProperty (ComponentBuilder::idProperty, createAlphaNumericUID(), nullptr); // Create main file group if missing if (! projectRoot.getChildWithName (Tags::projectMainGroup).isValid()) { Item mainGroup (*this, ValueTree (Tags::projectMainGroup)); projectRoot.addChild (mainGroup.state, 0, 0); } getMainGroup().initialiseMissingProperties(); if (getDocumentTitle().isEmpty()) setTitle ("Juce Project"); if (! projectRoot.hasProperty (Ids::projectType)) getProjectTypeValue() = ProjectType::getGUIAppTypeName(); if (! projectRoot.hasProperty (Ids::version)) getVersionValue() = "1.0.0"; updateOldStyleConfigList(); moveOldPropertyFromProjectToAllExporters (Ids::bigIcon); moveOldPropertyFromProjectToAllExporters (Ids::smallIcon); for (Project::ExporterIterator exporter (*this); exporter.next();) if (exporter->getNumConfigurations() == 0) exporter->createDefaultConfigs(); if (! projectRoot.getChildWithName (Tags::exporters).isValid()) createDefaultExporters(); getProjectType().setMissingProjectProperties (*this); if (! projectRoot.hasProperty (Ids::bundleIdentifier)) setBundleIdentifierToDefault(); if (! projectRoot.getChildWithName (Tags::modulesGroup).isValid()) addDefaultModules (false); }
static Array<File> getAllPossibleModulePaths (Project& project) { StringArray paths; for (Project::ExporterIterator exporter (project); exporter.next();) { if (exporter->mayCompileOnCurrentOS()) { for (int i = 0; i < project.getModules().getNumModules(); ++i) { const String path (exporter->getPathForModuleString (project.getModules().getModuleID (i))); if (path.isNotEmpty()) paths.addIfNotAlreadyThere (path); } String oldPath (exporter->getLegacyModulePath()); if (oldPath.isNotEmpty()) paths.addIfNotAlreadyThere (oldPath); } } Array<File> files; for (int i = 0; i < paths.size(); ++i) { const File f (project.resolveFilename (paths[i])); if (f.isDirectory()) { files.add (f); if (f.getChildFile ("modules").isDirectory()) files.addIfNotAlreadyThere (f.getChildFile ("modules")); } } return files; }
File EnabledModuleList::getModuleInfoFile (const String& moduleID) { for (Project::ExporterIterator exporter (project); exporter.next();) { if (exporter->mayCompileOnCurrentOS()) { const String path (exporter->getPathForModuleString (moduleID)); if (path.isNotEmpty()) { const File moduleFolder (project.resolveFilename (path)); if (moduleFolder.exists()) { File f (moduleFolder.getChildFile (ModuleDescription::getManifestFileName())); if (f.exists()) return f; f = moduleFolder.getChildFile (moduleID) .getChildFile (ModuleDescription::getManifestFileName()); if (f.exists()) return f; f = moduleFolder.getChildFile ("modules") .getChildFile (moduleID) .getChildFile (ModuleDescription::getManifestFileName()); if (f.exists()) return f; } } } } return File::nonexistent; }
void ProjectContentComponent::openInSelectedIDE (bool saveFirst) { if (project != nullptr) { if (auto* headerComp = dynamic_cast<HeaderComponent*> (header.get())) { auto selectedIDE = headerComp->getSelectedExporterName(); for (Project::ExporterIterator exporter (*project); exporter.next();) { if (exporter->canLaunchProject() && exporter->getName() == selectedIDE) { if (saveFirst && ! saveProject (exporter->isXcode())) return; exporter->launchProject(); break; } } } } }
void Project::updateOldModulePaths() { for (Project::ExporterIterator exporter (*this); exporter.next();) exporter->updateOldModulePaths(); }
void ProjectSaver::writeProjects (const OwnedArray<LibraryModule>& modules, const String& specifiedExporterToSave, bool isCommandLineApp) { ThreadPool threadPool; // keep a copy of the basic generated files group, as each exporter may modify it. auto originalGeneratedGroup = generatedFilesGroup.state.createCopy(); CLionProjectExporter* clionExporter = nullptr; OwnedArray<ProjectExporter> exporters; try { for (Project::ExporterIterator exp (project); exp.next();) { if (specifiedExporterToSave.isNotEmpty() && exp->getName() != specifiedExporterToSave) continue; auto* exporter = exporters.add (exp.exporter.release()); exporter->initialiseDependencyPathValues(); if (exporter->getTargetFolder().createDirectory()) { if (exporter->isCLion()) { clionExporter = dynamic_cast<CLionProjectExporter*> (exporter); } else { exporter->copyMainGroupFromProject(); exporter->settings = exporter->settings.createCopy(); exporter->addToExtraSearchPaths (RelativePath ("JuceLibraryCode", RelativePath::projectFolder)); generatedFilesGroup.state = originalGeneratedGroup.createCopy(); exporter->addSettingsForProjectType (project.getProjectType()); for (auto& module: modules) module->addSettingsForModuleToExporter (*exporter, *this); generatedFilesGroup.sortAlphabetically (true, true); exporter->getAllGroups().add (generatedFilesGroup); } if (isCommandLineApp) saveExporter (exporter, modules); else threadPool.addJob (new ExporterJob (*this, exporter, modules), true); } else { addError ("Can't create folder: " + exporter->getTargetFolder().getFullPathName()); } } } catch (ProjectExporter::SaveError& saveError) { addError (saveError.message); } if (! isCommandLineApp) while (threadPool.getNumJobs() > 0) Thread::sleep (10); if (clionExporter != nullptr) { for (auto* exporter : exporters) clionExporter->writeCMakeListsExporterSection (exporter); std::cout << "Finished saving: " << clionExporter->getName() << std::endl; } }
static void setExecutableNameForAllTargets (Project& project, const String& exeName) { for (Project::ExporterIterator exporter (project); exporter.next();) for (ProjectExporter::ConfigIterator config (*exporter); config.next();) config->getTargetBinaryName() = exeName; }