1.2.1: cannot build documentation without installing module

### Describe the bug

Looks like something is wrong and I cannot build docuemtation without installing module.


### Steps/Code to Reproduce

N/A

### Expected Results

It should be possible to build documentation out of only what is in source tree a d withoit have installed module.

### Actual Results

<details>

```console
++ ls -1d lib.linux-x86_64-cpython-38
+ PYTHONPATH=/home/tkloczko/rpmbuild/BUILD/scikit-learn-1.2.1/build/lib.linux-x86_64-cpython-38
+ PBR_VERSION=1.2.1
+ PDM_PEP517_SCM_VERSION=1.2.1
+ SETUPTOOLS_SCM_PRETEND_VERSION=1.2.1
+ /usr/bin/sphinx-build -n -T -b man doc build/sphinx/man
Running Sphinx v6.1.3

Traceback (most recent call last):
  File "/home/tkloczko/rpmbuild/BUILD/scikit-learn-1.2.1/sklearn/__check_build/__init__.py", line 48, in <module>
    from ._check_build import check_build  # noqa
ModuleNotFoundError: No module named 'sklearn.__check_build._check_build'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.8/site-packages/sphinx/config.py", line 351, in eval_config_file
    exec(code, namespace)  # NoQA: S102
  File "/home/tkloczko/rpmbuild/BUILD/scikit-learn-1.2.1/doc/conf.py", line 20, in <module>
    from sklearn.externals._packaging.version import parse
  File "/home/tkloczko/rpmbuild/BUILD/scikit-learn-1.2.1/sklearn/__init__.py", line 81, in <module>
    from . import __check_build  # noqa: F401
  File "/home/tkloczko/rpmbuild/BUILD/scikit-learn-1.2.1/sklearn/__check_build/__init__.py", line 50, in <module>
    raise_build_error(e)
  File "/home/tkloczko/rpmbuild/BUILD/scikit-learn-1.2.1/sklearn/__check_build/__init__.py", line 31, in raise_build_error
    raise ImportError(
ImportError: No module named 'sklearn.__check_build._check_build'
___________________________________________________________________________
Contents of /home/tkloczko/rpmbuild/BUILD/scikit-learn-1.2.1/sklearn/__check_build:
__init__.py               _check_build.pyx          _check_build.c
__pycache__
___________________________________________________________________________
It seems that scikit-learn has not been built correctly.

If you have installed scikit-learn from source, please do not forget
to build the package before using it: run `python setup.py install` or
`make` in the source directory.

If you have used an installer, please check that it is suited for your
Python version, your operating system and your platform.

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/lib/python3.8/site-packages/sphinx/cmd/build.py", line 279, in build_main
    app = Sphinx(args.sourcedir, args.confdir, args.outputdir,
  File "/usr/lib/python3.8/site-packages/sphinx/application.py", line 202, in __init__
    self.config = Config.read(self.confdir, confoverrides or {}, self.tags)
  File "/usr/lib/python3.8/site-packages/sphinx/config.py", line 173, in read
    namespace = eval_config_file(filename, tags)
  File "/usr/lib/python3.8/site-packages/sphinx/config.py", line 364, in eval_config_file
    raise ConfigError(msg % traceback.format_exc()) from exc
sphinx.errors.ConfigError: There is a programmable error in your configuration file:

Traceback (most recent call last):
  File "/home/tkloczko/rpmbuild/BUILD/scikit-learn-1.2.1/sklearn/__check_build/__init__.py", line 48, in <module>
    from ._check_build import check_build  # noqa
ModuleNotFoundError: No module named 'sklearn.__check_build._check_build'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.8/site-packages/sphinx/config.py", line 351, in eval_config_file
    exec(code, namespace)  # NoQA: S102
  File "/home/tkloczko/rpmbuild/BUILD/scikit-learn-1.2.1/doc/conf.py", line 20, in <module>
    from sklearn.externals._packaging.version import parse
  File "/home/tkloczko/rpmbuild/BUILD/scikit-learn-1.2.1/sklearn/__init__.py", line 81, in <module>
    from . import __check_build  # noqa: F401
  File "/home/tkloczko/rpmbuild/BUILD/scikit-learn-1.2.1/sklearn/__check_build/__init__.py", line 50, in <module>
    raise_build_error(e)
  File "/home/tkloczko/rpmbuild/BUILD/scikit-learn-1.2.1/sklearn/__check_build/__init__.py", line 31, in raise_build_error
    raise ImportError(
ImportError: No module named 'sklearn.__check_build._check_build'
___________________________________________________________________________
Contents of /home/tkloczko/rpmbuild/BUILD/scikit-learn-1.2.1/sklearn/__check_build:
__init__.py               _check_build.pyx          _check_build.c
__pycache__
___________________________________________________________________________
It seems that scikit-learn has not been built correctly.

If you have installed scikit-learn from source, please do not forget
to build the package before using it: run `python setup.py install` or
`make` in the source directory.

If you have used an installer, please check that it is suited for your
Python version, your operating system and your platform.


Configuration error:
There is a programmable error in your configuration file:

Traceback (most recent call last):
  File "/home/tkloczko/rpmbuild/BUILD/scikit-learn-1.2.1/sklearn/__check_build/__init__.py", line 48, in <module>
    from ._check_build import check_build  # noqa
ModuleNotFoundError: No module named 'sklearn.__check_build._check_build'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.8/site-packages/sphinx/config.py", line 351, in eval_config_file
    exec(code, namespace)  # NoQA: S102
  File "/home/tkloczko/rpmbuild/BUILD/scikit-learn-1.2.1/doc/conf.py", line 20, in <module>
    from sklearn.externals._packaging.version import parse
  File "/home/tkloczko/rpmbuild/BUILD/scikit-learn-1.2.1/sklearn/__init__.py", line 81, in <module>
    from . import __check_build  # noqa: F401
  File "/home/tkloczko/rpmbuild/BUILD/scikit-learn-1.2.1/sklearn/__check_build/__init__.py", line 50, in <module>
    raise_build_error(e)
  File "/home/tkloczko/rpmbuild/BUILD/scikit-learn-1.2.1/sklearn/__check_build/__init__.py", line 31, in raise_build_error
    raise ImportError(
ImportError: No module named 'sklearn.__check_build._check_build'
___________________________________________________________________________
Contents of /home/tkloczko/rpmbuild/BUILD/scikit-learn-1.2.1/sklearn/__check_build:
__init__.py               _check_build.pyx          _check_build.c
__pycache__
___________________________________________________________________________
It seems that scikit-learn has not been built correctly.

If you have installed scikit-learn from source, please do not forget
to build the package before using it: run `python setup.py install` or
`make` in the source directory.

If you have used an installer, please check that it is suited for your
Python version, your operating system and your platform.
```
</details>

