Merge tag 'thermal-v5.15-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/therma...
[linux-2.6-microblaze.git] / scripts / sphinx-pre-install
index fe92020..288e86a 100755 (executable)
@@ -22,16 +22,18 @@ my $need = 0;
 my $optional = 0;
 my $need_symlink = 0;
 my $need_sphinx = 0;
-my $need_venv = 0;
+my $need_pip = 0;
 my $need_virtualenv = 0;
 my $rec_sphinx_upgrade = 0;
 my $install = "";
 my $virtenv_dir = "";
 my $python_cmd = "";
+my $activate_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
+my $latest_avail_ver;
 
 #
 # Command line arguments
@@ -319,10 +321,7 @@ sub check_sphinx()
                return;
        }
 
-       if ($cur_version lt $rec_version) {
-               $rec_sphinx_upgrade = 1;
-               return;
-       }
+       return if ($cur_version lt $rec_version);
 
        # On version check mode, just assume Sphinx has all mandatory deps
        exit (0) if ($version_check);
@@ -701,6 +700,162 @@ sub deactivate_help()
        printf "\tdeactivate\n";
 }
 
+sub get_virtenv()
+{
+       my $ver;
+       my $min_activate = "$ENV{'PWD'}/${virtenv_prefix}${min_version}/bin/activate";
+       my @activates = glob "$ENV{'PWD'}/${virtenv_prefix}*/bin/activate";
+
+       @activates = sort {$b cmp $a} @activates;
+
+       foreach my $f (@activates) {
+               next if ($f lt $min_activate);
+
+               my $sphinx_cmd = $f;
+               $sphinx_cmd =~ s/activate/sphinx-build/;
+               next if (! -f $sphinx_cmd);
+
+               my $ver = get_sphinx_version($sphinx_cmd);
+               if ($need_sphinx && ($ver ge $min_version)) {
+                       return ($f, $ver);
+               } elsif ($ver gt $cur_version) {
+                       return ($f, $ver);
+               }
+       }
+       return ("", "");
+}
+
+sub recommend_sphinx_upgrade()
+{
+       my $venv_ver;
+
+       # Avoid running sphinx-builds from venv if $cur_version is good
+       if ($cur_version && ($cur_version ge $rec_version)) {
+               $latest_avail_ver = $cur_version;
+               return;
+       }
+
+       # Get the highest version from sphinx_*/bin/sphinx-build and the
+       # corresponding command to activate the venv/virtenv
+       $activate_cmd = get_virtenv();
+
+       # Store the highest version from Sphinx existing virtualenvs
+       if (($activate_cmd ne "") && ($venv_ver gt $cur_version)) {
+               $latest_avail_ver = $venv_ver;
+       } else {
+               $latest_avail_ver = $cur_version if ($cur_version);
+       }
+
+       # As we don't know package version of Sphinx, and there's no
+       # virtual environments, don't check if upgrades are needed
+       if (!$virtualenv) {
+               return if (!$latest_avail_ver);
+       }
+
+       # Either there are already a virtual env or a new one should be created
+       $need_pip = 1;
+
+       # Return if the reason is due to an upgrade or not
+       if ($latest_avail_ver lt $rec_version) {
+               $rec_sphinx_upgrade = 1;
+       }
+}
+
+#
+# The logic here is complex, as it have to deal with different versions:
+#      - minimal supported version;
+#      - minimal PDF version;
+#      - recommended version.
+# It also needs to work fine with both distro's package and venv/virtualenv
+sub recommend_sphinx_version($)
+{
+       my $virtualenv_cmd = shift;
+
+       if ($latest_avail_ver lt $min_pdf_version) {
+               print "note: If you want pdf, you need at least Sphinx $min_pdf_version.\n";
+       }
+
+       # Version is OK. Nothing to do.
+       return if ($cur_version && ($cur_version ge $rec_version));
+
+       if (!$need_sphinx) {
+               # sphinx-build is present and its version is >= $min_version
+
+               #only recommend enabling a newer virtenv version if makes sense.
+               if ($latest_avail_ver gt $cur_version) {
+                       printf "\nYou may also use the newer Sphinx version $latest_avail_ver with:\n";
+                       printf "\tdeactivate\n"  if ($ENV{'PWD'} =~ /${virtenv_prefix}/);
+                       printf "\t. $activate_cmd\n";
+                       deactivate_help();
+
+                       return;
+               }
+               return if ($latest_avail_ver ge $rec_version);
+       }
+
+       if (!$virtualenv) {
+               # No sphinx either via package or via virtenv. As we can't
+               # Compare the versions here, just return, recommending the
+               # user to install it from the package distro.
+               return if (!$latest_avail_ver);
+
+               # User doesn't want a virtenv recommendation, but he already
+               # installed one via virtenv with a newer version.
+               # So, print commands to enable it
+               if ($latest_avail_ver gt $cur_version) {
+                       printf "\nYou may also use the Sphinx virtualenv version $latest_avail_ver with:\n";
+                       printf "\tdeactivate\n"  if ($ENV{'PWD'} =~ /${virtenv_prefix}/);
+                       printf "\t. $activate_cmd\n";
+                       deactivate_help();
+
+                       return;
+               }
+               print "\n";
+       } else {
+               $need++ if ($need_sphinx);
+       }
+
+       # Suggest newer versions if current ones are too old
+       if ($latest_avail_ver && $cur_version ge $min_version) {
+               # If there's a good enough version, ask the user to enable it
+               if ($latest_avail_ver ge $rec_version) {
+                       printf "\nNeed to activate Sphinx (version $latest_avail_ver) on virtualenv with:\n";
+                       printf "\t. $activate_cmd\n";
+                       deactivate_help();
+
+                       return;
+               }
+
+               # Version is above the minimal required one, but may be
+               # below the recommended one. So, print warnings/notes
+
+               if ($latest_avail_ver lt $rec_version) {
+                       print "Warning: It is recommended at least Sphinx version $rec_version.\n";
+               }
+       }
+
+       # At this point, either it needs Sphinx or upgrade is recommended,
+       # both via pip
+
+       if ($rec_sphinx_upgrade) {
+               if (!$virtualenv) {
+                       print "Instead of install/upgrade Python Sphinx pkg, you could use pip/pypi with:\n\n";
+               } else {
+                       print "To upgrade Sphinx, use:\n\n";
+               }
+       } else {
+               print "Sphinx needs to be installed either as a package or via pip/pypi with:\n";
+       }
+
+       $python_cmd = find_python_no_venv();
+
+       printf "\t$virtualenv_cmd $virtenv_dir\n";
+
+       printf "\t. $virtenv_dir/bin/activate\n";
+       printf "\tpip install -r $requirement_file\n";
+       deactivate_help();
+}
+
 sub check_needs()
 {
        # Check if Sphinx is already accessible from current environment
@@ -722,15 +877,14 @@ sub check_needs()
                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) {
                                        # Fail if it finds python2 (or worse)
                                        die "Python 3 is required to build the kernel docs\n";
                                }
