This folder contains the necessary files to build the Python bindings for
libcpupower (aside from the libcpupower object files).


requirements
------------

* If you are building completely from upstream; please install libcpupower by
running `make install-lib` within the cpupower directory. This installs the
libcpupower.so file and symlinks needed. Otherwise, please make sure a symlink
to libcpupower.so exists in your library path from your distribution's
packages.
* The SWIG program must be installed.
* The Python's development libraries must be installed.

Please check that your version of SWIG is compatible with the version of Python
installed on your machine by checking the SWIG changelog on their website.
https://swig.org/

Note that while SWIG itself is GPL v3+ licensed; the resulting output,
the bindings code: is permissively licensed + the license of libcpupower's
library files. For these bindings that means GPL v2.

Please see https://swig.org/legal.html and the discussion [1] for more details.

[1]
https://lore.kernel.org/linux-pm/Zqv9BOjxLAgyNP5B@hatbackup/


build
-----

Install SWIG and the Python development files provided by your distribution.

Build the object files for libcpupower by running make in the cpupower
directory.

Return to the directory this README is in to run:

$ make


testing
-------

Please verify the _raw_pylibcpupower.so and raw_pylibcpupower.py files have
been created.

To run the test script:

$ python test_raw_pylibcpupower.py


developing/using the bindings directly
--------------------------------------

You need to add the Python bindings directory to your $PYTHONPATH.

You would set the path in the Bash terminal or in the Bash profile:

PYTHONPATH=~/linux/tools/power/cpupower/bindings/python:$PYTHONPATH

This allows you to set a specific repo of the bindings to use.


installing/uninstalling
-----------------------

Python uses a system specific site-packages folder to look up modules to import
by default. You do not need to install cpupower to use the SWIG bindings.

You can install and uninstall the bindings to the site-packages with:

sudo make install

sudo make uninstall


credits
-------

Original Bindings Author:
John B. Wyatt IV
jwyatt@redhat.com
sageofredondo@gmail.com

Copyright (C) 2024 Red Hat
