diff --git a/CraftSettings.ini.template b/CraftSettings.ini.template --- a/CraftSettings.ini.template +++ b/CraftSettings.ini.template @@ -190,6 +190,29 @@ #SVN_SSH = plink +# Make it easier on MacOS to use homebrew packages: +[Homebrew] +# Enabled defaults to true if the `brew` command was found otherwise false +# Enabled = False + +# The following options default to true: +# Whether to use bison from homebrew (system version is probably too old) +# use-bison = True +# Whether to use gettext from homebrew +# use-gettext = True +# Whether to use OpenSSL 1.1 from homebrew (instead of the system openssl 1.0) +# use-openssl@1.1 = True +# Whether to use libarchive from homebrew (system version usually doesn't include all headers) +# use-libarchive = True + +# It is also possible to use Qt5 from homebrew (experimental) +# If this setting is "latest" it defaults to the latest version of Qt5 +# installed by homebrew. However, it can also be set to a specific version +# such as "5.10.1" to use the qt installation from /usr/local/Cellar/qt/5.10.1 +# The default here is "disabled" +# qt = latest + + [QtSDK] ## For advanced users only ## Whether to use prebuild Qt binaries. diff --git a/bin/CraftSetupHelper.py b/bin/CraftSetupHelper.py --- a/bin/CraftSetupHelper.py +++ b/bin/CraftSetupHelper.py @@ -212,13 +212,57 @@ self.prependEnvVar("LD_LIBRARY_PATH", [os.path.join(CraftStandardDirs.craftRoot(), "lib"), os.path.join(CraftStandardDirs.craftRoot(), "lib", "x86_64-linux-gnu")]) if OsUtils.isMac(): - self.prependEnvVar("DYLD_LIBRARY_PATH", [os.path.join(CraftStandardDirs.craftRoot(), "lib")]) + self._setupMac() + + def _setupMac(self): + self.prependEnvVar("DYLD_LIBRARY_PATH", [os.path.join(CraftStandardDirs.craftRoot(), "lib")]) + brewPath = shutil.which("brew") + if brewPath: + log("Found brew: " + shutil.which("brew")) + if CraftCore.settings.getboolean("Homebrew", "Enabled", brewPath is not None): + log("Using homebrew packages. To disable set `Enabled = false` in the [Homebrew] group") + _, prefix = self._getOutput(["brew", "--prefix"]) + if not prefix: + prefix = "/usr/local" + for lib in ("gettext", "libarchive", "openssl@1.1"): + if not CraftCore.settings.getboolean("Homebrew", "use-" + lib, True): + continue + installDir = os.path.join(prefix, "opt", lib) + self.prependEnvVar("CMAKE_LIBRARY_PATH", os.path.join(installDir, "lib")) + self.prependEnvVar("CMAKE_INCLUDE_PATH", os.path.join(installDir, "include")) + self.prependEnvVar("PKG_CONFIG_PATH", os.path.join(installDir, "lib/pkgconfig")) + log("Using homebrew library " + lib + ": " + installDir) + + if CraftCore.settings.getboolean("Homebrew", "use-bison", True): + bisonPath = os.path.join(prefix, "opt/bison/bin") + self.prependEnvVar("PATH", bisonPath) + log("Using bison from homebrew: " + bisonPath) + + qtOption = CraftCore.settings.get("Homebrew", "qt", "disabled") + if qtOption != "disabled": + log("Using qt (" + qtOption + ") from homebrew packages. " + " To disable set `qt = disabled` in the [Homebrew] group") + self.prependEnvVar("PATH", os.path.join(prefix, "opt/bison/bin")) + if qtOption == "latest": + qtPath = os.path.join(prefix, "opt/qt5/") + else: + _, cellar = self._getOutput(["brew", "--cellar", "qt5"]) + qtPath = os.path.join(cellar, qtOption) + if not os.path.isdir(qtPath): + log("Error: Homebrew/qt = '" + qtOption + "' but " + qtPath + " does not exist") + exit(1) + log("Found homebrew Qt5 in " + qtPath) + self.prependEnvVar("PATH", os.path.join(qtPath, "bin")) + + else: + log("Not using qt from homebrew packages. " + "To enable set `use-qt = /latest` in the [Homebrew] group") + log("\n") def _setupWin(self): if not "HOME" in os.environ: self.addEnvVar("HOME", os.getenv("USERPROFILE")) - if CraftCore.settings.getboolean("QtSDK", "Enabled", "false"): self.prependEnvVar("PATH", os.path.join(CraftCore.settings.get("QtSDK", "Path"), CraftCore.settings.get("QtSDK", "Version"), @@ -269,8 +313,8 @@ if OsUtils.isWin(): self._setupWin() - else: - self.setXDG() + elif OsUtils.isUnix(): + self._setupUnix() self.prependEnvVar("PKG_CONFIG_PATH", os.path.join(CraftStandardDirs.craftRoot(), "lib", "pkgconfig"))