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