diff --git a/src/SPC/builder/linux/SystemUtil.php b/src/SPC/builder/linux/SystemUtil.php
index 056af090d..30b36b888 100644
--- a/src/SPC/builder/linux/SystemUtil.php
+++ b/src/SPC/builder/linux/SystemUtil.php
@@ -141,7 +141,7 @@ public static function getSupportedDistros(): array
{
return [
// debian-like
- 'debian', 'ubuntu', 'Deepin',
+ 'debian', 'ubuntu', 'Deepin', 'neon',
// rhel-like
'redhat',
// centos
diff --git a/src/SPC/doctor/item/LinuxToolCheckList.php b/src/SPC/doctor/item/LinuxToolCheckList.php
index ab8144a21..08a2b4dc9 100644
--- a/src/SPC/doctor/item/LinuxToolCheckList.php
+++ b/src/SPC/doctor/item/LinuxToolCheckList.php
@@ -112,7 +112,7 @@ public function checkSystemOSPackages(): ?CheckResult
public function fixBuildTools(array $distro, array $missing): bool
{
$install_cmd = match ($distro['dist']) {
- 'ubuntu', 'debian', 'Deepin' => 'apt-get install -y',
+ 'ubuntu', 'debian', 'Deepin', 'neon' => 'apt-get install -y',
'alpine' => 'apk add',
'redhat' => 'dnf install -y',
'centos' => 'yum install -y',
@@ -128,7 +128,7 @@ public function fixBuildTools(array $distro, array $missing): bool
logger()->warning('Current user (' . $user . ') is not root, using sudo for running command (may require password input)');
}
- $is_debian = in_array($distro['dist'], ['debian', 'ubuntu', 'Deepin']);
+ $is_debian = in_array($distro['dist'], ['debian', 'ubuntu', 'Deepin', 'neon']);
$to_install = $is_debian ? str_replace('xz', 'xz-utils', $missing) : $missing;
// debian, alpine libtool -> libtoolize
$to_install = str_replace('libtoolize', 'libtool', $to_install);
diff --git a/src/StaticPHP/Artifact/ArtifactDownloader.php b/src/StaticPHP/Artifact/ArtifactDownloader.php
index a42bed7b4..4fb651cfb 100644
--- a/src/StaticPHP/Artifact/ArtifactDownloader.php
+++ b/src/StaticPHP/Artifact/ArtifactDownloader.php
@@ -397,7 +397,12 @@ private function downloadWithType(Artifact $artifact, int $current, int $total,
$instance = new $call();
$lock = $instance->download($artifact->getName(), $item['config'], $this);
} else {
- throw new ValidationException("Artifact has invalid download type '{$item['config']['type']}' for {$item['display']}.");
+ if ($item['config']['type'] === 'custom') {
+ $msg = "Artifact [{$artifact->getName()}] has no valid custom " . SystemTarget::getCurrentPlatformString() . ' download callback defined.';
+ } else {
+ $msg = "Artifact has invalid download type '{$item['config']['type']}' for {$item['display']}.";
+ }
+ throw new ValidationException($msg);
}
if (!$lock instanceof DownloadResult) {
throw new ValidationException("Artifact {$artifact->getName()} has invalid custom return value. Must be instance of DownloadResult.");
diff --git a/src/StaticPHP/Doctor/Doctor.php b/src/StaticPHP/Doctor/Doctor.php
index 8141fa32f..692a5b8c5 100644
--- a/src/StaticPHP/Doctor/Doctor.php
+++ b/src/StaticPHP/Doctor/Doctor.php
@@ -34,7 +34,7 @@ public function checkAll(bool $interactive = true): bool
InteractiveTerm::notice('Starting doctor checks ...');
}
foreach ($this->getValidCheckList() as $check) {
- if (!$this->checkItem($check)) {
+ if (!$this->checkItem($check, $interactive)) {
return false;
}
}
@@ -47,7 +47,7 @@ public function checkAll(bool $interactive = true): bool
* @param CheckItem|string $check The check item to be checked
* @return bool True if the check passed or was fixed, false otherwise
*/
- public function checkItem(CheckItem|string $check): bool
+ public function checkItem(CheckItem|string $check, bool $interactive = true): bool
{
if (is_string($check)) {
$found = null;
@@ -63,7 +63,8 @@ public function checkItem(CheckItem|string $check): bool
}
$check = $found;
}
- $this->output?->write("Checking {$check->item_name} ... ");
+ $prepend = $interactive ? ' - ' : '';
+ $this->output?->write("{$prepend}Checking {$check->item_name} ... ");
// call check
$result = call_user_func($check->callback);
diff --git a/src/StaticPHP/Doctor/Item/LinuxMuslCheck.php b/src/StaticPHP/Doctor/Item/LinuxMuslCheck.php
index 1cfc7afdd..4d7a86bee 100644
--- a/src/StaticPHP/Doctor/Item/LinuxMuslCheck.php
+++ b/src/StaticPHP/Doctor/Item/LinuxMuslCheck.php
@@ -13,6 +13,7 @@
use StaticPHP\DI\ApplicationContext;
use StaticPHP\Doctor\CheckResult;
use StaticPHP\Runtime\Shell\Shell;
+use StaticPHP\Toolchain\Interface\ToolchainInterface;
use StaticPHP\Toolchain\MuslToolchain;
use StaticPHP\Toolchain\ZigToolchain;
use StaticPHP\Util\FileSystem;
@@ -25,8 +26,8 @@ class LinuxMuslCheck
{
public static function optionalCheck(): bool
{
- return getenv('SPC_TOOLCHAIN') === MuslToolchain::class ||
- (getenv('SPC_TOOLCHAIN') === ZigToolchain::class && !LinuxUtil::isMuslDist());
+ $toolchain = ApplicationContext::get(ToolchainInterface::class);
+ return $toolchain instanceof MuslToolchain || $toolchain instanceof ZigToolchain && !LinuxUtil::isMuslDist();
}
/** @noinspection PhpUnused */
diff --git a/src/StaticPHP/Util/System/LinuxUtil.php b/src/StaticPHP/Util/System/LinuxUtil.php
index 570907d9e..79ad89ed7 100644
--- a/src/StaticPHP/Util/System/LinuxUtil.php
+++ b/src/StaticPHP/Util/System/LinuxUtil.php
@@ -13,13 +13,14 @@ class LinuxUtil extends UnixUtil
* Get current linux distro name and version.
*
* @noinspection PhpMissingBreakStatementInspection
- * @return array{dist: string, ver: string} Linux distro info (unknown if not found)
+ * @return array{dist: string, ver: string, family: string} Linux distro info (unknown if not found)
*/
public static function getOSRelease(): array
{
$ret = [
'dist' => 'unknown',
'ver' => 'unknown',
+ 'family' => 'unknown',
];
switch (true) {
case file_exists('/etc/centos-release'):
@@ -44,6 +45,9 @@ public static function getOSRelease(): array
if (preg_match('/^ID=(.*)$/', $line, $matches)) {
$ret['dist'] = $matches[1];
}
+ if (preg_match('/^ID_LIKE=(.*)$/', $line, $matches)) {
+ $ret['family'] = $matches[1];
+ }
if (preg_match('/^VERSION_ID=(.*)$/', $line, $matches)) {
$ret['ver'] = $matches[1];
}
@@ -103,6 +107,16 @@ public static function getSupportedDistros(): array
];
}
+ /**
+ * Check if current linux distro is debian-based.
+ */
+ public static function isDebianDist(): bool
+ {
+ $dist = static::getOSRelease()['dist'];
+ $family = explode(' ', static::getOSRelease()['family']);
+ return in_array($dist, ['debian', 'ubuntu', 'Deepin', 'neon']) || in_array('debian', $family);
+ }
+
/**
* Get libc version string from ldd.
*/