#!/usr/bin/perl
# SPDX-License-Identifier: GPL-2.0-or-later
use strict;
# Copyright (c) 2017-2020 Mauro Carvalho Chehab <mchehab@kernel.org>
#
my $prefix = "./";
$prefix = "$ENV{'srctree'}/" if ($ENV{'srctree'});
my $conf = $prefix . "Documentation/conf.py";
my $requirement_file = $prefix . "Documentation/sphinx/requirements.txt";
my $virtenv_prefix = "sphinx_";
#
# Static vars
#
my %missing;
my $system_release;
my $need = 0;
my $optional = 0;
my $need_symlink = 0;
my $need_sphinx = 0;
my $need_venv = 0;
my $need_virtualenv = 0;
my $rec_sphinx_upgrade = 0;
my $install = "";
my $virtenv_dir = "";
my $python_cmd = "";
my $min_version;
my $cur_version;
my $rec_version = "1.7.9"; # PDF won't build here
my $min_pdf_version = "2.4.4"; # Min version where pdf builds
#
# Command line arguments
#
my $pdf = 1;
my $virtualenv = 1;
my $version_check = 0;
#
# List of required texlive packages on Fedora and OpenSuse
#
my %texlive = (
'amsfonts.sty' => 'texlive-amsfonts',
'amsmath.sty' => 'texlive-amsmath',
'amssymb.sty' => 'texlive-amsfonts',
'amsthm.sty' => 'texlive-amscls',
'anyfontsize.sty' => 'texlive-anyfontsize',
'atbegshi.sty' => 'texlive-oberdiek',
'bm.sty' => 'texlive-tools',
'capt-of.sty' => 'texlive-capt-of',
'cmap.sty' => 'texlive-cmap',
'ecrm1000.tfm' => 'texlive-ec',
'eqparbox.sty' => 'texlive-eqparbox',
'eu1enc.def' => 'texlive-euenc',
'fancybox.sty' => 'texlive-fancybox',
'fancyvrb.sty' => 'texlive-fancyvrb',
'float.sty' => 'texlive-float',
'fncychap.sty' => 'texlive-fncychap',
'footnote.sty' => 'texlive-mdwtools',
'framed.sty' => 'texlive-framed',
'luatex85.sty' => 'texlive-luatex85',
'multirow.sty' => 'texlive-multirow',
'needspace.sty' => 'texlive-needspace',
'palatino.sty' => 'texlive-psnfss',
'parskip.sty' => 'texlive-parskip',
'polyglossia.sty' => 'texlive-polyglossia',
'tabulary.sty' => 'texlive-tabulary',
'threeparttable.sty' => 'texlive-threeparttable',
'titlesec.sty' => 'texlive-titlesec',
'ucs.sty' => 'texlive-ucs',
'upquote.sty' => 'texlive-upquote',
'wrapfig.sty' => 'texlive-wrapfig',
);
#
# Subroutines that checks if a feature exists
#
sub check_missing(%)
{
my %map = %{$_[0]};
foreach my $prog (sort keys %missing) {
my $is_optional = $missing{$prog};
# At least on some LTS distros like CentOS 7, texlive doesn't
# provide all packages we need. When such distros are
# detected, we have to disable PDF output.
#
# So, we need to ignore the packages that distros would
# need for LaTeX to work
if ($is_optional == 2 && !$pdf) {
$optional--;
next;
}
if ($is_optional) {
print "Warning: better to also install \"$prog\".\n";
} else {
print "ERROR: please install \"$prog\", otherwise, build won't work.\n";
}
if (defined($map{$prog})) {
$install .= " " . $map{$prog};
} else {
$install .= " " . $prog;
}
}
$install =~ s/^\s//;
}
sub add_package($$)
{
my $package = shift;
my $is_optional = shift;
$missing{$package} = $is_optional;
if ($is_optional) {
$optional++;
} else {
$need++;
}
}
sub check_missing_file($$$)
{
my $files = shift;
my $package = shift;
my $is_optional = shift;
for (@$files) {
return if(-e $_);
}
add_package($package, $is_optional);
}
sub findprog($)
{
foreach(split(/:/, $ENV{PATH})) {
return "$_/$_[0]" if(-x "$_/$_[0]");
}
}
sub find_python_no_venv()
{
my $prog = shift;
my $cur_dir = qx(pwd);
$cur_dir =~ s/\s+$//;
foreach my $dir (split(/:/, $ENV{PATH})) {
next if ($dir =~ m,($cur_dir)/sphinx,);
return "$dir/python3" if(-x "$dir/python3");
}
foreach my $dir (split(/:/, $ENV{PATH})) {
next if ($dir =~ m,($cur_dir)/sphinx,);
return "$dir/python" if(-x "$dir/python");
}
return "python";
}
sub check_program($$)
{
my $prog = shift;
my $is_optional