Добавление поддержки новых видеокарт и драйверов

GPU Fan Meister не имеет поддержки видеокарт сам по себе. Эту возможность добавляют плагины. Каждый плагин представляет из себя набор файлов, которые будут загружаться основной программой.

Идентификатор плагина

Каждый плагин должен иметь идентификатор вида <категория>-<имя>.

  • Категория определяет тип поддерживаемых устройств. Пример: amd. Одновременно может быть включён только один плагин из каждой категории. Название категории может состоять из букв a-z в нижнем регистре и цифр 0-9, при этом должно начинаться с буквы.

  • Имя задаёт уникальный идентификатор плагина внутри выбранной категории. Пример: mesa-free. Имя может состоять из букв a-z в нижнем регистре, цифр 0-9 и дефиса -, при этом должно начинаться с буквы.

Для краткости идентификатор плагина далее будет обозначаться как <id>.

Файлы плагина

Файлы каждого плагина могут размещаться в одной из папок для поиска, в подпапке plugins/<id>. Например, если плагин называется amd-mesa-free, а одна из папок поиска /usr/local/share/gpu-fan-meister, то плагин, чтобы его могло обнаружить приложение, может быть размещён в папке /usr/local/share/gpu-fan-meister/plugins/amd-mesa-free. Плагин должен содержать как минимум три файла:

  • <id>-init

    Код в этом файле выполняется до запуска GPU Fan Meister. Если файл завершит работу, вернув ненулевой код выхода, то соответствующий плагин не будет загружен, а пользователю выдастся системное сообщение, содержащее текст из стандартного потока вывода ошибок (stderr). Файл может иметь любое расширение или совсем никакого, но операционная система должна иметь возможность понять, что файл является запускаемым (например, в Linux надо установить исполняемый флаг на этот файл).

    Пример расположения: .../plugins/amd-mesa-free/amd-mesa-free-init.sh

    Данный файл может установить новые переменные окружения, которые будут переданы основной программе и другими плагинам. Для этого, файл <id>-init должен вывести в стандартный поток вывода (stdout) строки в формате <ключ>=<значение>. Пустые строки, строки, начинающиеся с #, и строки без символа = игнорируются. <ключ> не может содержать символ =. Если <ключ> или <значение> содержат пробелы с начала или конца строки, то эти пробелы будут удалены.

    Существующие переменные окружения могут быть перезаписаны или дополнены. Если требуется дописать новые данные в конец существующей переменной окружения, то первым символом в строке <значение> должен быть разделитель пути, который используется в операционной системе (например, для Linux это :). Если требуется дописать что-то в начало переменной, то разделитель пути должен быть последним символом в строке <значение>.

    Пример:

    Имеются следующие существующие переменные окружения:

    PATH=/bin:/usr/bin
    LD_LIBRARY_PATH=/usr/lib
    ABC=123
    BOGUS=simsalabim
    

    Файл <id>-init выводит следующий текст в stdout:

    ABC =  666
    DEF = 7 7 7
    
    PATH=:/opt/bin:/home/user/bin
    #BOGUS=abracadabra
    LD_LIBRARY_PATH=/opt/lib:
    

    В таком случае, итоговый набор переменных окружения по завершению работы <id>-init, будет следующим:

    PATH=/bin:/usr/bin:/opt/bin:/home/user/bin
    LD_LIBRARY_PATH=/opt/lib:/usr/lib
    ABC=666
    BOGUS=simsalabim
    DEF=7 7 7
    

    К этим переменным окружения будут иметь доступ все плагины и файлы, загружаемые после данного файла, за исключением других *-init файлов.

  • <id>-deinit

    Код в этом файле выполняется после завершения работы GPU Fan Meister. Если файл вернёт ненулевой код выхода, то пользователю выдастся системное сообщение, содержащее текст из стандартного потока вывода ошибок (stderr). Запуск этого файла происходит только в случае успешного выполнения <id>-init. Файл будет выполнен, даже если в GPU Fan Meister произошёл фатальный сбой, повлекший за собой внезапную остановку программы. Файл может иметь любое расширение или совсем никакого, но операционная система должна иметь возможность понять, что файл является запускаемым (например, в Linux надо установить исполняемый флаг на этот файл).

    Пример расположения: .../plugins/amd-mesa-free/amd-mesa-free-deinit.py

  • gpufancontrol-<id>

    Данный файл является динамической библиотекой, которая будет загружена GPU Fan Meister. Файл должен иметь название, соответствующее стандартному именованию динамических библиотек в операционной системе, включая номер мажорной версии, где это применимо (например, для Linux требуется добавление префикса "lib", расширения ".so" и номера версии типа ".1"). Требуемый интерфейс библиотеки описан в файле shared/include/gpufanmeister/plugin.h.

    Пример расположения: .../plugins/amd-mesa-free/libgpufancontrol-amd-mesa-free.so.1

    При этом, будет загружен библиотека с номером версии, соответствующим мажорной версии GPU Fan Meister. Например, если версия GPU Fan Meister - 1.2.3, то будет загружена библиотека libgpufancontrol-amd-mesa-free.so.1, а если версия GPU Fan Meister - 2.3.4, то будет загружена библиотека libgpufancontrol-amd-mesa-free.so.2. Как следствие, плагин может содержать в себе несколько версий библиотеки. Библиотеки могут быть символьными ссылками.

Пример

В качестве примера готового плагина можно взять исходники плагина nvidia-nvml, который поставляется вместе с GPU Fan Meister: https://github.com/alkatrazstudio/gpu-fan-meister/blob/master/plugins/nvidia-nvml.