diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h index c23a43a49d..2091036ab3 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h @@ -624,33 +624,56 @@ private: return result; } - StringArray getExtraPkgConfigPackages() const + std::vector getExtraPkgConfigPackages() const { auto packages = StringArray::fromTokens (extraPkgConfigValue.get().toString(), " ", "\"'"); packages.removeEmptyStrings(); - return packages; + return makePackageDependencies (packages); } - StringArray getCompilePackages() const + std::vector getCompilePackages() const { auto packages = getLinuxPackages (PackageDependencyType::compile); - packages.addArray (getExtraPkgConfigPackages()); + const auto extra = getExtraPkgConfigPackages(); + packages.insert (packages.end(), extra.begin(), extra.end()); return packages; } - StringArray getLinkPackages() const + std::vector getLinkPackages() const { auto packages = getLinuxPackages (PackageDependencyType::link); - packages.addArray (getExtraPkgConfigPackages()); + const auto extra = getExtraPkgConfigPackages(); + packages.insert (packages.end(), extra.begin(), extra.end()); + + return packages; + } + + static StringArray getPackagesCommand (const std::vector& dependencies) + { + StringArray packages; + + for (const auto& d : dependencies) + { + if (d.fallback.has_value()) + { + packages.add (String { "$(shell ($(PKG_CONFIG) --exists %VALUE% && echo %VALUE%) || echo %OR_ELSE%)" } + .replace ("%VALUE%", d.dependency) + .replace ("%OR_ELSE%", *d.fallback)); + } + else + { + packages.add (d.dependency); + } + } return packages; } String getPreprocessorPkgConfigFlags() const { - auto compilePackages = getCompilePackages(); + auto compilePackages = getPackagesCommand (getCompilePackages()); if (compilePackages.size() > 0) return "$(shell $(PKG_CONFIG) --cflags " + compilePackages.joinIntoString (" ") + ")"; @@ -660,7 +683,7 @@ private: String getLinkerPkgConfigFlags() const { - auto linkPackages = getLinkPackages(); + auto linkPackages = getPackagesCommand (getLinkPackages()); if (linkPackages.size() > 0) return "$(shell $(PKG_CONFIG) --libs " + linkPackages.joinIntoString (" ") + ")"; @@ -1240,7 +1263,7 @@ private: out << getPhonyTargetLine() << newLine << newLine; - writeTargetLines (out, getLinkPackages()); + writeTargetLines (out, getPackagesCommand (getLinkPackages())); for (auto target : targets) target->addFiles (out, getFilesForTarget (filesToCompile, target, project)); diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.cpp b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.cpp index aebad0a673..5e91e9bfe7 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.cpp +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.cpp @@ -55,6 +55,17 @@ static auto createIcon (const void* iconData, size_t iconDataSize) return image; } +std::vector makePackageDependencies (const StringArray& dependencies) +{ + std::vector result; + result.reserve ((size_t) dependencies.size()); + std::transform (dependencies.begin(), + dependencies.end(), + std::back_inserter (result), + [] (auto& d) { return PackageDependency { d }; }); + return result; +} + template static ProjectExporter::ExporterTypeInfo createExporterTypeInfo (const void* iconData, size_t iconDataSize) { @@ -587,9 +598,10 @@ static bool isLoadCurlSymbolsLazilyEnabled (Project& project) && project.isConfigFlagEnabled ("JUCE_LOAD_CURL_SYMBOLS_LAZILY", false)); } -StringArray ProjectExporter::getLinuxPackages (PackageDependencyType type) const +std::vector ProjectExporter::getLinuxPackages (PackageDependencyType type) const { auto packages = linuxPackages; + std::vector dependencies; // don't add libcurl if curl symbols are loaded at runtime if (isCurlEnabled (project) && ! isLoadCurlSymbolsLazilyEnabled (project)) @@ -597,14 +609,17 @@ StringArray ProjectExporter::getLinuxPackages (PackageDependencyType type) const if (isWebBrowserComponentEnabled (project) && type == PackageDependencyType::compile) { - packages.add ("webkit2gtk-4.0"); packages.add ("gtk+-x11-3.0"); + dependencies.push_back (PackageDependency { "webkit2gtk-4.1", "webkit2gtk-4.0" }); } packages.removeEmptyStrings(); packages.removeDuplicates (false); - return packages; + const auto simpleDependencies = makePackageDependencies (packages); + dependencies.insert (dependencies.end(), simpleDependencies.begin(), simpleDependencies.end()); + + return dependencies; } void ProjectExporter::addProjectPathToBuildPathList (StringArray& pathList, diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.h index d79d4574ca..eff3dd63f8 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.h @@ -72,6 +72,26 @@ private: ProjectExporter& owner; }; +//============================================================================== +struct PackageDependency +{ + explicit PackageDependency (StringRef dependencyIn) + : dependency { dependencyIn } + { + } + + PackageDependency (StringRef dependencyIn, StringRef fallbackIn) + : dependency { dependencyIn }, + fallback { fallbackIn } + { + } + + String dependency; + std::optional fallback; +}; + +std::vector makePackageDependencies (const StringArray& dependencies); + //============================================================================== class ProjectExporter : private Value::Listener { @@ -262,7 +282,7 @@ public: link }; - StringArray getLinuxPackages (PackageDependencyType type) const; + std::vector getLinuxPackages (PackageDependencyType type) const; //============================================================================== StringPairArray msvcExtraPreprocessorDefs;