18c2ecf20Sopenharmony_ci#!/usr/bin/env perl
28c2ecf20Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0-or-later
38c2ecf20Sopenharmony_ciuse strict;
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci# Copyright (c) 2017-2020 Mauro Carvalho Chehab <mchehab@kernel.org>
68c2ecf20Sopenharmony_ci#
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_cimy $prefix = "./";
98c2ecf20Sopenharmony_ci$prefix = "$ENV{'srctree'}/" if ($ENV{'srctree'});
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_cimy $conf = $prefix . "Documentation/conf.py";
128c2ecf20Sopenharmony_cimy $requirement_file = $prefix . "Documentation/sphinx/requirements.txt";
138c2ecf20Sopenharmony_cimy $virtenv_prefix = "sphinx_";
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#
168c2ecf20Sopenharmony_ci# Static vars
178c2ecf20Sopenharmony_ci#
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_cimy %missing;
208c2ecf20Sopenharmony_cimy $system_release;
218c2ecf20Sopenharmony_cimy $need = 0;
228c2ecf20Sopenharmony_cimy $optional = 0;
238c2ecf20Sopenharmony_cimy $need_symlink = 0;
248c2ecf20Sopenharmony_cimy $need_sphinx = 0;
258c2ecf20Sopenharmony_cimy $need_venv = 0;
268c2ecf20Sopenharmony_cimy $need_virtualenv = 0;
278c2ecf20Sopenharmony_cimy $rec_sphinx_upgrade = 0;
288c2ecf20Sopenharmony_cimy $install = "";
298c2ecf20Sopenharmony_cimy $virtenv_dir = "";
308c2ecf20Sopenharmony_cimy $python_cmd = "";
318c2ecf20Sopenharmony_cimy $min_version;
328c2ecf20Sopenharmony_cimy $cur_version;
338c2ecf20Sopenharmony_cimy $rec_version = "1.7.9";	# PDF won't build here
348c2ecf20Sopenharmony_cimy $min_pdf_version = "2.4.4";	# Min version where pdf builds
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci#
378c2ecf20Sopenharmony_ci# Command line arguments
388c2ecf20Sopenharmony_ci#
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_cimy $pdf = 1;
418c2ecf20Sopenharmony_cimy $virtualenv = 1;
428c2ecf20Sopenharmony_cimy $version_check = 0;
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci#
458c2ecf20Sopenharmony_ci# List of required texlive packages on Fedora and OpenSuse
468c2ecf20Sopenharmony_ci#
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_cimy %texlive = (
498c2ecf20Sopenharmony_ci	'amsfonts.sty'       => 'texlive-amsfonts',
508c2ecf20Sopenharmony_ci	'amsmath.sty'        => 'texlive-amsmath',
518c2ecf20Sopenharmony_ci	'amssymb.sty'        => 'texlive-amsfonts',
528c2ecf20Sopenharmony_ci	'amsthm.sty'         => 'texlive-amscls',
538c2ecf20Sopenharmony_ci	'anyfontsize.sty'    => 'texlive-anyfontsize',
548c2ecf20Sopenharmony_ci	'atbegshi.sty'       => 'texlive-oberdiek',
558c2ecf20Sopenharmony_ci	'bm.sty'             => 'texlive-tools',
568c2ecf20Sopenharmony_ci	'capt-of.sty'        => 'texlive-capt-of',
578c2ecf20Sopenharmony_ci	'cmap.sty'           => 'texlive-cmap',
588c2ecf20Sopenharmony_ci	'ecrm1000.tfm'       => 'texlive-ec',
598c2ecf20Sopenharmony_ci	'eqparbox.sty'       => 'texlive-eqparbox',
608c2ecf20Sopenharmony_ci	'eu1enc.def'         => 'texlive-euenc',
618c2ecf20Sopenharmony_ci	'fancybox.sty'       => 'texlive-fancybox',
628c2ecf20Sopenharmony_ci	'fancyvrb.sty'       => 'texlive-fancyvrb',
638c2ecf20Sopenharmony_ci	'float.sty'          => 'texlive-float',
648c2ecf20Sopenharmony_ci	'fncychap.sty'       => 'texlive-fncychap',
658c2ecf20Sopenharmony_ci	'footnote.sty'       => 'texlive-mdwtools',
668c2ecf20Sopenharmony_ci	'framed.sty'         => 'texlive-framed',
678c2ecf20Sopenharmony_ci	'luatex85.sty'       => 'texlive-luatex85',
688c2ecf20Sopenharmony_ci	'multirow.sty'       => 'texlive-multirow',
698c2ecf20Sopenharmony_ci	'needspace.sty'      => 'texlive-needspace',
708c2ecf20Sopenharmony_ci	'palatino.sty'       => 'texlive-psnfss',
718c2ecf20Sopenharmony_ci	'parskip.sty'        => 'texlive-parskip',
728c2ecf20Sopenharmony_ci	'polyglossia.sty'    => 'texlive-polyglossia',
738c2ecf20Sopenharmony_ci	'tabulary.sty'       => 'texlive-tabulary',
748c2ecf20Sopenharmony_ci	'threeparttable.sty' => 'texlive-threeparttable',
758c2ecf20Sopenharmony_ci	'titlesec.sty'       => 'texlive-titlesec',
768c2ecf20Sopenharmony_ci	'ucs.sty'            => 'texlive-ucs',
778c2ecf20Sopenharmony_ci	'upquote.sty'        => 'texlive-upquote',
788c2ecf20Sopenharmony_ci	'wrapfig.sty'        => 'texlive-wrapfig',
798c2ecf20Sopenharmony_ci	'ctexhook.sty'       => 'texlive-ctex',
808c2ecf20Sopenharmony_ci);
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_ci#
838c2ecf20Sopenharmony_ci# Subroutines that checks if a feature exists
848c2ecf20Sopenharmony_ci#
858c2ecf20Sopenharmony_ci
868c2ecf20Sopenharmony_cisub check_missing(%)
878c2ecf20Sopenharmony_ci{
888c2ecf20Sopenharmony_ci	my %map = %{$_[0]};
898c2ecf20Sopenharmony_ci
908c2ecf20Sopenharmony_ci	foreach my $prog (sort keys %missing) {
918c2ecf20Sopenharmony_ci		my $is_optional = $missing{$prog};
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_ci		# At least on some LTS distros like CentOS 7, texlive doesn't
948c2ecf20Sopenharmony_ci		# provide all packages we need. When such distros are
958c2ecf20Sopenharmony_ci		# detected, we have to disable PDF output.
968c2ecf20Sopenharmony_ci		#
978c2ecf20Sopenharmony_ci		# So, we need to ignore the packages that distros would
988c2ecf20Sopenharmony_ci		# need for LaTeX to work
998c2ecf20Sopenharmony_ci		if ($is_optional == 2 && !$pdf) {
1008c2ecf20Sopenharmony_ci			$optional--;
1018c2ecf20Sopenharmony_ci			next;
1028c2ecf20Sopenharmony_ci		}
1038c2ecf20Sopenharmony_ci
1048c2ecf20Sopenharmony_ci		if ($is_optional) {
1058c2ecf20Sopenharmony_ci			print "Warning: better to also install \"$prog\".\n";
1068c2ecf20Sopenharmony_ci		} else {
1078c2ecf20Sopenharmony_ci			print "ERROR: please install \"$prog\", otherwise, build won't work.\n";
1088c2ecf20Sopenharmony_ci		}
1098c2ecf20Sopenharmony_ci		if (defined($map{$prog})) {
1108c2ecf20Sopenharmony_ci			$install .= " " . $map{$prog};
1118c2ecf20Sopenharmony_ci		} else {
1128c2ecf20Sopenharmony_ci			$install .= " " . $prog;
1138c2ecf20Sopenharmony_ci		}
1148c2ecf20Sopenharmony_ci	}
1158c2ecf20Sopenharmony_ci
1168c2ecf20Sopenharmony_ci	$install =~ s/^\s//;
1178c2ecf20Sopenharmony_ci}
1188c2ecf20Sopenharmony_ci
1198c2ecf20Sopenharmony_cisub add_package($$)
1208c2ecf20Sopenharmony_ci{
1218c2ecf20Sopenharmony_ci	my $package = shift;
1228c2ecf20Sopenharmony_ci	my $is_optional = shift;
1238c2ecf20Sopenharmony_ci
1248c2ecf20Sopenharmony_ci	$missing{$package} = $is_optional;
1258c2ecf20Sopenharmony_ci	if ($is_optional) {
1268c2ecf20Sopenharmony_ci		$optional++;
1278c2ecf20Sopenharmony_ci	} else {
1288c2ecf20Sopenharmony_ci		$need++;
1298c2ecf20Sopenharmony_ci	}
1308c2ecf20Sopenharmony_ci}
1318c2ecf20Sopenharmony_ci
1328c2ecf20Sopenharmony_cisub check_missing_file($$$)
1338c2ecf20Sopenharmony_ci{
1348c2ecf20Sopenharmony_ci	my $files = shift;
1358c2ecf20Sopenharmony_ci	my $package = shift;
1368c2ecf20Sopenharmony_ci	my $is_optional = shift;
1378c2ecf20Sopenharmony_ci
1388c2ecf20Sopenharmony_ci	for (@$files) {
1398c2ecf20Sopenharmony_ci		return if(-e $_);
1408c2ecf20Sopenharmony_ci	}
1418c2ecf20Sopenharmony_ci
1428c2ecf20Sopenharmony_ci	add_package($package, $is_optional);
1438c2ecf20Sopenharmony_ci}
1448c2ecf20Sopenharmony_ci
1458c2ecf20Sopenharmony_cisub findprog($)
1468c2ecf20Sopenharmony_ci{
1478c2ecf20Sopenharmony_ci	foreach(split(/:/, $ENV{PATH})) {
1488c2ecf20Sopenharmony_ci		return "$_/$_[0]" if(-x "$_/$_[0]");
1498c2ecf20Sopenharmony_ci	}
1508c2ecf20Sopenharmony_ci}
1518c2ecf20Sopenharmony_ci
1528c2ecf20Sopenharmony_cisub find_python_no_venv()
1538c2ecf20Sopenharmony_ci{
1548c2ecf20Sopenharmony_ci	my $prog = shift;
1558c2ecf20Sopenharmony_ci
1568c2ecf20Sopenharmony_ci	my $cur_dir = qx(pwd);
1578c2ecf20Sopenharmony_ci	$cur_dir =~ s/\s+$//;
1588c2ecf20Sopenharmony_ci
1598c2ecf20Sopenharmony_ci	foreach my $dir (split(/:/, $ENV{PATH})) {
1608c2ecf20Sopenharmony_ci		next if ($dir =~ m,($cur_dir)/sphinx,);
1618c2ecf20Sopenharmony_ci		return "$dir/python3" if(-x "$dir/python3");
1628c2ecf20Sopenharmony_ci	}
1638c2ecf20Sopenharmony_ci	foreach my $dir (split(/:/, $ENV{PATH})) {
1648c2ecf20Sopenharmony_ci		next if ($dir =~ m,($cur_dir)/sphinx,);
1658c2ecf20Sopenharmony_ci		return "$dir/python" if(-x "$dir/python");
1668c2ecf20Sopenharmony_ci	}
1678c2ecf20Sopenharmony_ci	return "python";
1688c2ecf20Sopenharmony_ci}
1698c2ecf20Sopenharmony_ci
1708c2ecf20Sopenharmony_cisub check_program($$)
1718c2ecf20Sopenharmony_ci{
1728c2ecf20Sopenharmony_ci	my $prog = shift;
1738c2ecf20Sopenharmony_ci	my $is_optional = shift;
1748c2ecf20Sopenharmony_ci
1758c2ecf20Sopenharmony_ci	return $prog if findprog($prog);
1768c2ecf20Sopenharmony_ci
1778c2ecf20Sopenharmony_ci	add_package($prog, $is_optional);
1788c2ecf20Sopenharmony_ci}
1798c2ecf20Sopenharmony_ci
1808c2ecf20Sopenharmony_cisub check_perl_module($$)
1818c2ecf20Sopenharmony_ci{
1828c2ecf20Sopenharmony_ci	my $prog = shift;
1838c2ecf20Sopenharmony_ci	my $is_optional = shift;
1848c2ecf20Sopenharmony_ci
1858c2ecf20Sopenharmony_ci	my $err = system("perl -M$prog -e 1 2>/dev/null /dev/null");
1868c2ecf20Sopenharmony_ci	return if ($err == 0);
1878c2ecf20Sopenharmony_ci
1888c2ecf20Sopenharmony_ci	add_package($prog, $is_optional);
1898c2ecf20Sopenharmony_ci}
1908c2ecf20Sopenharmony_ci
1918c2ecf20Sopenharmony_cisub check_python_module($$)
1928c2ecf20Sopenharmony_ci{
1938c2ecf20Sopenharmony_ci	my $prog = shift;
1948c2ecf20Sopenharmony_ci	my $is_optional = shift;
1958c2ecf20Sopenharmony_ci
1968c2ecf20Sopenharmony_ci	return if (!$python_cmd);
1978c2ecf20Sopenharmony_ci
1988c2ecf20Sopenharmony_ci	my $err = system("$python_cmd -c 'import $prog' 2>/dev/null /dev/null");
1998c2ecf20Sopenharmony_ci	return if ($err == 0);
2008c2ecf20Sopenharmony_ci
2018c2ecf20Sopenharmony_ci	add_package($prog, $is_optional);
2028c2ecf20Sopenharmony_ci}
2038c2ecf20Sopenharmony_ci
2048c2ecf20Sopenharmony_cisub check_rpm_missing($$)
2058c2ecf20Sopenharmony_ci{
2068c2ecf20Sopenharmony_ci	my @pkgs = @{$_[0]};
2078c2ecf20Sopenharmony_ci	my $is_optional = $_[1];
2088c2ecf20Sopenharmony_ci
2098c2ecf20Sopenharmony_ci	foreach my $prog(@pkgs) {
2108c2ecf20Sopenharmony_ci		my $err = system("rpm -q '$prog' 2>/dev/null >/dev/null");
2118c2ecf20Sopenharmony_ci		add_package($prog, $is_optional) if ($err);
2128c2ecf20Sopenharmony_ci	}
2138c2ecf20Sopenharmony_ci}
2148c2ecf20Sopenharmony_ci
2158c2ecf20Sopenharmony_cisub check_pacman_missing($$)
2168c2ecf20Sopenharmony_ci{
2178c2ecf20Sopenharmony_ci	my @pkgs = @{$_[0]};
2188c2ecf20Sopenharmony_ci	my $is_optional = $_[1];
2198c2ecf20Sopenharmony_ci
2208c2ecf20Sopenharmony_ci	foreach my $prog(@pkgs) {
2218c2ecf20Sopenharmony_ci		my $err = system("pacman -Q '$prog' 2>/dev/null >/dev/null");
2228c2ecf20Sopenharmony_ci		add_package($prog, $is_optional) if ($err);
2238c2ecf20Sopenharmony_ci	}
2248c2ecf20Sopenharmony_ci}
2258c2ecf20Sopenharmony_ci
2268c2ecf20Sopenharmony_cisub check_missing_tex($)
2278c2ecf20Sopenharmony_ci{
2288c2ecf20Sopenharmony_ci	my $is_optional = shift;
2298c2ecf20Sopenharmony_ci	my $kpsewhich = findprog("kpsewhich");
2308c2ecf20Sopenharmony_ci
2318c2ecf20Sopenharmony_ci	foreach my $prog(keys %texlive) {
2328c2ecf20Sopenharmony_ci		my $package = $texlive{$prog};
2338c2ecf20Sopenharmony_ci		if (!$kpsewhich) {
2348c2ecf20Sopenharmony_ci			add_package($package, $is_optional);
2358c2ecf20Sopenharmony_ci			next;
2368c2ecf20Sopenharmony_ci		}
2378c2ecf20Sopenharmony_ci		my $file = qx($kpsewhich $prog);
2388c2ecf20Sopenharmony_ci		add_package($package, $is_optional) if ($file =~ /^\s*$/);
2398c2ecf20Sopenharmony_ci	}
2408c2ecf20Sopenharmony_ci}
2418c2ecf20Sopenharmony_ci
2428c2ecf20Sopenharmony_cisub get_sphinx_fname()
2438c2ecf20Sopenharmony_ci{
2448c2ecf20Sopenharmony_ci	my $fname = "sphinx-build";
2458c2ecf20Sopenharmony_ci	return $fname if findprog($fname);
2468c2ecf20Sopenharmony_ci
2478c2ecf20Sopenharmony_ci	$fname = "sphinx-build-3";
2488c2ecf20Sopenharmony_ci	if (findprog($fname)) {
2498c2ecf20Sopenharmony_ci		$need_symlink = 1;
2508c2ecf20Sopenharmony_ci		return $fname;
2518c2ecf20Sopenharmony_ci	}
2528c2ecf20Sopenharmony_ci
2538c2ecf20Sopenharmony_ci	return "";
2548c2ecf20Sopenharmony_ci}
2558c2ecf20Sopenharmony_ci
2568c2ecf20Sopenharmony_cisub get_sphinx_version($)
2578c2ecf20Sopenharmony_ci{
2588c2ecf20Sopenharmony_ci	my $cmd = shift;
2598c2ecf20Sopenharmony_ci	my $ver;
2608c2ecf20Sopenharmony_ci
2618c2ecf20Sopenharmony_ci	open IN, "$cmd --version 2>&1 |";
2628c2ecf20Sopenharmony_ci	while (<IN>) {
2638c2ecf20Sopenharmony_ci		if (m/^\s*sphinx-build\s+([\d\.]+)(\+\/[\da-f]+)?$/) {
2648c2ecf20Sopenharmony_ci			$ver=$1;
2658c2ecf20Sopenharmony_ci			last;
2668c2ecf20Sopenharmony_ci		}
2678c2ecf20Sopenharmony_ci		# Sphinx 1.2.x uses a different format
2688c2ecf20Sopenharmony_ci		if (m/^\s*Sphinx.*\s+([\d\.]+)$/) {
2698c2ecf20Sopenharmony_ci			$ver=$1;
2708c2ecf20Sopenharmony_ci			last;
2718c2ecf20Sopenharmony_ci		}
2728c2ecf20Sopenharmony_ci	}
2738c2ecf20Sopenharmony_ci	close IN;
2748c2ecf20Sopenharmony_ci	return $ver;
2758c2ecf20Sopenharmony_ci}
2768c2ecf20Sopenharmony_ci
2778c2ecf20Sopenharmony_cisub check_sphinx()
2788c2ecf20Sopenharmony_ci{
2798c2ecf20Sopenharmony_ci	my $default_version;
2808c2ecf20Sopenharmony_ci
2818c2ecf20Sopenharmony_ci	open IN, $conf or die "Can't open $conf";
2828c2ecf20Sopenharmony_ci	while (<IN>) {
2838c2ecf20Sopenharmony_ci		if (m/^\s*needs_sphinx\s*=\s*[\'\"]([\d\.]+)[\'\"]/) {
2848c2ecf20Sopenharmony_ci			$min_version=$1;
2858c2ecf20Sopenharmony_ci			last;
2868c2ecf20Sopenharmony_ci		}
2878c2ecf20Sopenharmony_ci	}
2888c2ecf20Sopenharmony_ci	close IN;
2898c2ecf20Sopenharmony_ci
2908c2ecf20Sopenharmony_ci	die "Can't get needs_sphinx version from $conf" if (!$min_version);
2918c2ecf20Sopenharmony_ci
2928c2ecf20Sopenharmony_ci	open IN, $requirement_file or die "Can't open $requirement_file";
2938c2ecf20Sopenharmony_ci	while (<IN>) {
2948c2ecf20Sopenharmony_ci		if (m/^\s*Sphinx\s*==\s*([\d\.]+)$/) {
2958c2ecf20Sopenharmony_ci			$default_version=$1;
2968c2ecf20Sopenharmony_ci			last;
2978c2ecf20Sopenharmony_ci		}
2988c2ecf20Sopenharmony_ci	}
2998c2ecf20Sopenharmony_ci	close IN;
3008c2ecf20Sopenharmony_ci
3018c2ecf20Sopenharmony_ci	die "Can't get default sphinx version from $requirement_file" if (!$default_version);
3028c2ecf20Sopenharmony_ci
3038c2ecf20Sopenharmony_ci	$virtenv_dir = $virtenv_prefix . $default_version;
3048c2ecf20Sopenharmony_ci
3058c2ecf20Sopenharmony_ci	my $sphinx = get_sphinx_fname();
3068c2ecf20Sopenharmony_ci	if ($sphinx eq "") {
3078c2ecf20Sopenharmony_ci		$need_sphinx = 1;
3088c2ecf20Sopenharmony_ci		return;
3098c2ecf20Sopenharmony_ci	}
3108c2ecf20Sopenharmony_ci
3118c2ecf20Sopenharmony_ci	$cur_version = get_sphinx_version($sphinx);
3128c2ecf20Sopenharmony_ci	die ("$sphinx returned an error") if (!$cur_version);
3138c2ecf20Sopenharmony_ci
3148c2ecf20Sopenharmony_ci	die "$sphinx didn't return its version" if (!$cur_version);
3158c2ecf20Sopenharmony_ci
3168c2ecf20Sopenharmony_ci	if ($cur_version lt $min_version) {
3178c2ecf20Sopenharmony_ci		printf "ERROR: Sphinx version is %s. It should be >= %s (recommended >= %s)\n",
3188c2ecf20Sopenharmony_ci		       $cur_version, $min_version, $default_version;
3198c2ecf20Sopenharmony_ci		$need_sphinx = 1;
3208c2ecf20Sopenharmony_ci		return;
3218c2ecf20Sopenharmony_ci	}
3228c2ecf20Sopenharmony_ci
3238c2ecf20Sopenharmony_ci	if ($cur_version lt $rec_version) {
3248c2ecf20Sopenharmony_ci		$rec_sphinx_upgrade = 1;
3258c2ecf20Sopenharmony_ci		return;
3268c2ecf20Sopenharmony_ci	}
3278c2ecf20Sopenharmony_ci
3288c2ecf20Sopenharmony_ci	# On version check mode, just assume Sphinx has all mandatory deps
3298c2ecf20Sopenharmony_ci	exit (0) if ($version_check);
3308c2ecf20Sopenharmony_ci}
3318c2ecf20Sopenharmony_ci
3328c2ecf20Sopenharmony_ci#
3338c2ecf20Sopenharmony_ci# Ancillary subroutines
3348c2ecf20Sopenharmony_ci#
3358c2ecf20Sopenharmony_ci
3368c2ecf20Sopenharmony_cisub catcheck($)
3378c2ecf20Sopenharmony_ci{
3388c2ecf20Sopenharmony_ci  my $res = "";
3398c2ecf20Sopenharmony_ci  $res = qx(cat $_[0]) if (-r $_[0]);
3408c2ecf20Sopenharmony_ci  return $res;
3418c2ecf20Sopenharmony_ci}
3428c2ecf20Sopenharmony_ci
3438c2ecf20Sopenharmony_cisub which($)
3448c2ecf20Sopenharmony_ci{
3458c2ecf20Sopenharmony_ci	my $file = shift;
3468c2ecf20Sopenharmony_ci	my @path = split ":", $ENV{PATH};
3478c2ecf20Sopenharmony_ci
3488c2ecf20Sopenharmony_ci	foreach my $dir(@path) {
3498c2ecf20Sopenharmony_ci		my $name = $dir.'/'.$file;
3508c2ecf20Sopenharmony_ci		return $name if (-x $name );
3518c2ecf20Sopenharmony_ci	}
3528c2ecf20Sopenharmony_ci	return undef;
3538c2ecf20Sopenharmony_ci}
3548c2ecf20Sopenharmony_ci
3558c2ecf20Sopenharmony_ci#
3568c2ecf20Sopenharmony_ci# Subroutines that check distro-specific hints
3578c2ecf20Sopenharmony_ci#
3588c2ecf20Sopenharmony_ci
3598c2ecf20Sopenharmony_cisub give_debian_hints()
3608c2ecf20Sopenharmony_ci{
3618c2ecf20Sopenharmony_ci	my %map = (
3628c2ecf20Sopenharmony_ci		"python-sphinx"		=> "python3-sphinx",
3638c2ecf20Sopenharmony_ci		"sphinx_rtd_theme"	=> "python3-sphinx-rtd-theme",
3648c2ecf20Sopenharmony_ci		"ensurepip"		=> "python3-venv",
3658c2ecf20Sopenharmony_ci		"virtualenv"		=> "virtualenv",
3668c2ecf20Sopenharmony_ci		"dot"			=> "graphviz",
3678c2ecf20Sopenharmony_ci		"convert"		=> "imagemagick",
3688c2ecf20Sopenharmony_ci		"Pod::Usage"		=> "perl-modules",
3698c2ecf20Sopenharmony_ci		"xelatex"		=> "texlive-xetex",
3708c2ecf20Sopenharmony_ci		"rsvg-convert"		=> "librsvg2-bin",
3718c2ecf20Sopenharmony_ci	);
3728c2ecf20Sopenharmony_ci
3738c2ecf20Sopenharmony_ci	if ($pdf) {
3748c2ecf20Sopenharmony_ci		check_missing_file(["/usr/share/texlive/texmf-dist/tex/latex/ctex/ctexhook.sty"],
3758c2ecf20Sopenharmony_ci				   "texlive-lang-chinese", 2);
3768c2ecf20Sopenharmony_ci
3778c2ecf20Sopenharmony_ci		check_missing_file(["/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"],
3788c2ecf20Sopenharmony_ci				   "fonts-dejavu", 2);
3798c2ecf20Sopenharmony_ci
3808c2ecf20Sopenharmony_ci		check_missing_file(["/usr/share/fonts/noto-cjk/NotoSansCJK-Regular.ttc",
3818c2ecf20Sopenharmony_ci				    "/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc",
3828c2ecf20Sopenharmony_ci				    "/usr/share/fonts/opentype/noto/NotoSerifCJK-Regular.ttc"],
3838c2ecf20Sopenharmony_ci				   "fonts-noto-cjk", 2);
3848c2ecf20Sopenharmony_ci	}
3858c2ecf20Sopenharmony_ci
3868c2ecf20Sopenharmony_ci	check_program("dvipng", 2) if ($pdf);
3878c2ecf20Sopenharmony_ci	check_missing(\%map);
3888c2ecf20Sopenharmony_ci
3898c2ecf20Sopenharmony_ci	return if (!$need && !$optional);
3908c2ecf20Sopenharmony_ci	printf("You should run:\n\n\tsudo apt-get install $install\n");
3918c2ecf20Sopenharmony_ci}
3928c2ecf20Sopenharmony_ci
3938c2ecf20Sopenharmony_cisub give_redhat_hints()
3948c2ecf20Sopenharmony_ci{
3958c2ecf20Sopenharmony_ci	my %map = (
3968c2ecf20Sopenharmony_ci		"python-sphinx"		=> "python3-sphinx",
3978c2ecf20Sopenharmony_ci		"sphinx_rtd_theme"	=> "python3-sphinx_rtd_theme",
3988c2ecf20Sopenharmony_ci		"virtualenv"		=> "python3-virtualenv",
3998c2ecf20Sopenharmony_ci		"dot"			=> "graphviz",
4008c2ecf20Sopenharmony_ci		"convert"		=> "ImageMagick",
4018c2ecf20Sopenharmony_ci		"Pod::Usage"		=> "perl-Pod-Usage",
4028c2ecf20Sopenharmony_ci		"xelatex"		=> "texlive-xetex-bin",
4038c2ecf20Sopenharmony_ci		"rsvg-convert"		=> "librsvg2-tools",
4048c2ecf20Sopenharmony_ci	);
4058c2ecf20Sopenharmony_ci
4068c2ecf20Sopenharmony_ci	my @fedora26_opt_pkgs = (
4078c2ecf20Sopenharmony_ci		"graphviz-gd",		# Fedora 26: needed for PDF support
4088c2ecf20Sopenharmony_ci	);
4098c2ecf20Sopenharmony_ci
4108c2ecf20Sopenharmony_ci	my @fedora_tex_pkgs = (
4118c2ecf20Sopenharmony_ci		"texlive-collection-fontsrecommended",
4128c2ecf20Sopenharmony_ci		"texlive-collection-latex",
4138c2ecf20Sopenharmony_ci		"texlive-xecjk",
4148c2ecf20Sopenharmony_ci		"dejavu-sans-fonts",
4158c2ecf20Sopenharmony_ci		"dejavu-serif-fonts",
4168c2ecf20Sopenharmony_ci		"dejavu-sans-mono-fonts",
4178c2ecf20Sopenharmony_ci	);
4188c2ecf20Sopenharmony_ci
4198c2ecf20Sopenharmony_ci	#
4208c2ecf20Sopenharmony_ci	# Checks valid for RHEL/CentOS version 7.x.
4218c2ecf20Sopenharmony_ci	#
4228c2ecf20Sopenharmony_ci	my $old = 0;
4238c2ecf20Sopenharmony_ci	my $rel;
4248c2ecf20Sopenharmony_ci	$rel = $1 if ($system_release =~ /release\s+(\d+)/);
4258c2ecf20Sopenharmony_ci
4268c2ecf20Sopenharmony_ci	if (!($system_release =~ /Fedora/)) {
4278c2ecf20Sopenharmony_ci		$map{"virtualenv"} = "python-virtualenv";
4288c2ecf20Sopenharmony_ci
4298c2ecf20Sopenharmony_ci		if ($rel && $rel < 8) {
4308c2ecf20Sopenharmony_ci			$old = 1;
4318c2ecf20Sopenharmony_ci			$pdf = 0;
4328c2ecf20Sopenharmony_ci
4338c2ecf20Sopenharmony_ci			printf("Note: texlive packages on RHEL/CENTOS <= 7 are incomplete. Can't support PDF output\n");
4348c2ecf20Sopenharmony_ci			printf("If you want to build PDF, please read:\n");
4358c2ecf20Sopenharmony_ci			printf("\thttps://www.systutorials.com/241660/how-to-install-tex-live-on-centos-7-linux/\n");
4368c2ecf20Sopenharmony_ci		}
4378c2ecf20Sopenharmony_ci	} else {
4388c2ecf20Sopenharmony_ci		if ($rel && $rel < 26) {
4398c2ecf20Sopenharmony_ci			$old = 1;
4408c2ecf20Sopenharmony_ci		}
4418c2ecf20Sopenharmony_ci	}
4428c2ecf20Sopenharmony_ci	if (!$rel) {
4438c2ecf20Sopenharmony_ci		printf("Couldn't identify release number\n");
4448c2ecf20Sopenharmony_ci		$old = 1;
4458c2ecf20Sopenharmony_ci		$pdf = 0;
4468c2ecf20Sopenharmony_ci	}
4478c2ecf20Sopenharmony_ci
4488c2ecf20Sopenharmony_ci	if ($pdf) {
4498c2ecf20Sopenharmony_ci		check_missing_file(["/usr/share/fonts/google-noto-cjk/NotoSansCJK-Regular.ttc"],
4508c2ecf20Sopenharmony_ci				   "google-noto-sans-cjk-ttc-fonts", 2);
4518c2ecf20Sopenharmony_ci	}
4528c2ecf20Sopenharmony_ci
4538c2ecf20Sopenharmony_ci	check_rpm_missing(\@fedora26_opt_pkgs, 2) if ($pdf && !$old);
4548c2ecf20Sopenharmony_ci	check_rpm_missing(\@fedora_tex_pkgs, 2) if ($pdf);
4558c2ecf20Sopenharmony_ci	check_missing_tex(2) if ($pdf);
4568c2ecf20Sopenharmony_ci	check_missing(\%map);
4578c2ecf20Sopenharmony_ci
4588c2ecf20Sopenharmony_ci	return if (!$need && !$optional);
4598c2ecf20Sopenharmony_ci
4608c2ecf20Sopenharmony_ci	if (!$old) {
4618c2ecf20Sopenharmony_ci		# dnf, for Fedora 18+
4628c2ecf20Sopenharmony_ci		printf("You should run:\n\n\tsudo dnf install -y $install\n");
4638c2ecf20Sopenharmony_ci	} else {
4648c2ecf20Sopenharmony_ci		# yum, for RHEL (and clones) or Fedora version < 18
4658c2ecf20Sopenharmony_ci		printf("You should run:\n\n\tsudo yum install -y $install\n");
4668c2ecf20Sopenharmony_ci	}
4678c2ecf20Sopenharmony_ci}
4688c2ecf20Sopenharmony_ci
4698c2ecf20Sopenharmony_cisub give_opensuse_hints()
4708c2ecf20Sopenharmony_ci{
4718c2ecf20Sopenharmony_ci	my %map = (
4728c2ecf20Sopenharmony_ci		"python-sphinx"		=> "python3-sphinx",
4738c2ecf20Sopenharmony_ci		"sphinx_rtd_theme"	=> "python3-sphinx_rtd_theme",
4748c2ecf20Sopenharmony_ci		"virtualenv"		=> "python3-virtualenv",
4758c2ecf20Sopenharmony_ci		"dot"			=> "graphviz",
4768c2ecf20Sopenharmony_ci		"convert"		=> "ImageMagick",
4778c2ecf20Sopenharmony_ci		"Pod::Usage"		=> "perl-Pod-Usage",
4788c2ecf20Sopenharmony_ci		"xelatex"		=> "texlive-xetex-bin",
4798c2ecf20Sopenharmony_ci	);
4808c2ecf20Sopenharmony_ci
4818c2ecf20Sopenharmony_ci	# On Tumbleweed, this package is also named rsvg-convert
4828c2ecf20Sopenharmony_ci	$map{"rsvg-convert"} = "rsvg-view" if (!($system_release =~ /Tumbleweed/));
4838c2ecf20Sopenharmony_ci
4848c2ecf20Sopenharmony_ci	my @suse_tex_pkgs = (
4858c2ecf20Sopenharmony_ci		"texlive-babel-english",
4868c2ecf20Sopenharmony_ci		"texlive-caption",
4878c2ecf20Sopenharmony_ci		"texlive-colortbl",
4888c2ecf20Sopenharmony_ci		"texlive-courier",
4898c2ecf20Sopenharmony_ci		"texlive-dvips",
4908c2ecf20Sopenharmony_ci		"texlive-helvetic",
4918c2ecf20Sopenharmony_ci		"texlive-makeindex",
4928c2ecf20Sopenharmony_ci		"texlive-metafont",
4938c2ecf20Sopenharmony_ci		"texlive-metapost",
4948c2ecf20Sopenharmony_ci		"texlive-palatino",
4958c2ecf20Sopenharmony_ci		"texlive-preview",
4968c2ecf20Sopenharmony_ci		"texlive-times",
4978c2ecf20Sopenharmony_ci		"texlive-zapfchan",
4988c2ecf20Sopenharmony_ci		"texlive-zapfding",
4998c2ecf20Sopenharmony_ci	);
5008c2ecf20Sopenharmony_ci
5018c2ecf20Sopenharmony_ci	$map{"latexmk"} = "texlive-latexmk-bin";
5028c2ecf20Sopenharmony_ci
5038c2ecf20Sopenharmony_ci	# FIXME: add support for installing CJK fonts
5048c2ecf20Sopenharmony_ci	#
5058c2ecf20Sopenharmony_ci	# I tried hard, but was unable to find a way to install
5068c2ecf20Sopenharmony_ci	# "Noto Sans CJK SC" on openSUSE
5078c2ecf20Sopenharmony_ci
5088c2ecf20Sopenharmony_ci	check_rpm_missing(\@suse_tex_pkgs, 2) if ($pdf);
5098c2ecf20Sopenharmony_ci	check_missing_tex(2) if ($pdf);
5108c2ecf20Sopenharmony_ci	check_missing(\%map);
5118c2ecf20Sopenharmony_ci
5128c2ecf20Sopenharmony_ci	return if (!$need && !$optional);
5138c2ecf20Sopenharmony_ci	printf("You should run:\n\n\tsudo zypper install --no-recommends $install\n");
5148c2ecf20Sopenharmony_ci}
5158c2ecf20Sopenharmony_ci
5168c2ecf20Sopenharmony_cisub give_mageia_hints()
5178c2ecf20Sopenharmony_ci{
5188c2ecf20Sopenharmony_ci	my %map = (
5198c2ecf20Sopenharmony_ci		"python-sphinx"		=> "python3-sphinx",
5208c2ecf20Sopenharmony_ci		"sphinx_rtd_theme"	=> "python3-sphinx_rtd_theme",
5218c2ecf20Sopenharmony_ci		"virtualenv"		=> "python3-virtualenv",
5228c2ecf20Sopenharmony_ci		"dot"			=> "graphviz",
5238c2ecf20Sopenharmony_ci		"convert"		=> "ImageMagick",
5248c2ecf20Sopenharmony_ci		"Pod::Usage"		=> "perl-Pod-Usage",
5258c2ecf20Sopenharmony_ci		"xelatex"		=> "texlive",
5268c2ecf20Sopenharmony_ci		"rsvg-convert"		=> "librsvg2",
5278c2ecf20Sopenharmony_ci	);
5288c2ecf20Sopenharmony_ci
5298c2ecf20Sopenharmony_ci	my @tex_pkgs = (
5308c2ecf20Sopenharmony_ci		"texlive-fontsextra",
5318c2ecf20Sopenharmony_ci	);
5328c2ecf20Sopenharmony_ci
5338c2ecf20Sopenharmony_ci	$map{"latexmk"} = "texlive-collection-basic";
5348c2ecf20Sopenharmony_ci
5358c2ecf20Sopenharmony_ci	my $packager_cmd;
5368c2ecf20Sopenharmony_ci	my $noto_sans;
5378c2ecf20Sopenharmony_ci	if ($system_release =~ /OpenMandriva/) {
5388c2ecf20Sopenharmony_ci		$packager_cmd = "dnf install";
5398c2ecf20Sopenharmony_ci		$noto_sans = "noto-sans-cjk-fonts";
5408c2ecf20Sopenharmony_ci		@tex_pkgs = ( "texlive-collection-fontsextra" );
5418c2ecf20Sopenharmony_ci	} else {
5428c2ecf20Sopenharmony_ci		$packager_cmd = "urpmi";
5438c2ecf20Sopenharmony_ci		$noto_sans = "google-noto-sans-cjk-ttc-fonts";
5448c2ecf20Sopenharmony_ci	}
5458c2ecf20Sopenharmony_ci
5468c2ecf20Sopenharmony_ci
5478c2ecf20Sopenharmony_ci	if ($pdf) {
5488c2ecf20Sopenharmony_ci		check_missing_file(["/usr/share/fonts/google-noto-cjk/NotoSansCJK-Regular.ttc",
5498c2ecf20Sopenharmony_ci				    "/usr/share/fonts/TTF/NotoSans-Regular.ttf"],
5508c2ecf20Sopenharmony_ci				   $noto_sans, 2);
5518c2ecf20Sopenharmony_ci	}
5528c2ecf20Sopenharmony_ci
5538c2ecf20Sopenharmony_ci	check_rpm_missing(\@tex_pkgs, 2) if ($pdf);
5548c2ecf20Sopenharmony_ci	check_missing(\%map);
5558c2ecf20Sopenharmony_ci
5568c2ecf20Sopenharmony_ci	return if (!$need && !$optional);
5578c2ecf20Sopenharmony_ci	printf("You should run:\n\n\tsudo $packager_cmd $install\n");
5588c2ecf20Sopenharmony_ci}
5598c2ecf20Sopenharmony_ci
5608c2ecf20Sopenharmony_cisub give_arch_linux_hints()
5618c2ecf20Sopenharmony_ci{
5628c2ecf20Sopenharmony_ci	my %map = (
5638c2ecf20Sopenharmony_ci		"sphinx_rtd_theme"	=> "python-sphinx_rtd_theme",
5648c2ecf20Sopenharmony_ci		"virtualenv"		=> "python-virtualenv",
5658c2ecf20Sopenharmony_ci		"dot"			=> "graphviz",
5668c2ecf20Sopenharmony_ci		"convert"		=> "imagemagick",
5678c2ecf20Sopenharmony_ci		"xelatex"		=> "texlive-bin",
5688c2ecf20Sopenharmony_ci		"latexmk"		=> "texlive-core",
5698c2ecf20Sopenharmony_ci		"rsvg-convert"		=> "extra/librsvg",
5708c2ecf20Sopenharmony_ci	);
5718c2ecf20Sopenharmony_ci
5728c2ecf20Sopenharmony_ci	my @archlinux_tex_pkgs = (
5738c2ecf20Sopenharmony_ci		"texlive-core",
5748c2ecf20Sopenharmony_ci		"texlive-latexextra",
5758c2ecf20Sopenharmony_ci		"ttf-dejavu",
5768c2ecf20Sopenharmony_ci	);
5778c2ecf20Sopenharmony_ci	check_pacman_missing(\@archlinux_tex_pkgs, 2) if ($pdf);
5788c2ecf20Sopenharmony_ci
5798c2ecf20Sopenharmony_ci	if ($pdf) {
5808c2ecf20Sopenharmony_ci		check_missing_file(["/usr/share/fonts/noto-cjk/NotoSansCJK-Regular.ttc"],
5818c2ecf20Sopenharmony_ci				   "noto-fonts-cjk", 2);
5828c2ecf20Sopenharmony_ci	}
5838c2ecf20Sopenharmony_ci
5848c2ecf20Sopenharmony_ci	check_missing(\%map);
5858c2ecf20Sopenharmony_ci
5868c2ecf20Sopenharmony_ci	return if (!$need && !$optional);
5878c2ecf20Sopenharmony_ci	printf("You should run:\n\n\tsudo pacman -S $install\n");
5888c2ecf20Sopenharmony_ci}
5898c2ecf20Sopenharmony_ci
5908c2ecf20Sopenharmony_cisub give_gentoo_hints()
5918c2ecf20Sopenharmony_ci{
5928c2ecf20Sopenharmony_ci	my %map = (
5938c2ecf20Sopenharmony_ci		"sphinx_rtd_theme"	=> "dev-python/sphinx_rtd_theme",
5948c2ecf20Sopenharmony_ci		"virtualenv"		=> "dev-python/virtualenv",
5958c2ecf20Sopenharmony_ci		"dot"			=> "media-gfx/graphviz",
5968c2ecf20Sopenharmony_ci		"convert"		=> "media-gfx/imagemagick",
5978c2ecf20Sopenharmony_ci		"xelatex"		=> "dev-texlive/texlive-xetex media-fonts/dejavu",
5988c2ecf20Sopenharmony_ci		"rsvg-convert"		=> "gnome-base/librsvg",
5998c2ecf20Sopenharmony_ci	);
6008c2ecf20Sopenharmony_ci
6018c2ecf20Sopenharmony_ci	check_missing_file(["/usr/share/fonts/dejavu/DejaVuSans.ttf"],
6028c2ecf20Sopenharmony_ci			   "media-fonts/dejavu", 2) if ($pdf);
6038c2ecf20Sopenharmony_ci
6048c2ecf20Sopenharmony_ci	if ($pdf) {
6058c2ecf20Sopenharmony_ci		check_missing_file(["/usr/share/fonts/noto-cjk/NotoSansCJKsc-Regular.otf",
6068c2ecf20Sopenharmony_ci				    "/usr/share/fonts/noto-cjk/NotoSerifCJK-Regular.ttc"],
6078c2ecf20Sopenharmony_ci				   "media-fonts/noto-cjk", 2);
6088c2ecf20Sopenharmony_ci	}
6098c2ecf20Sopenharmony_ci
6108c2ecf20Sopenharmony_ci	check_missing(\%map);
6118c2ecf20Sopenharmony_ci
6128c2ecf20Sopenharmony_ci	return if (!$need && !$optional);
6138c2ecf20Sopenharmony_ci
6148c2ecf20Sopenharmony_ci	printf("You should run:\n\n");
6158c2ecf20Sopenharmony_ci
6168c2ecf20Sopenharmony_ci	my $imagemagick = "media-gfx/imagemagick svg png";
6178c2ecf20Sopenharmony_ci	my $cairo = "media-gfx/graphviz cairo pdf";
6188c2ecf20Sopenharmony_ci	my $portage_imagemagick = "/etc/portage/package.use/imagemagick";
6198c2ecf20Sopenharmony_ci	my $portage_cairo = "/etc/portage/package.use/graphviz";
6208c2ecf20Sopenharmony_ci
6218c2ecf20Sopenharmony_ci	if (qx(grep imagemagick $portage_imagemagick 2>/dev/null) eq "") {
6228c2ecf20Sopenharmony_ci		printf("\tsudo su -c 'echo \"$imagemagick\" > $portage_imagemagick'\n")
6238c2ecf20Sopenharmony_ci	}
6248c2ecf20Sopenharmony_ci	if (qx(grep graphviz $portage_cairo 2>/dev/null) eq  "") {
6258c2ecf20Sopenharmony_ci		printf("\tsudo su -c 'echo \"$cairo\" > $portage_cairo'\n");
6268c2ecf20Sopenharmony_ci	}
6278c2ecf20Sopenharmony_ci
6288c2ecf20Sopenharmony_ci	printf("\tsudo emerge --ask $install\n");
6298c2ecf20Sopenharmony_ci
6308c2ecf20Sopenharmony_ci}
6318c2ecf20Sopenharmony_ci
6328c2ecf20Sopenharmony_cisub check_distros()
6338c2ecf20Sopenharmony_ci{
6348c2ecf20Sopenharmony_ci	# Distro-specific hints
6358c2ecf20Sopenharmony_ci	if ($system_release =~ /Red Hat Enterprise Linux/) {
6368c2ecf20Sopenharmony_ci		give_redhat_hints;
6378c2ecf20Sopenharmony_ci		return;
6388c2ecf20Sopenharmony_ci	}
6398c2ecf20Sopenharmony_ci	if ($system_release =~ /CentOS/) {
6408c2ecf20Sopenharmony_ci		give_redhat_hints;
6418c2ecf20Sopenharmony_ci		return;
6428c2ecf20Sopenharmony_ci	}
6438c2ecf20Sopenharmony_ci	if ($system_release =~ /Scientific Linux/) {
6448c2ecf20Sopenharmony_ci		give_redhat_hints;
6458c2ecf20Sopenharmony_ci		return;
6468c2ecf20Sopenharmony_ci	}
6478c2ecf20Sopenharmony_ci	if ($system_release =~ /Oracle Linux Server/) {
6488c2ecf20Sopenharmony_ci		give_redhat_hints;
6498c2ecf20Sopenharmony_ci		return;
6508c2ecf20Sopenharmony_ci	}
6518c2ecf20Sopenharmony_ci	if ($system_release =~ /Fedora/) {
6528c2ecf20Sopenharmony_ci		give_redhat_hints;
6538c2ecf20Sopenharmony_ci		return;
6548c2ecf20Sopenharmony_ci	}
6558c2ecf20Sopenharmony_ci	if ($system_release =~ /Ubuntu/) {
6568c2ecf20Sopenharmony_ci		give_debian_hints;
6578c2ecf20Sopenharmony_ci		return;
6588c2ecf20Sopenharmony_ci	}
6598c2ecf20Sopenharmony_ci	if ($system_release =~ /Debian/) {
6608c2ecf20Sopenharmony_ci		give_debian_hints;
6618c2ecf20Sopenharmony_ci		return;
6628c2ecf20Sopenharmony_ci	}
6638c2ecf20Sopenharmony_ci	if ($system_release =~ /openSUSE/) {
6648c2ecf20Sopenharmony_ci		give_opensuse_hints;
6658c2ecf20Sopenharmony_ci		return;
6668c2ecf20Sopenharmony_ci	}
6678c2ecf20Sopenharmony_ci	if ($system_release =~ /Mageia/) {
6688c2ecf20Sopenharmony_ci		give_mageia_hints;
6698c2ecf20Sopenharmony_ci		return;
6708c2ecf20Sopenharmony_ci	}
6718c2ecf20Sopenharmony_ci	if ($system_release =~ /OpenMandriva/) {
6728c2ecf20Sopenharmony_ci		give_mageia_hints;
6738c2ecf20Sopenharmony_ci		return;
6748c2ecf20Sopenharmony_ci	}
6758c2ecf20Sopenharmony_ci	if ($system_release =~ /Arch Linux/) {
6768c2ecf20Sopenharmony_ci		give_arch_linux_hints;
6778c2ecf20Sopenharmony_ci		return;
6788c2ecf20Sopenharmony_ci	}
6798c2ecf20Sopenharmony_ci	if ($system_release =~ /Gentoo/) {
6808c2ecf20Sopenharmony_ci		give_gentoo_hints;
6818c2ecf20Sopenharmony_ci		return;
6828c2ecf20Sopenharmony_ci	}
6838c2ecf20Sopenharmony_ci
6848c2ecf20Sopenharmony_ci	#
6858c2ecf20Sopenharmony_ci	# Fall-back to generic hint code for other distros
6868c2ecf20Sopenharmony_ci	# That's far from ideal, specially for LaTeX dependencies.
6878c2ecf20Sopenharmony_ci	#
6888c2ecf20Sopenharmony_ci	my %map = (
6898c2ecf20Sopenharmony_ci		"sphinx-build" => "sphinx"
6908c2ecf20Sopenharmony_ci	);
6918c2ecf20Sopenharmony_ci	check_missing_tex(2) if ($pdf);
6928c2ecf20Sopenharmony_ci	check_missing(\%map);
6938c2ecf20Sopenharmony_ci	print "I don't know distro $system_release.\n";
6948c2ecf20Sopenharmony_ci	print "So, I can't provide you a hint with the install procedure.\n";
6958c2ecf20Sopenharmony_ci	print "There are likely missing dependencies.\n";
6968c2ecf20Sopenharmony_ci}
6978c2ecf20Sopenharmony_ci
6988c2ecf20Sopenharmony_ci#
6998c2ecf20Sopenharmony_ci# Common dependencies
7008c2ecf20Sopenharmony_ci#
7018c2ecf20Sopenharmony_ci
7028c2ecf20Sopenharmony_cisub deactivate_help()
7038c2ecf20Sopenharmony_ci{
7048c2ecf20Sopenharmony_ci	printf "\nIf you want to exit the virtualenv, you can use:\n";
7058c2ecf20Sopenharmony_ci	printf "\tdeactivate\n";
7068c2ecf20Sopenharmony_ci}
7078c2ecf20Sopenharmony_ci
7088c2ecf20Sopenharmony_cisub check_needs()
7098c2ecf20Sopenharmony_ci{
7108c2ecf20Sopenharmony_ci	# Check if Sphinx is already accessible from current environment
7118c2ecf20Sopenharmony_ci	check_sphinx();
7128c2ecf20Sopenharmony_ci
7138c2ecf20Sopenharmony_ci	if ($system_release) {
7148c2ecf20Sopenharmony_ci		print "Detected OS: $system_release.\n";
7158c2ecf20Sopenharmony_ci	} else {
7168c2ecf20Sopenharmony_ci		print "Unknown OS\n";
7178c2ecf20Sopenharmony_ci	}
7188c2ecf20Sopenharmony_ci	printf "Sphinx version: %s\n\n", $cur_version if ($cur_version);
7198c2ecf20Sopenharmony_ci
7208c2ecf20Sopenharmony_ci	# Check python command line, trying first python3
7218c2ecf20Sopenharmony_ci	$python_cmd = findprog("python3");
7228c2ecf20Sopenharmony_ci	$python_cmd = check_program("python", 0) if (!$python_cmd);
7238c2ecf20Sopenharmony_ci
7248c2ecf20Sopenharmony_ci	# Check the type of virtual env, depending on Python version
7258c2ecf20Sopenharmony_ci	if ($python_cmd) {
7268c2ecf20Sopenharmony_ci		if ($virtualenv) {
7278c2ecf20Sopenharmony_ci			my $tmp = qx($python_cmd --version 2>&1);
7288c2ecf20Sopenharmony_ci			if ($tmp =~ m/(\d+\.)(\d+\.)/) {
7298c2ecf20Sopenharmony_ci				if ($1 >= 3 && $2 >= 3) {
7308c2ecf20Sopenharmony_ci					$need_venv = 1;		# python 3.3 or upper
7318c2ecf20Sopenharmony_ci				} else {
7328c2ecf20Sopenharmony_ci					$need_virtualenv = 1;
7338c2ecf20Sopenharmony_ci				}
7348c2ecf20Sopenharmony_ci				if ($1 < 3) {
7358c2ecf20Sopenharmony_ci					# Complain if it finds python2 (or worse)
7368c2ecf20Sopenharmony_ci					printf "Warning: python$1 support is deprecated. Use it with caution!\n";
7378c2ecf20Sopenharmony_ci				}
7388c2ecf20Sopenharmony_ci			} else {
7398c2ecf20Sopenharmony_ci				die "Warning: couldn't identify $python_cmd version!";
7408c2ecf20Sopenharmony_ci			}
7418c2ecf20Sopenharmony_ci		} else {
7428c2ecf20Sopenharmony_ci			add_package("python-sphinx", 0);
7438c2ecf20Sopenharmony_ci		}
7448c2ecf20Sopenharmony_ci	}
7458c2ecf20Sopenharmony_ci
7468c2ecf20Sopenharmony_ci	# Set virtualenv command line, if python < 3.3
7478c2ecf20Sopenharmony_ci	my $virtualenv_cmd;
7488c2ecf20Sopenharmony_ci	if ($need_virtualenv) {
7498c2ecf20Sopenharmony_ci		$virtualenv_cmd = findprog("virtualenv-3");
7508c2ecf20Sopenharmony_ci		$virtualenv_cmd = findprog("virtualenv-3.5") if (!$virtualenv_cmd);
7518c2ecf20Sopenharmony_ci		if (!$virtualenv_cmd) {
7528c2ecf20Sopenharmony_ci			check_program("virtualenv", 0);
7538c2ecf20Sopenharmony_ci			$virtualenv_cmd = "virtualenv";
7548c2ecf20Sopenharmony_ci		}
7558c2ecf20Sopenharmony_ci	}
7568c2ecf20Sopenharmony_ci
7578c2ecf20Sopenharmony_ci	# Check for needed programs/tools
7588c2ecf20Sopenharmony_ci	check_perl_module("Pod::Usage", 0);
7598c2ecf20Sopenharmony_ci	check_program("make", 0);
7608c2ecf20Sopenharmony_ci	check_program("gcc", 0);
7618c2ecf20Sopenharmony_ci	check_python_module("sphinx_rtd_theme", 1) if (!$virtualenv);
7628c2ecf20Sopenharmony_ci	check_program("dot", 1);
7638c2ecf20Sopenharmony_ci	check_program("convert", 1);
7648c2ecf20Sopenharmony_ci
7658c2ecf20Sopenharmony_ci	# Extra PDF files - should use 2 for is_optional
7668c2ecf20Sopenharmony_ci	check_program("xelatex", 2) if ($pdf);
7678c2ecf20Sopenharmony_ci	check_program("rsvg-convert", 2) if ($pdf);
7688c2ecf20Sopenharmony_ci	check_program("latexmk", 2) if ($pdf);
7698c2ecf20Sopenharmony_ci
7708c2ecf20Sopenharmony_ci	if ($need_sphinx || $rec_sphinx_upgrade) {
7718c2ecf20Sopenharmony_ci		check_python_module("ensurepip", 0) if ($need_venv);
7728c2ecf20Sopenharmony_ci	}
7738c2ecf20Sopenharmony_ci
7748c2ecf20Sopenharmony_ci	# Do distro-specific checks and output distro-install commands
7758c2ecf20Sopenharmony_ci	check_distros();
7768c2ecf20Sopenharmony_ci
7778c2ecf20Sopenharmony_ci	if (!$python_cmd) {
7788c2ecf20Sopenharmony_ci		if ($need == 1) {
7798c2ecf20Sopenharmony_ci			die "Can't build as $need mandatory dependency is missing";
7808c2ecf20Sopenharmony_ci		} elsif ($need) {
7818c2ecf20Sopenharmony_ci			die "Can't build as $need mandatory dependencies are missing";
7828c2ecf20Sopenharmony_ci		}
7838c2ecf20Sopenharmony_ci	}
7848c2ecf20Sopenharmony_ci
7858c2ecf20Sopenharmony_ci	# Check if sphinx-build is called sphinx-build-3
7868c2ecf20Sopenharmony_ci	if ($need_symlink) {
7878c2ecf20Sopenharmony_ci		printf "\tsudo ln -sf %s /usr/bin/sphinx-build\n\n",
7888c2ecf20Sopenharmony_ci		       which("sphinx-build-3");
7898c2ecf20Sopenharmony_ci	}
7908c2ecf20Sopenharmony_ci
7918c2ecf20Sopenharmony_ci	# NOTE: if the system has a too old Sphinx version installed,
7928c2ecf20Sopenharmony_ci	# it will recommend installing a newer version using virtualenv
7938c2ecf20Sopenharmony_ci
7948c2ecf20Sopenharmony_ci	if ($need_sphinx || $rec_sphinx_upgrade) {
7958c2ecf20Sopenharmony_ci		my $min_activate = "$ENV{'PWD'}/${virtenv_prefix}${min_version}/bin/activate";
7968c2ecf20Sopenharmony_ci		my @activates = glob "$ENV{'PWD'}/${virtenv_prefix}*/bin/activate";
7978c2ecf20Sopenharmony_ci
7988c2ecf20Sopenharmony_ci		if ($cur_version lt $rec_version) {
7998c2ecf20Sopenharmony_ci			print "Warning: It is recommended at least Sphinx version $rec_version.\n";
8008c2ecf20Sopenharmony_ci			print "         If you want pdf, you need at least $min_pdf_version.\n";
8018c2ecf20Sopenharmony_ci		}
8028c2ecf20Sopenharmony_ci		if ($cur_version lt $min_pdf_version) {
8038c2ecf20Sopenharmony_ci			print "Note: It is recommended at least Sphinx version $min_pdf_version if you need PDF support.\n";
8048c2ecf20Sopenharmony_ci		}
8058c2ecf20Sopenharmony_ci		@activates = sort {$b cmp $a} @activates;
8068c2ecf20Sopenharmony_ci		my ($activate, $ver);
8078c2ecf20Sopenharmony_ci		foreach my $f (@activates) {
8088c2ecf20Sopenharmony_ci			next if ($f lt $min_activate);
8098c2ecf20Sopenharmony_ci
8108c2ecf20Sopenharmony_ci			my $sphinx_cmd = $f;
8118c2ecf20Sopenharmony_ci			$sphinx_cmd =~ s/activate/sphinx-build/;
8128c2ecf20Sopenharmony_ci			next if (! -f $sphinx_cmd);
8138c2ecf20Sopenharmony_ci
8148c2ecf20Sopenharmony_ci			$ver = get_sphinx_version($sphinx_cmd);
8158c2ecf20Sopenharmony_ci			if ($need_sphinx && ($ver ge $min_version)) {
8168c2ecf20Sopenharmony_ci				$activate = $f;
8178c2ecf20Sopenharmony_ci				last;
8188c2ecf20Sopenharmony_ci			} elsif ($ver gt $cur_version) {
8198c2ecf20Sopenharmony_ci				$activate = $f;
8208c2ecf20Sopenharmony_ci				last;
8218c2ecf20Sopenharmony_ci			}
8228c2ecf20Sopenharmony_ci		}
8238c2ecf20Sopenharmony_ci		if ($activate ne "") {
8248c2ecf20Sopenharmony_ci			if ($need_sphinx) {
8258c2ecf20Sopenharmony_ci				printf "\nNeed to activate Sphinx (version $ver) on virtualenv with:\n";
8268c2ecf20Sopenharmony_ci				printf "\t. $activate\n";
8278c2ecf20Sopenharmony_ci				deactivate_help();
8288c2ecf20Sopenharmony_ci				exit (1);
8298c2ecf20Sopenharmony_ci			} else {
8308c2ecf20Sopenharmony_ci				printf "\nYou may also use a newer Sphinx (version $ver) with:\n";
8318c2ecf20Sopenharmony_ci				printf "\tdeactivate && . $activate\n";
8328c2ecf20Sopenharmony_ci			}
8338c2ecf20Sopenharmony_ci		} else {
8348c2ecf20Sopenharmony_ci			my $rec_activate = "$virtenv_dir/bin/activate";
8358c2ecf20Sopenharmony_ci
8368c2ecf20Sopenharmony_ci			print "To upgrade Sphinx, use:\n\n" if ($rec_sphinx_upgrade);
8378c2ecf20Sopenharmony_ci
8388c2ecf20Sopenharmony_ci			$python_cmd = find_python_no_venv();
8398c2ecf20Sopenharmony_ci
8408c2ecf20Sopenharmony_ci			if ($need_venv) {
8418c2ecf20Sopenharmony_ci				printf "\t$python_cmd -m venv $virtenv_dir\n";
8428c2ecf20Sopenharmony_ci			} else {
8438c2ecf20Sopenharmony_ci				printf "\t$virtualenv_cmd $virtenv_dir\n";
8448c2ecf20Sopenharmony_ci			}
8458c2ecf20Sopenharmony_ci			printf "\t. $rec_activate\n";
8468c2ecf20Sopenharmony_ci			printf "\tpip install -r $requirement_file\n";
8478c2ecf20Sopenharmony_ci			deactivate_help();
8488c2ecf20Sopenharmony_ci
8498c2ecf20Sopenharmony_ci			$need++ if (!$rec_sphinx_upgrade);
8508c2ecf20Sopenharmony_ci		}
8518c2ecf20Sopenharmony_ci	}
8528c2ecf20Sopenharmony_ci	printf "\n";
8538c2ecf20Sopenharmony_ci
8548c2ecf20Sopenharmony_ci	print "All optional dependencies are met.\n" if (!$optional);
8558c2ecf20Sopenharmony_ci
8568c2ecf20Sopenharmony_ci	if ($need == 1) {
8578c2ecf20Sopenharmony_ci		die "Can't build as $need mandatory dependency is missing";
8588c2ecf20Sopenharmony_ci	} elsif ($need) {
8598c2ecf20Sopenharmony_ci		die "Can't build as $need mandatory dependencies are missing";
8608c2ecf20Sopenharmony_ci	}
8618c2ecf20Sopenharmony_ci
8628c2ecf20Sopenharmony_ci	print "Needed package dependencies are met.\n";
8638c2ecf20Sopenharmony_ci}
8648c2ecf20Sopenharmony_ci
8658c2ecf20Sopenharmony_ci#
8668c2ecf20Sopenharmony_ci# Main
8678c2ecf20Sopenharmony_ci#
8688c2ecf20Sopenharmony_ci
8698c2ecf20Sopenharmony_ciwhile (@ARGV) {
8708c2ecf20Sopenharmony_ci	my $arg = shift(@ARGV);
8718c2ecf20Sopenharmony_ci
8728c2ecf20Sopenharmony_ci	if ($arg eq "--no-virtualenv") {
8738c2ecf20Sopenharmony_ci		$virtualenv = 0;
8748c2ecf20Sopenharmony_ci	} elsif ($arg eq "--no-pdf"){
8758c2ecf20Sopenharmony_ci		$pdf = 0;
8768c2ecf20Sopenharmony_ci	} elsif ($arg eq "--version-check"){
8778c2ecf20Sopenharmony_ci		$version_check = 1;
8788c2ecf20Sopenharmony_ci	} else {
8798c2ecf20Sopenharmony_ci		print "Usage:\n\t$0 <--no-virtualenv> <--no-pdf> <--version-check>\n\n";
8808c2ecf20Sopenharmony_ci		print "Where:\n";
8818c2ecf20Sopenharmony_ci		print "\t--no-virtualenv\t- Recommend installing Sphinx instead of using a virtualenv\n";
8828c2ecf20Sopenharmony_ci		print "\t--version-check\t- if version is compatible, don't check for missing dependencies\n";
8838c2ecf20Sopenharmony_ci		print "\t--no-pdf\t- don't check for dependencies required to build PDF docs\n\n";
8848c2ecf20Sopenharmony_ci		exit -1;
8858c2ecf20Sopenharmony_ci	}
8868c2ecf20Sopenharmony_ci}
8878c2ecf20Sopenharmony_ci
8888c2ecf20Sopenharmony_ci#
8898c2ecf20Sopenharmony_ci# Determine the system type. There's no standard unique way that would
8908c2ecf20Sopenharmony_ci# work with all distros with a minimal package install. So, several
8918c2ecf20Sopenharmony_ci# methods are used here.
8928c2ecf20Sopenharmony_ci#
8938c2ecf20Sopenharmony_ci# By default, it will use lsb_release function. If not available, it will
8948c2ecf20Sopenharmony_ci# fail back to reading the known different places where the distro name
8958c2ecf20Sopenharmony_ci# is stored
8968c2ecf20Sopenharmony_ci#
8978c2ecf20Sopenharmony_ci
8988c2ecf20Sopenharmony_ci$system_release = qx(lsb_release -d) if which("lsb_release");
8998c2ecf20Sopenharmony_ci$system_release =~ s/Description:\s*// if ($system_release);
9008c2ecf20Sopenharmony_ci$system_release = catcheck("/etc/system-release") if !$system_release;
9018c2ecf20Sopenharmony_ci$system_release = catcheck("/etc/redhat-release") if !$system_release;
9028c2ecf20Sopenharmony_ci$system_release = catcheck("/etc/lsb-release") if !$system_release;
9038c2ecf20Sopenharmony_ci$system_release = catcheck("/etc/gentoo-release") if !$system_release;
9048c2ecf20Sopenharmony_ci
9058c2ecf20Sopenharmony_ci# This seems more common than LSB these days
9068c2ecf20Sopenharmony_ciif (!$system_release) {
9078c2ecf20Sopenharmony_ci	my %os_var;
9088c2ecf20Sopenharmony_ci	if (open IN, "cat /etc/os-release|") {
9098c2ecf20Sopenharmony_ci		while (<IN>) {
9108c2ecf20Sopenharmony_ci			if (m/^([\w\d\_]+)=\"?([^\"]*)\"?\n/) {
9118c2ecf20Sopenharmony_ci				$os_var{$1}=$2;
9128c2ecf20Sopenharmony_ci			}
9138c2ecf20Sopenharmony_ci		}
9148c2ecf20Sopenharmony_ci		$system_release = $os_var{"NAME"};
9158c2ecf20Sopenharmony_ci		if (defined($os_var{"VERSION_ID"})) {
9168c2ecf20Sopenharmony_ci			$system_release .= " " . $os_var{"VERSION_ID"} if (defined($os_var{"VERSION_ID"}));
9178c2ecf20Sopenharmony_ci		} else {
9188c2ecf20Sopenharmony_ci			$system_release .= " " . $os_var{"VERSION"};
9198c2ecf20Sopenharmony_ci		}
9208c2ecf20Sopenharmony_ci	}
9218c2ecf20Sopenharmony_ci}
9228c2ecf20Sopenharmony_ci$system_release = catcheck("/etc/issue") if !$system_release;
9238c2ecf20Sopenharmony_ci$system_release =~ s/\s+$//;
9248c2ecf20Sopenharmony_ci
9258c2ecf20Sopenharmony_cicheck_needs;
926