### Versions

```shell
1.2.1
```

COMMENT:
Reading the thread, I'll try to summarize points which I think are relevant to us

## Packaging
It is possible to package the library w/o any changes, you just need to change the way you build and create the packages, e.g. create a separate env for each package build. So this is not a motivation for a change. Other distros already package scikit-learn.

## Relative Imports
Some interesting points are raised in https://github.com/scikit-learn/scikit-learn/issues/25766#issuecomment-1627429652 regarding extra syscalls. I'm not sure if they're true, I'd need to check with how the module finder works exactly.

I know many other libraries use absolute imports, but I find it confusing, as the imports will end up importing from a different location if you're not careful about where you start your python process. Apparently this is not an issue for those packages.

I might be convinced with the right argument to move to absolute imports (I do find them cleaner to read at least).

## Moving Tests
Moving tests outside of the source tree might have marginal benefits like not including them in our distributions and have a cleaner source tree. But for any project the size of our project these things are not trivial to do since they introduce a lot of friction for a while. I personally don't have a strong preference on whether we should move them or not.

## Misc
>  In such case build process is done from non-root account and it is not possible to install module.

One can always create an environment and install there, so being a non-root user is a non-issue in python. In fact, I personally strongly discourage people from installing any of the packages in the ecosystem as `root` anyway. They really SHOULD have a different environment for each project they have.

> If you will look closer on spreaded in different locations tests/ subdirectories you will find that NONE of the code in that directories uses relative imports -> code in those directories can be freely moved around without additional changes.
The same property will have actual module code after remove relative imports.

In rare occasions we import from those tests in other tests, so that'd need to be changed, but not a big deal I'd say. I personally don't mind it either way, except that packaging w/o the tests included would be easier if we move them somewhere else.

Labels: Bug, Documentation, Needs Decision - Include Feature