1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-10 23:44:24 +00:00

Projucer: Fix package resolution on Linux

This commit is contained in:
attila 2024-06-24 19:05:32 +02:00
parent c057c0d55e
commit 47e71a4050
3 changed files with 71 additions and 13 deletions

View file

@ -624,33 +624,56 @@ private:
return result; return result;
} }
StringArray getExtraPkgConfigPackages() const std::vector<PackageDependency> getExtraPkgConfigPackages() const
{ {
auto packages = StringArray::fromTokens (extraPkgConfigValue.get().toString(), " ", "\"'"); auto packages = StringArray::fromTokens (extraPkgConfigValue.get().toString(), " ", "\"'");
packages.removeEmptyStrings(); packages.removeEmptyStrings();
return packages; return makePackageDependencies (packages);
} }
StringArray getCompilePackages() const std::vector<PackageDependency> getCompilePackages() const
{ {
auto packages = getLinuxPackages (PackageDependencyType::compile); auto packages = getLinuxPackages (PackageDependencyType::compile);
packages.addArray (getExtraPkgConfigPackages()); const auto extra = getExtraPkgConfigPackages();
packages.insert (packages.end(), extra.begin(), extra.end());
return packages; return packages;
} }
StringArray getLinkPackages() const std::vector<PackageDependency> getLinkPackages() const
{ {
auto packages = getLinuxPackages (PackageDependencyType::link); 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<PackageDependency>& 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; return packages;
} }
String getPreprocessorPkgConfigFlags() const String getPreprocessorPkgConfigFlags() const
{ {
auto compilePackages = getCompilePackages(); auto compilePackages = getPackagesCommand (getCompilePackages());
if (compilePackages.size() > 0) if (compilePackages.size() > 0)
return "$(shell $(PKG_CONFIG) --cflags " + compilePackages.joinIntoString (" ") + ")"; return "$(shell $(PKG_CONFIG) --cflags " + compilePackages.joinIntoString (" ") + ")";
@ -660,7 +683,7 @@ private:
String getLinkerPkgConfigFlags() const String getLinkerPkgConfigFlags() const
{ {
auto linkPackages = getLinkPackages(); auto linkPackages = getPackagesCommand (getLinkPackages());
if (linkPackages.size() > 0) if (linkPackages.size() > 0)
return "$(shell $(PKG_CONFIG) --libs " + linkPackages.joinIntoString (" ") + ")"; return "$(shell $(PKG_CONFIG) --libs " + linkPackages.joinIntoString (" ") + ")";
@ -1240,7 +1263,7 @@ private:
out << getPhonyTargetLine() << newLine << newLine; out << getPhonyTargetLine() << newLine << newLine;
writeTargetLines (out, getLinkPackages()); writeTargetLines (out, getPackagesCommand (getLinkPackages()));
for (auto target : targets) for (auto target : targets)
target->addFiles (out, getFilesForTarget (filesToCompile, target, project)); target->addFiles (out, getFilesForTarget (filesToCompile, target, project));

View file

@ -55,6 +55,17 @@ static auto createIcon (const void* iconData, size_t iconDataSize)
return image; return image;
} }
std::vector<PackageDependency> makePackageDependencies (const StringArray& dependencies)
{
std::vector<PackageDependency> 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 <typename Exporter> template <typename Exporter>
static ProjectExporter::ExporterTypeInfo createExporterTypeInfo (const void* iconData, size_t iconDataSize) 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)); && project.isConfigFlagEnabled ("JUCE_LOAD_CURL_SYMBOLS_LAZILY", false));
} }
StringArray ProjectExporter::getLinuxPackages (PackageDependencyType type) const std::vector<PackageDependency> ProjectExporter::getLinuxPackages (PackageDependencyType type) const
{ {
auto packages = linuxPackages; auto packages = linuxPackages;
std::vector<PackageDependency> dependencies;
// don't add libcurl if curl symbols are loaded at runtime // don't add libcurl if curl symbols are loaded at runtime
if (isCurlEnabled (project) && ! isLoadCurlSymbolsLazilyEnabled (project)) if (isCurlEnabled (project) && ! isLoadCurlSymbolsLazilyEnabled (project))
@ -597,14 +609,17 @@ StringArray ProjectExporter::getLinuxPackages (PackageDependencyType type) const
if (isWebBrowserComponentEnabled (project) && type == PackageDependencyType::compile) if (isWebBrowserComponentEnabled (project) && type == PackageDependencyType::compile)
{ {
packages.add ("webkit2gtk-4.0");
packages.add ("gtk+-x11-3.0"); packages.add ("gtk+-x11-3.0");
dependencies.push_back (PackageDependency { "webkit2gtk-4.1", "webkit2gtk-4.0" });
} }
packages.removeEmptyStrings(); packages.removeEmptyStrings();
packages.removeDuplicates (false); 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, void ProjectExporter::addProjectPathToBuildPathList (StringArray& pathList,

View file

@ -72,6 +72,26 @@ private:
ProjectExporter& owner; ProjectExporter& owner;
}; };
//==============================================================================
struct PackageDependency
{
explicit PackageDependency (StringRef dependencyIn)
: dependency { dependencyIn }
{
}
PackageDependency (StringRef dependencyIn, StringRef fallbackIn)
: dependency { dependencyIn },
fallback { fallbackIn }
{
}
String dependency;
std::optional<String> fallback;
};
std::vector<PackageDependency> makePackageDependencies (const StringArray& dependencies);
//============================================================================== //==============================================================================
class ProjectExporter : private Value::Listener class ProjectExporter : private Value::Listener
{ {
@ -262,7 +282,7 @@ public:
link link
}; };
StringArray getLinuxPackages (PackageDependencyType type) const; std::vector<PackageDependency> getLinuxPackages (PackageDependencyType type) const;
//============================================================================== //==============================================================================
StringPairArray msvcExtraPreprocessorDefs; StringPairArray msvcExtraPreprocessorDefs;