+                               if ($1 == 3 && $2 < 3) {
+                                       # Need Python 3.3 or upper for venv
+                                       $need_virtualenv = 1;
+                               }
                        } else {
                                die "Warning: couldn't identify $python_cmd version!";
                        }
@@ -739,14 +893,22 @@ sub check_needs()
                }
        }
 
-       # Set virtualenv command line, if python < 3.3
+       recommend_sphinx_upgrade();
+
        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";
+
+       if ($need_pip) {
+               # Set virtualenv command line, if python < 3.3
+               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";
+                       }
+               } else {
+                       $virtualenv_cmd = "$python_cmd -m venv";
+                       check_python_module("ensurepip", 0);
                }
        }
 
@@ -763,10 +925,6 @@ sub check_needs()
        check_program("rsvg-convert", 2) if ($pdf);
        check_program("latexmk", 2) if ($pdf);
 
-       if ($need_sphinx || $rec_sphinx_upgrade) {
-               check_python_module("ensurepip", 0) if ($need_venv);
-       }
-
        # Do distro-specific checks and output distro-install commands
        check_distros();
 
@@ -784,67 +942,7 @@ sub check_needs()
                       which("sphinx-build-3");
        }
 
-       # NOTE: if the system has a too old Sphinx version installed,
-       # it will recommend installing a newer version using virtualenv
-
-       if ($need_sphinx || $rec_sphinx_upgrade) {
-               my $min_activate = "$ENV{'PWD'}/${virtenv_prefix}${min_version}/bin/activate";
-               my @activates = glob "$ENV{'PWD'}/${virtenv_prefix}*/bin/activate";
-
-               if ($cur_version lt $rec_version) {
-                       print "Warning: It is recommended at least Sphinx version $rec_version.\n";
-                       print "         If you want pdf, you need at least $min_pdf_version.\n";
-               }
-               if ($cur_version lt $min_pdf_version) {
-                       print "Note: It is recommended at least Sphinx version $min_pdf_version if you need PDF support.\n";
-               }
-               @activates = sort {$b cmp $a} @activates;
-               my ($activate, $ver);
-               foreach my $f (@activates) {
-                       next if ($f lt $min_activate);
-
-                       my $sphinx_cmd = $f;
-                       $sphinx_cmd =~ s/activate/sphinx-build/;
-                       next if (! -f $sphinx_cmd);
-
-                       $ver = get_sphinx_version($sphinx_cmd);
-                       if ($need_sphinx && ($ver ge $min_version)) {
-                               $activate = $f;
-                               last;
-                       } elsif ($ver gt $cur_version) {
-                               $activate = $f;
-                               last;
-                       }
-               }
-               if ($activate ne "") {
-                       if ($need_sphinx) {
-                               printf "\nNeed to activate Sphinx (version $ver) on virtualenv with:\n";
-                               printf "\t. $activate\n";
-                               deactivate_help();
-                               exit (1);
-                       } else {
-                               printf "\nYou may also use a newer Sphinx (version $ver) with:\n";
-                               printf "\tdeactivate && . $activate\n";
-                       }
-               } else {
-                       my $rec_activate = "$virtenv_dir/bin/activate";
-
-                       print "To upgrade Sphinx, use:\n\n" if ($rec_sphinx_upgrade);
-
-                       $python_cmd = find_python_no_venv();
-
-                       if ($need_venv) {
-                               printf "\t$python_cmd -m venv $virtenv_dir\n";
-                       } else {
-                               printf "\t$virtualenv_cmd $virtenv_dir\n";
-                       }
-                       printf "\t. $rec_activate\n";
-                       printf "\tpip install -r $requirement_file\n";
-                       deactivate_help();
-
-                       $need++ if (!$rec_sphinx_upgrade);
-               }
-       }
+       recommend_sphinx_version($virtualenv_cmd);
        printf "\n";
 
        print "All optional dependencies are met.\n" if (!$optional);