Blame view
scripts/sphinx-pre-install
21.7 KB
24071ac1a scripts/sphinx-pr... |
1 |
#!/usr/bin/perl |
c942fddf8 treewide: Replace... |
2 |
# SPDX-License-Identifier: GPL-2.0-or-later |
24071ac1a scripts/sphinx-pr... |
3 |
use strict; |
2f9c50255 scripts: sphinx-p... |
4 |
# Copyright (c) 2017-2020 Mauro Carvalho Chehab <mchehab@kernel.org> |
24071ac1a scripts/sphinx-pr... |
5 |
# |
24071ac1a scripts/sphinx-pr... |
6 |
|
8c69b77a0 scripts/sphinx-pr... |
7 8 9 10 11 |
my $prefix = "./"; $prefix = "$ENV{'srctree'}/" if ($ENV{'srctree'}); my $conf = $prefix . "Documentation/conf.py"; my $requirement_file = $prefix . "Documentation/sphinx/requirements.txt"; |
44f421651 scripts/sphinx-pr... |
12 |
my $virtenv_prefix = "sphinx_"; |
5be33182d sphinx-pre-instal... |
13 |
|
24071ac1a scripts/sphinx-pr... |
14 15 16 17 18 19 20 21 22 23 |
# # Static vars # my %missing; my $system_release; my $need = 0; my $optional = 0; my $need_symlink = 0; my $need_sphinx = 0; |
2f9c50255 scripts: sphinx-p... |
24 25 |
my $need_venv = 0; my $need_virtualenv = 0; |
77d09ad9d scripts/sphinx-pr... |
26 |
my $rec_sphinx_upgrade = 0; |
24071ac1a scripts/sphinx-pr... |
27 |
my $install = ""; |
44f421651 scripts/sphinx-pr... |
28 |
my $virtenv_dir = ""; |
2f9c50255 scripts: sphinx-p... |
29 |
my $python_cmd = ""; |
44f421651 scripts/sphinx-pr... |
30 |
my $min_version; |
2834a7412 scripts: sphinx-p... |
31 |
my $cur_version; |
1ef70ced5 scripts: sphinx-p... |
32 33 |
my $rec_version = "1.7.9"; # PDF won't build here my $min_pdf_version = "2.4.4"; # Min version where pdf builds |
24071ac1a scripts/sphinx-pr... |
34 35 36 37 38 39 40 |
# # Command line arguments # my $pdf = 1; my $virtualenv = 1; |
9b88ad546 scripts/sphinx-pr... |
41 |
my $version_check = 0; |
24071ac1a scripts/sphinx-pr... |
42 43 44 45 46 47 |
# # List of required texlive packages on Fedora and OpenSuse # my %texlive = ( |
24071ac1a scripts/sphinx-pr... |
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
'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}; |
56e5a6339 scripts/sphinx-pr... |
90 91 92 93 94 95 96 97 98 99 |
# 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; } |
24071ac1a scripts/sphinx-pr... |
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
if ($is_optional) { print "Warning: better to also install \"$prog\". "; } else { print "ERROR: please install \"$prog\", otherwise, build won't work. "; } 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($$$) { |
ff8fdb36a scripts/sphinx-pr... |
132 |
my $files = shift; |
24071ac1a scripts/sphinx-pr... |
133 134 |
my $package = shift; my $is_optional = shift; |
ff8fdb36a scripts/sphinx-pr... |
135 136 137 |
for (@$files) { return if(-e $_); } |
24071ac1a scripts/sphinx-pr... |
138 139 140 141 142 143 144 145 146 147 |
add_package($package, $is_optional); } sub findprog($) { foreach(split(/:/, $ENV{PATH})) { return "$_/$_[0]" if(-x "$_/$_[0]"); } } |
412b09dda scripts: sphinx-p... |
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
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"; } |
24071ac1a scripts/sphinx-pr... |
165 166 167 168 |
sub check_program($$) { my $prog = shift; my $is_optional = shift; |
2f9c50255 scripts: sphinx-p... |
169 |
return $prog if findprog($prog); |
24071ac1a scripts/sphinx-pr... |
170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 |
add_package($prog, $is_optional); } sub check_perl_module($$) { my $prog = shift; my $is_optional = shift; my $err = system("perl -M$prog -e 1 2>/dev/null /dev/null"); return if ($err == 0); add_package($prog, $is_optional); } sub check_python_module($$) { my $prog = shift; my $is_optional = shift; |
2f9c50255 scripts: sphinx-p... |
189 190 191 |
return if (!$python_cmd); my $err = system("$python_cmd -c 'import $prog' 2>/dev/null /dev/null"); |
24071ac1a scripts/sphinx-pr... |
192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 |
return if ($err == 0); add_package($prog, $is_optional); } sub check_rpm_missing($$) { my @pkgs = @{$_[0]}; my $is_optional = $_[1]; foreach my $prog(@pkgs) { my $err = system("rpm -q '$prog' 2>/dev/null >/dev/null"); add_package($prog, $is_optional) if ($err); } } sub check_pacman_missing($$) { my @pkgs = @{$_[0]}; my $is_optional = $_[1]; foreach my $prog(@pkgs) { my $err = system("pacman -Q '$prog' 2>/dev/null >/dev/null"); add_package($prog, $is_optional) if ($err); } } sub check_missing_tex($) { my $is_optional = shift; my $kpsewhich = findprog("kpsewhich"); foreach my $prog(keys %texlive) { my $package = $texlive{$prog}; if (!$kpsewhich) { add_package($package, $is_optional); next; } my $file = qx($kpsewhich $prog); add_package($package, $is_optional) if ($file =~ /^\s*$/); } } |
77d09ad9d scripts/sphinx-pr... |
234 |
sub get_sphinx_fname() |
24071ac1a scripts/sphinx-pr... |
235 |
{ |
77d09ad9d scripts/sphinx-pr... |
236 237 |
my $fname = "sphinx-build"; return $fname if findprog($fname); |
24071ac1a scripts/sphinx-pr... |
238 |
|
77d09ad9d scripts/sphinx-pr... |
239 240 |
$fname = "sphinx-build-3"; if (findprog($fname)) { |
24071ac1a scripts/sphinx-pr... |
241 |
$need_symlink = 1; |
77d09ad9d scripts/sphinx-pr... |
242 |
return $fname; |
24071ac1a scripts/sphinx-pr... |
243 |
} |
77d09ad9d scripts/sphinx-pr... |
244 245 |
return ""; } |
a8b380c37 scripts: sphinx-p... |
246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 |
sub get_sphinx_version($) { my $cmd = shift; my $ver; open IN, "$cmd --version 2>&1 |"; while (<IN>) { if (m/^\s*sphinx-build\s+([\d\.]+)(\+\/[\da-f]+)?$/) { $ver=$1; last; } # Sphinx 1.2.x uses a different format if (m/^\s*Sphinx.*\s+([\d\.]+)$/) { $ver=$1; last; } } close IN; return $ver; } |
77d09ad9d scripts/sphinx-pr... |
266 267 |
sub check_sphinx() { |
1ef70ced5 scripts: sphinx-p... |
268 |
my $default_version; |
77d09ad9d scripts/sphinx-pr... |
269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 |
open IN, $conf or die "Can't open $conf"; while (<IN>) { if (m/^\s*needs_sphinx\s*=\s*[\'\"]([\d\.]+)[\'\"]/) { $min_version=$1; last; } } close IN; die "Can't get needs_sphinx version from $conf" if (!$min_version); open IN, $requirement_file or die "Can't open $requirement_file"; while (<IN>) { if (m/^\s*Sphinx\s*==\s*([\d\.]+)$/) { |
1ef70ced5 scripts: sphinx-p... |
284 |
$default_version=$1; |
77d09ad9d scripts/sphinx-pr... |
285 286 287 288 |
last; } } close IN; |
1ef70ced5 scripts: sphinx-p... |
289 |
die "Can't get default sphinx version from $requirement_file" if (!$default_version); |
77d09ad9d scripts/sphinx-pr... |
290 |
|
1ef70ced5 scripts: sphinx-p... |
291 |
$virtenv_dir = $virtenv_prefix . $default_version; |
77d09ad9d scripts/sphinx-pr... |
292 293 |
my $sphinx = get_sphinx_fname(); |
2f9c50255 scripts: sphinx-p... |
294 295 296 297 |
if ($sphinx eq "") { $need_sphinx = 1; return; } |
77d09ad9d scripts/sphinx-pr... |
298 |
|
a8b380c37 scripts: sphinx-p... |
299 300 |
$cur_version = get_sphinx_version($sphinx); die ("$sphinx returned an error") if (!$cur_version); |
77d09ad9d scripts/sphinx-pr... |
301 302 |
die "$sphinx didn't return its version" if (!$cur_version); |
77d09ad9d scripts/sphinx-pr... |
303 |
if ($cur_version lt $min_version) { |
9b88ad546 scripts/sphinx-pr... |
304 305 |
printf "ERROR: Sphinx version is %s. It should be >= %s (recommended >= %s) ", |
1ef70ced5 scripts: sphinx-p... |
306 |
$cur_version, $min_version, $default_version; |
77d09ad9d scripts/sphinx-pr... |
307 308 309 310 311 |
$need_sphinx = 1; return; } if ($cur_version lt $rec_version) { |
1ef70ced5 scripts: sphinx-p... |
312 313 314 |
$rec_sphinx_upgrade = 1; return; } |
9b88ad546 scripts/sphinx-pr... |
315 316 317 |
# On version check mode, just assume Sphinx has all mandatory deps exit (0) if ($version_check); |
24071ac1a scripts/sphinx-pr... |
318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 |
} # # Ancillary subroutines # sub catcheck($) { my $res = ""; $res = qx(cat $_[0]) if (-r $_[0]); return $res; } sub which($) { my $file = shift; my @path = split ":", $ENV{PATH}; foreach my $dir(@path) { my $name = $dir.'/'.$file; return $name if (-x $name ); } return undef; } # # Subroutines that check distro-specific hints # sub give_debian_hints() { my %map = ( "python-sphinx" => "python3-sphinx", "sphinx_rtd_theme" => "python3-sphinx-rtd-theme", |
2f9c50255 scripts: sphinx-p... |
352 |
"ensurepip" => "python3-venv", |
24071ac1a scripts/sphinx-pr... |
353 |
"virtualenv" => "virtualenv", |
24071ac1a scripts/sphinx-pr... |
354 355 356 357 |
"dot" => "graphviz", "convert" => "imagemagick", "Pod::Usage" => "perl-modules", "xelatex" => "texlive-xetex", |
8e7d5d15e sphinx-pre-instal... |
358 |
"rsvg-convert" => "librsvg2-bin", |
24071ac1a scripts/sphinx-pr... |
359 360 361 |
); if ($pdf) { |
ff8fdb36a scripts/sphinx-pr... |
362 |
check_missing_file(["/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"], |
56e5a6339 scripts/sphinx-pr... |
363 |
"fonts-dejavu", 2); |
27eed923f scripts/sphinx-pr... |
364 |
|
9692f2fdb scripts/sphinx-pr... |
365 |
check_missing_file(["/usr/share/fonts/noto-cjk/NotoSansCJK-Regular.ttc", |
bfc7f4281 scripts: sphinx-p... |
366 367 |
"/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc", "/usr/share/fonts/opentype/noto/NotoSerifCJK-Regular.ttc"], |
27eed923f scripts/sphinx-pr... |
368 |
"fonts-noto-cjk", 2); |
24071ac1a scripts/sphinx-pr... |
369 |
} |
56e5a6339 scripts/sphinx-pr... |
370 |
check_program("dvipng", 2) if ($pdf); |
24071ac1a scripts/sphinx-pr... |
371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 |
check_missing(\%map); return if (!$need && !$optional); printf("You should run: \tsudo apt-get install $install "); } sub give_redhat_hints() { my %map = ( "python-sphinx" => "python3-sphinx", "sphinx_rtd_theme" => "python3-sphinx_rtd_theme", "virtualenv" => "python3-virtualenv", |
24071ac1a scripts/sphinx-pr... |
386 387 388 389 |
"dot" => "graphviz", "convert" => "ImageMagick", "Pod::Usage" => "perl-Pod-Usage", "xelatex" => "texlive-xetex-bin", |
8e7d5d15e sphinx-pre-instal... |
390 |
"rsvg-convert" => "librsvg2-tools", |
24071ac1a scripts/sphinx-pr... |
391 |
); |
5d88953c3 sphinx-pre-instal... |
392 393 394 |
my @fedora26_opt_pkgs = ( "graphviz-gd", # Fedora 26: needed for PDF support ); |
24071ac1a scripts/sphinx-pr... |
395 396 397 |
my @fedora_tex_pkgs = ( "texlive-collection-fontsrecommended", "texlive-collection-latex", |
27eed923f scripts/sphinx-pr... |
398 |
"texlive-xecjk", |
24071ac1a scripts/sphinx-pr... |
399 400 401 402 |
"dejavu-sans-fonts", "dejavu-serif-fonts", "dejavu-sans-mono-fonts", ); |
9b756a9d0 scripts/sphinx-pr... |
403 404 405 |
# # Checks valid for RHEL/CentOS version 7.x. # |
56e5a6339 scripts/sphinx-pr... |
406 407 408 |
my $old = 0; my $rel; $rel = $1 if ($system_release =~ /release\s+(\d+)/); |
b308467c9 scripts/sphinx-pr... |
409 |
if (!($system_release =~ /Fedora/)) { |
9b756a9d0 scripts/sphinx-pr... |
410 |
$map{"virtualenv"} = "python-virtualenv"; |
9b756a9d0 scripts/sphinx-pr... |
411 |
|
56e5a6339 scripts/sphinx-pr... |
412 413 414 |
if ($rel && $rel < 8) { $old = 1; $pdf = 0; |
5d88953c3 sphinx-pre-instal... |
415 |
|
56e5a6339 scripts/sphinx-pr... |
416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 |
printf("Note: texlive packages on RHEL/CENTOS <= 7 are incomplete. Can't support PDF output "); printf("If you want to build PDF, please read: "); printf("\thttps://www.systutorials.com/241660/how-to-install-tex-live-on-centos-7-linux/ "); } } else { if ($rel && $rel < 26) { $old = 1; } } if (!$rel) { printf("Couldn't identify release number "); $old = 1; $pdf = 0; } |
5d88953c3 sphinx-pre-instal... |
434 |
|
27eed923f scripts/sphinx-pr... |
435 |
if ($pdf) { |
ff8fdb36a scripts/sphinx-pr... |
436 |
check_missing_file(["/usr/share/fonts/google-noto-cjk/NotoSansCJK-Regular.ttc"], |
27eed923f scripts/sphinx-pr... |
437 438 |
"google-noto-sans-cjk-ttc-fonts", 2); } |
56e5a6339 scripts/sphinx-pr... |
439 440 441 |
check_rpm_missing(\@fedora26_opt_pkgs, 2) if ($pdf && !$old); check_rpm_missing(\@fedora_tex_pkgs, 2) if ($pdf); check_missing_tex(2) if ($pdf); |
24071ac1a scripts/sphinx-pr... |
442 443 444 |
check_missing(\%map); return if (!$need && !$optional); |
9b756a9d0 scripts/sphinx-pr... |
445 |
|
56e5a6339 scripts/sphinx-pr... |
446 |
if (!$old) { |
9b756a9d0 scripts/sphinx-pr... |
447 448 449 450 451 452 453 454 455 456 457 458 |
# dnf, for Fedora 18+ printf("You should run: \tsudo dnf install -y $install "); } else { # yum, for RHEL (and clones) or Fedora version < 18 printf("You should run: \tsudo yum install -y $install "); } |
24071ac1a scripts/sphinx-pr... |
459 460 461 462 463 464 465 466 |
} sub give_opensuse_hints() { my %map = ( "python-sphinx" => "python3-sphinx", "sphinx_rtd_theme" => "python3-sphinx_rtd_theme", "virtualenv" => "python3-virtualenv", |
24071ac1a scripts/sphinx-pr... |
467 468 469 470 471 |
"dot" => "graphviz", "convert" => "ImageMagick", "Pod::Usage" => "perl-Pod-Usage", "xelatex" => "texlive-xetex-bin", ); |
b3df6223b scripts: sphinx-p... |
472 473 |
# On Tumbleweed, this package is also named rsvg-convert $map{"rsvg-convert"} = "rsvg-view" if (!($system_release =~ /Tumbleweed/)); |
24071ac1a scripts/sphinx-pr... |
474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 |
my @suse_tex_pkgs = ( "texlive-babel-english", "texlive-caption", "texlive-colortbl", "texlive-courier", "texlive-dvips", "texlive-helvetic", "texlive-makeindex", "texlive-metafont", "texlive-metapost", "texlive-palatino", "texlive-preview", "texlive-times", "texlive-zapfchan", "texlive-zapfding", ); |
353290a9e scripts/sphinx-pr... |
490 |
$map{"latexmk"} = "texlive-latexmk-bin"; |
27eed923f scripts/sphinx-pr... |
491 492 493 494 |
# FIXME: add support for installing CJK fonts # # I tried hard, but was unable to find a way to install # "Noto Sans CJK SC" on openSUSE |
56e5a6339 scripts/sphinx-pr... |
495 496 |
check_rpm_missing(\@suse_tex_pkgs, 2) if ($pdf); check_missing_tex(2) if ($pdf); |
24071ac1a scripts/sphinx-pr... |
497 498 499 500 501 502 503 504 |
check_missing(\%map); return if (!$need && !$optional); printf("You should run: \tsudo zypper install --no-recommends $install "); } |
800d408a3 sphinx-pre-instal... |
505 506 507 508 509 510 |
sub give_mageia_hints() { my %map = ( "python-sphinx" => "python3-sphinx", "sphinx_rtd_theme" => "python3-sphinx_rtd_theme", "virtualenv" => "python3-virtualenv", |
800d408a3 sphinx-pre-instal... |
511 512 513 514 |
"dot" => "graphviz", "convert" => "ImageMagick", "Pod::Usage" => "perl-Pod-Usage", "xelatex" => "texlive", |
d6ebf1890 scripts: sphinx-p... |
515 |
"rsvg-convert" => "librsvg2", |
800d408a3 sphinx-pre-instal... |
516 517 518 519 520 |
); my @tex_pkgs = ( "texlive-fontsextra", ); |
353290a9e scripts/sphinx-pr... |
521 |
$map{"latexmk"} = "texlive-collection-basic"; |
d6ebf1890 scripts: sphinx-p... |
522 523 524 525 526 527 528 529 530 531 |
my $packager_cmd; my $noto_sans; if ($system_release =~ /OpenMandriva/) { $packager_cmd = "dnf install"; $noto_sans = "noto-sans-cjk-fonts"; @tex_pkgs = ( "texlive-collection-fontsextra" ); } else { $packager_cmd = "urpmi"; $noto_sans = "google-noto-sans-cjk-ttc-fonts"; } |
27eed923f scripts/sphinx-pr... |
532 |
if ($pdf) { |
d6ebf1890 scripts: sphinx-p... |
533 534 535 |
check_missing_file(["/usr/share/fonts/google-noto-cjk/NotoSansCJK-Regular.ttc", "/usr/share/fonts/TTF/NotoSans-Regular.ttf"], $noto_sans, 2); |
27eed923f scripts/sphinx-pr... |
536 |
} |
56e5a6339 scripts/sphinx-pr... |
537 |
check_rpm_missing(\@tex_pkgs, 2) if ($pdf); |
800d408a3 sphinx-pre-instal... |
538 539 540 |
check_missing(\%map); return if (!$need && !$optional); |
d6ebf1890 scripts: sphinx-p... |
541 542 543 544 |
printf("You should run: \tsudo $packager_cmd $install "); |
800d408a3 sphinx-pre-instal... |
545 |
} |
24071ac1a scripts/sphinx-pr... |
546 547 548 549 550 |
sub give_arch_linux_hints() { my %map = ( "sphinx_rtd_theme" => "python-sphinx_rtd_theme", "virtualenv" => "python-virtualenv", |
24071ac1a scripts/sphinx-pr... |
551 552 553 |
"dot" => "graphviz", "convert" => "imagemagick", "xelatex" => "texlive-bin", |
0d0da9aa0 scripts/sphinx-pr... |
554 |
"latexmk" => "texlive-core", |
8e7d5d15e sphinx-pre-instal... |
555 |
"rsvg-convert" => "extra/librsvg", |
24071ac1a scripts/sphinx-pr... |
556 557 558 559 560 561 562 |
); my @archlinux_tex_pkgs = ( "texlive-core", "texlive-latexextra", "ttf-dejavu", ); |
56e5a6339 scripts/sphinx-pr... |
563 |
check_pacman_missing(\@archlinux_tex_pkgs, 2) if ($pdf); |
27eed923f scripts/sphinx-pr... |
564 |
if ($pdf) { |
ff8fdb36a scripts/sphinx-pr... |
565 |
check_missing_file(["/usr/share/fonts/noto-cjk/NotoSansCJK-Regular.ttc"], |
27eed923f scripts/sphinx-pr... |
566 567 |
"noto-fonts-cjk", 2); } |
24071ac1a scripts/sphinx-pr... |
568 569 570 571 572 573 574 575 576 577 578 579 580 581 |
check_missing(\%map); return if (!$need && !$optional); printf("You should run: \tsudo pacman -S $install "); } sub give_gentoo_hints() { my %map = ( "sphinx_rtd_theme" => "dev-python/sphinx_rtd_theme", "virtualenv" => "dev-python/virtualenv", |
24071ac1a scripts/sphinx-pr... |
582 583 584 |
"dot" => "media-gfx/graphviz", "convert" => "media-gfx/imagemagick", "xelatex" => "dev-texlive/texlive-xetex media-fonts/dejavu", |
8e7d5d15e sphinx-pre-instal... |
585 |
"rsvg-convert" => "gnome-base/librsvg", |
24071ac1a scripts/sphinx-pr... |
586 |
); |
ff8fdb36a scripts/sphinx-pr... |
587 |
check_missing_file(["/usr/share/fonts/dejavu/DejaVuSans.ttf"], |
56e5a6339 scripts/sphinx-pr... |
588 |
"media-fonts/dejavu", 2) if ($pdf); |
24071ac1a scripts/sphinx-pr... |
589 |
|
27eed923f scripts/sphinx-pr... |
590 |
if ($pdf) { |
e45a63174 scripts: sphinx-p... |
591 592 |
check_missing_file(["/usr/share/fonts/noto-cjk/NotoSansCJKsc-Regular.otf", "/usr/share/fonts/noto-cjk/NotoSerifCJK-Regular.ttc"], |
27eed923f scripts/sphinx-pr... |
593 594 |
"media-fonts/noto-cjk", 2); } |
24071ac1a scripts/sphinx-pr... |
595 596 597 |
check_missing(\%map); return if (!$need && !$optional); |
bba1e4cbd sphinx-pre-instal... |
598 599 600 601 |
printf("You should run: "); |
4ea96d57b scripts/sphinx-pr... |
602 603 604 605 606 |
my $imagemagick = "media-gfx/imagemagick svg png"; my $cairo = "media-gfx/graphviz cairo pdf"; my $portage_imagemagick = "/etc/portage/package.use/imagemagick"; my $portage_cairo = "/etc/portage/package.use/graphviz"; |
e45a63174 scripts: sphinx-p... |
607 |
if (qx(grep imagemagick $portage_imagemagick 2>/dev/null) eq "") { |
4ea96d57b scripts/sphinx-pr... |
608 609 610 |
printf("\tsudo su -c 'echo \"$imagemagick\" > $portage_imagemagick' ") } |
e45a63174 scripts: sphinx-p... |
611 |
if (qx(grep graphviz $portage_cairo 2>/dev/null) eq "") { |
4ea96d57b scripts/sphinx-pr... |
612 613 614 |
printf("\tsudo su -c 'echo \"$cairo\" > $portage_cairo' "); } |
bba1e4cbd sphinx-pre-instal... |
615 616 |
printf("\tsudo emerge --ask $install "); |
24071ac1a scripts/sphinx-pr... |
617 618 619 620 621 622 623 624 625 |
} sub check_distros() { # Distro-specific hints if ($system_release =~ /Red Hat Enterprise Linux/) { give_redhat_hints; return; } |
9b756a9d0 scripts/sphinx-pr... |
626 627 628 629 630 631 632 633 634 635 636 637 |
if ($system_release =~ /CentOS/) { give_redhat_hints; return; } if ($system_release =~ /Scientific Linux/) { give_redhat_hints; return; } if ($system_release =~ /Oracle Linux Server/) { give_redhat_hints; return; } |
24071ac1a scripts/sphinx-pr... |
638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 |
if ($system_release =~ /Fedora/) { give_redhat_hints; return; } if ($system_release =~ /Ubuntu/) { give_debian_hints; return; } if ($system_release =~ /Debian/) { give_debian_hints; return; } if ($system_release =~ /openSUSE/) { give_opensuse_hints; return; } |
800d408a3 sphinx-pre-instal... |
654 655 656 657 |
if ($system_release =~ /Mageia/) { give_mageia_hints; return; } |
d6ebf1890 scripts: sphinx-p... |
658 659 660 661 |
if ($system_release =~ /OpenMandriva/) { give_mageia_hints; return; } |
24071ac1a scripts/sphinx-pr... |
662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 |
if ($system_release =~ /Arch Linux/) { give_arch_linux_hints; return; } if ($system_release =~ /Gentoo/) { give_gentoo_hints; return; } # # Fall-back to generic hint code for other distros # That's far from ideal, specially for LaTeX dependencies. # my %map = ( "sphinx-build" => "sphinx" ); |
56e5a6339 scripts/sphinx-pr... |
678 |
check_missing_tex(2) if ($pdf); |
24071ac1a scripts/sphinx-pr... |
679 680 681 682 683 684 685 686 687 688 689 690 |
check_missing(\%map); print "I don't know distro $system_release. "; print "So, I can't provide you a hint with the install procedure. "; print "There are likely missing dependencies. "; } # # Common dependencies # |
2730ce017 scripts/sphinx-pr... |
691 692 |
sub deactivate_help() { |
2f9c50255 scripts: sphinx-p... |
693 694 695 |
printf " If you want to exit the virtualenv, you can use: "; |
2730ce017 scripts/sphinx-pr... |
696 697 698 |
printf "\tdeactivate "; } |
24071ac1a scripts/sphinx-pr... |
699 700 |
sub check_needs() { |
2f9c50255 scripts: sphinx-p... |
701 |
# Check if Sphinx is already accessible from current environment |
9b88ad546 scripts/sphinx-pr... |
702 |
check_sphinx(); |
24071ac1a scripts/sphinx-pr... |
703 |
if ($system_release) { |
ec43a27ff scripts: sphinx-p... |
704 705 |
print "Detected OS: $system_release. "; |
24071ac1a scripts/sphinx-pr... |
706 |
} else { |
ec43a27ff scripts: sphinx-p... |
707 708 |
print "Unknown OS "; |
9b756a9d0 scripts/sphinx-pr... |
709 |
} |
ec43a27ff scripts: sphinx-p... |
710 711 712 |
printf "Sphinx version: %s ", $cur_version if ($cur_version); |
9b756a9d0 scripts/sphinx-pr... |
713 |
|
2f9c50255 scripts: sphinx-p... |
714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 |
# Check python command line, trying first python3 $python_cmd = findprog("python3"); $python_cmd = check_program("python", 0) if (!$python_cmd); # Check the type of virtual env, depending on Python version if ($python_cmd) { if ($virtualenv) { my $tmp = qx($python_cmd --version 2>&1); if ($tmp =~ m/(\d+\.)(\d+\.)/) { if ($1 >= 3 && $2 >= 3) { $need_venv = 1; # python 3.3 or upper } else { $need_virtualenv = 1; } if ($1 < 3) { # Complain if it finds python2 (or worse) printf "Warning: python$1 support is deprecated. Use it with caution! "; } } else { die "Warning: couldn't identify $python_cmd version!"; } } else { add_package("python-sphinx", 0); } } # Set virtualenv command line, if python < 3.3 my $virtualenv_cmd; if ($need_virtualenv) { $virtualenv_cmd = findprog("virtualenv-3"); $virtualenv_cmd = findprog("virtualenv-3.5") if (!$virtualenv_cmd); if (!$virtualenv_cmd) { check_program("virtualenv", 0); $virtualenv_cmd = "virtualenv"; } } |
24071ac1a scripts/sphinx-pr... |
751 |
# Check for needed programs/tools |
24071ac1a scripts/sphinx-pr... |
752 753 754 755 |
check_perl_module("Pod::Usage", 0); check_program("make", 0); check_program("gcc", 0); check_python_module("sphinx_rtd_theme", 1) if (!$virtualenv); |
24071ac1a scripts/sphinx-pr... |
756 757 |
check_program("dot", 1); check_program("convert", 1); |
56e5a6339 scripts/sphinx-pr... |
758 759 760 761 762 |
# Extra PDF files - should use 2 for is_optional check_program("xelatex", 2) if ($pdf); check_program("rsvg-convert", 2) if ($pdf); check_program("latexmk", 2) if ($pdf); |
24071ac1a scripts/sphinx-pr... |
763 |
|
2f9c50255 scripts: sphinx-p... |
764 765 766 767 768 |
if ($need_sphinx || $rec_sphinx_upgrade) { check_python_module("ensurepip", 0) if ($need_venv); } # Do distro-specific checks and output distro-install commands |
24071ac1a scripts/sphinx-pr... |
769 |
check_distros(); |
2f9c50255 scripts: sphinx-p... |
770 771 772 773 774 775 776 777 778 |
if (!$python_cmd) { if ($need == 1) { die "Can't build as $need mandatory dependency is missing"; } elsif ($need) { die "Can't build as $need mandatory dependencies are missing"; } } # Check if sphinx-build is called sphinx-build-3 |
24071ac1a scripts/sphinx-pr... |
779 780 781 782 783 784 |
if ($need_symlink) { printf "\tsudo ln -sf %s /usr/bin/sphinx-build ", which("sphinx-build-3"); } |
2f9c50255 scripts: sphinx-p... |
785 786 787 |
# NOTE: if the system has a too old Sphinx version installed, # it will recommend installing a newer version using virtualenv |
77d09ad9d scripts/sphinx-pr... |
788 |
if ($need_sphinx || $rec_sphinx_upgrade) { |
44f421651 scripts/sphinx-pr... |
789 |
my $min_activate = "$ENV{'PWD'}/${virtenv_prefix}${min_version}/bin/activate"; |
9b88ad546 scripts/sphinx-pr... |
790 |
my @activates = glob "$ENV{'PWD'}/${virtenv_prefix}*/bin/activate"; |
44f421651 scripts/sphinx-pr... |
791 |
|
ec43a27ff scripts: sphinx-p... |
792 793 794 795 796 797 798 799 800 801 |
if ($cur_version lt $rec_version) { print "Warning: It is recommended at least Sphinx version $rec_version. "; print " If you want pdf, you need at least $min_pdf_version. "; } if ($cur_version lt $min_pdf_version) { print "Note: It is recommended at least Sphinx version $min_pdf_version if you need PDF support. "; } |
9b88ad546 scripts/sphinx-pr... |
802 |
@activates = sort {$b cmp $a} @activates; |
a8b380c37 scripts: sphinx-p... |
803 804 |
my ($activate, $ver); foreach my $f (@activates) { |
2834a7412 scripts: sphinx-p... |
805 |
next if ($f lt $min_activate); |
a8b380c37 scripts: sphinx-p... |
806 |
|
2834a7412 scripts: sphinx-p... |
807 |
my $sphinx_cmd = $f; |
a8b380c37 scripts: sphinx-p... |
808 809 |
$sphinx_cmd =~ s/activate/sphinx-build/; next if (! -f $sphinx_cmd); |
44f421651 scripts/sphinx-pr... |
810 |
|
a8b380c37 scripts: sphinx-p... |
811 |
$ver = get_sphinx_version($sphinx_cmd); |
2834a7412 scripts: sphinx-p... |
812 813 814 815 816 817 818 |
if ($need_sphinx && ($ver ge $min_version)) { $activate = $f; last; } elsif ($ver gt $cur_version) { $activate = $f; last; } |
a8b380c37 scripts: sphinx-p... |
819 |
} |
2834a7412 scripts: sphinx-p... |
820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 |
if ($activate ne "") { if ($need_sphinx) { printf " Need to activate Sphinx (version $ver) on virtualenv with: "; printf "\t. $activate "; deactivate_help(); exit (1); } else { printf " You may also use a newer Sphinx (version $ver) with: "; printf "\tdeactivate && . $activate "; } |
5be33182d sphinx-pre-instal... |
836 |
} else { |
44f421651 scripts/sphinx-pr... |
837 |
my $rec_activate = "$virtenv_dir/bin/activate"; |
c428cd522 scripts/sphinx-pr... |
838 |
|
2834a7412 scripts: sphinx-p... |
839 840 841 |
print "To upgrade Sphinx, use: " if ($rec_sphinx_upgrade); |
412b09dda scripts: sphinx-p... |
842 |
$python_cmd = find_python_no_venv(); |
2f9c50255 scripts: sphinx-p... |
843 844 845 846 847 848 849 |
if ($need_venv) { printf "\t$python_cmd -m venv $virtenv_dir "; } else { printf "\t$virtualenv_cmd $virtenv_dir "; } |
44f421651 scripts/sphinx-pr... |
850 851 |
printf "\t. $rec_activate "; |
fb947f3f4 sphinx-pre-instal... |
852 853 |
printf "\tpip install -r $requirement_file "; |
2730ce017 scripts/sphinx-pr... |
854 |
deactivate_help(); |
77d09ad9d scripts/sphinx-pr... |
855 856 |
$need++ if (!$rec_sphinx_upgrade); |
5be33182d sphinx-pre-instal... |
857 |
} |
24071ac1a scripts/sphinx-pr... |
858 859 860 |
} printf " "; |
54002b56b scripts/sphinx-pr... |
861 862 |
print "All optional dependencies are met. " if (!$optional); |
24071ac1a scripts/sphinx-pr... |
863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 |
if ($need == 1) { die "Can't build as $need mandatory dependency is missing"; } elsif ($need) { die "Can't build as $need mandatory dependencies are missing"; } print "Needed package dependencies are met. "; } # # Main # while (@ARGV) { my $arg = shift(@ARGV); if ($arg eq "--no-virtualenv") { $virtualenv = 0; } elsif ($arg eq "--no-pdf"){ $pdf = 0; |
9b88ad546 scripts/sphinx-pr... |
885 886 |
} elsif ($arg eq "--version-check"){ $version_check = 1; |
24071ac1a scripts/sphinx-pr... |
887 |
} else { |
9b88ad546 scripts/sphinx-pr... |
888 889 890 891 892 893 894 895 896 897 898 899 900 |
print "Usage: \t$0 <--no-virtualenv> <--no-pdf> <--version-check> "; print "Where: "; print "\t--no-virtualenv\t- Recommend installing Sphinx instead of using a virtualenv "; print "\t--version-check\t- if version is compatible, don't check for missing dependencies "; print "\t--no-pdf\t- don't check for dependencies required to build PDF docs "; |
24071ac1a scripts/sphinx-pr... |
901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 |
exit -1; } } # # Determine the system type. There's no standard unique way that would # work with all distros with a minimal package install. So, several # methods are used here. # # By default, it will use lsb_release function. If not available, it will # fail back to reading the known different places where the distro name # is stored # $system_release = qx(lsb_release -d) if which("lsb_release"); $system_release =~ s/Description:\s*// if ($system_release); $system_release = catcheck("/etc/system-release") if !$system_release; $system_release = catcheck("/etc/redhat-release") if !$system_release; $system_release = catcheck("/etc/lsb-release") if !$system_release; $system_release = catcheck("/etc/gentoo-release") if !$system_release; |
d14d0c1ae scripts: sphinx-p... |
921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 |
# This seems more common than LSB these days if (!$system_release) { my %os_var; if (open IN, "cat /etc/os-release|") { while (<IN>) { if (m/^([\w\d\_]+)=\"?([^\"]*)\"? /) { $os_var{$1}=$2; } } $system_release = $os_var{"NAME"}; if (defined($os_var{"VERSION_ID"})) { $system_release .= " " . $os_var{"VERSION_ID"} if (defined($os_var{"VERSION_ID"})); } else { $system_release .= " " . $os_var{"VERSION"}; } } } |
24071ac1a scripts/sphinx-pr... |
940 941 942 943 |
$system_release = catcheck("/etc/issue") if !$system_release; $system_release =~ s/\s+$//; check_needs; |