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;
}
StringArray getExtraPkgConfigPackages() const
std::vector<PackageDependency> getExtraPkgConfigPackages() const
{
auto packages = StringArray::fromTokens (extraPkgConfigValue.get().toString(), " ", "\"'");
packages.removeEmptyStrings();
return packages;
return makePackageDependencies (packages);
}
StringArray getCompilePackages() const
std::vector<PackageDependency> 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<PackageDependency> 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<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;
}
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));

View file

@ -55,6 +55,17 @@ static auto createIcon (const void* iconData, size_t iconDataSize)
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>
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<PackageDependency> ProjectExporter::getLinuxPackages (PackageDependencyType type) const
{
auto packages = linuxPackages;
std::vector<PackageDependency> 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,

View file

@ -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<String> fallback;
};
std::vector<PackageDependency> makePackageDependencies (const StringArray& dependencies);
//==============================================================================
class ProjectExporter : private Value::Listener
{
@ -262,7 +282,7 @@ public:
link
};
StringArray getLinuxPackages (PackageDependencyType type) const;
std::vector<PackageDependency> getLinuxPackages (PackageDependencyType type) const;
//==============================================================================
StringPairArray msvcExtraPreprocessorDefs;