From f7cb43462e38f0af8a70846771c4194640aa53ea Mon Sep 17 00:00:00 2001 From: "Galantsev, Dmitrii" Date: Wed, 11 Oct 2023 21:54:09 -0500 Subject: [PATCH] Add wrapper generator Change-Id: I34a191acfefbef2e40d0242eb121ba9af55cb9de Signed-off-by: Galantsev, Dmitrii [ROCm/amdsmi commit: c94036de219697b3c40d45d80584f0d96b59519e] --- projects/amdsmi/README.md | 15 +++---- projects/amdsmi/py-interface/CMakeLists.txt | 9 ++-- projects/amdsmi/py-interface/Dockerfile | 43 +++++++++++++++++++ .../amdsmi/py-interface/amdsmi_wrapper.py | 2 +- projects/amdsmi/update_wrapper.sh | 36 ++++++++++++++++ 5 files changed, 92 insertions(+), 13 deletions(-) create mode 100644 projects/amdsmi/py-interface/Dockerfile create mode 100755 projects/amdsmi/update_wrapper.sh diff --git a/projects/amdsmi/README.md b/projects/amdsmi/README.md index 7de1330296..3e78fb9321 100755 --- a/projects/amdsmi/README.md +++ b/projects/amdsmi/README.md @@ -118,7 +118,7 @@ To build the documentation locally, run the commands below: ``` bash cd docs -pip3 install -r sphinx/requirements.txt +python3 -m pip install -r sphinx/requirements.txt python3 -m sphinx -T -E -b html -d _build/doctrees -D language=en . _build/html ``` @@ -203,15 +203,14 @@ The python wrapper (binding) is an auto-generated file `py-interface/amdsmi_wrap Wrapper should be re-generated on each C++ API change, by doing: ```bash -cmake .. -DBUILD_WRAPPER=on -make python_wrapper # or simply 'make' +./update_wrapper.sh ``` After this command, the file in `py-interface/amdsmi_wrapper.py` will be automatically updated on each compile. -Note: To be able to re-generate python wrapper you need several tools installed on your system: clang-14, clang-format, libclang-dev, and ***python3.7 or newer***. +Note: To be able to re-generate python wrapper you need **docker** installed. -Note: python_wrapper is NOT automatically re-generated. You must run `cmake` with `-DBUILD_WRAPPER=on` argument. +Note: python_wrapper is NOT automatically re-generated. You must run `./update_wrapper.sh`. ## Building AMD SMI @@ -219,14 +218,14 @@ Note: python_wrapper is NOT automatically re-generated. You must run `cmake` wit In order to build the AMD SMI library, the following components are required. Note that the software versions listed are what was used in development. Earlier versions are not guaranteed to work: -* CMake (v3.11.0) - `pip3 install cmake` +* CMake (v3.14.0) - `python3 -m pip install cmake` * g++ (5.4.0) In order to build the AMD SMI python package, the following components are required: * clang (14.0 or above) -* python (3.6 or above) -* virtualenv - `pip3 install virtualenv` +* python (3.7 or above) +* virtualenv - `python3 -m pip install virtualenv` In order to build the latest documentation, the following are required: diff --git a/projects/amdsmi/py-interface/CMakeLists.txt b/projects/amdsmi/py-interface/CMakeLists.txt index dc1d498103..4582776ecc 100644 --- a/projects/amdsmi/py-interface/CMakeLists.txt +++ b/projects/amdsmi/py-interface/CMakeLists.txt @@ -1,8 +1,9 @@ # Generate py-interface and package targets -# CLANG installed must be 14.0 or above -set(clang_ver 14.0) -set(ctypeslib_ver 2.3.2) +# CLANG installed must be 16.0 or above +set(clang_ver 16.0) +set(clang_ver_py 16.0.1) +set(ctypeslib_ver_py 2.3.4) set(PY_BUILD_DIR "python_package") # amdsmi part of this string is the directory containing all python files @@ -52,7 +53,7 @@ else() endif() add_custom_target( python_pre_reqs - COMMAND ${Python3_EXECUTABLE} -m pip install ${Python3_BREAK_SYSTEM_PACKAGES} clang==${clang_ver} ctypeslib2==${ctypeslib_ver}) + COMMAND ${Python3_EXECUTABLE} -m pip install ${Python3_BREAK_SYSTEM_PACKAGES} clang==${clang_ver_py} ctypeslib2==${ctypeslib_ver_py}) # generate new wrapper configure_file(${PROJECT_SOURCE_DIR}/tools/generator.py generator.py @ONLY COPYONLY) add_custom_command( diff --git a/projects/amdsmi/py-interface/Dockerfile b/projects/amdsmi/py-interface/Dockerfile new file mode 100644 index 0000000000..5218f76946 --- /dev/null +++ b/projects/amdsmi/py-interface/Dockerfile @@ -0,0 +1,43 @@ +FROM ubuntu:latest + +# do not prompt in apt +# https://github.com/moby/moby/issues/4032#issuecomment-163689851 +ARG DEBIAN_FRONTEND=noninteractive +ARG DEBCONF_NONINTERACTIVE_SEEN=true + +# set timezone +ENV TZ="America/Chicago" +RUN ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone + +RUN apt update --yes \ + && apt install --yes \ + build-essential \ + cmake \ + gnupg \ + libdrm-dev \ + libpython3-dev \ + lsb-release \ + pkg-config \ + pkg-config \ + python3-pip \ + software-properties-common \ + wget \ + && apt clean \ + && rm -rf /var/cache/apt/ /var/lib/apt/lists/* + +WORKDIR /var/tmp +RUN TEMPDIR=$(mktemp -d) \ + && cd $TEMPDIR \ + && wget https://apt.llvm.org/llvm.sh && chmod +x llvm.sh \ + && ./llvm.sh 16 \ + && update-alternatives --install /usr/bin/clang clang $(which clang-16) 91 --slave /usr/bin/clang++ clang++ $(which clang++-16) \ + && python3 -m pip install --no-cache-dir clang==16.0.1 ctypeslib2==2.3.4 -U \ + && rm -rf $TEMPDIR + +WORKDIR /src +CMD cp -r /src /tmp/src \ + && cd /tmp/src \ + && rm -rf build .cache \ + && cmake -B build -DBUILD_WRAPPER=ON \ + && make -C build -j $(nproc) \ + && cp /tmp/src/py-interface/amdsmi_wrapper.py /src/py-interface/amdsmi_wrapper.py diff --git a/projects/amdsmi/py-interface/amdsmi_wrapper.py b/projects/amdsmi/py-interface/amdsmi_wrapper.py index 1e48cf7636..883ffd5b7f 100644 --- a/projects/amdsmi/py-interface/amdsmi_wrapper.py +++ b/projects/amdsmi/py-interface/amdsmi_wrapper.py @@ -23,7 +23,7 @@ import os # -*- coding: utf-8 -*- # -# TARGET arch is: ['-I/usr/lib64/clang/17/include'] +# TARGET arch is: ['-I/usr/lib/llvm-16/lib/clang/16/include'] # WORD_SIZE is: 8 # POINTER_SIZE is: 8 # LONGDOUBLE_SIZE is: 16 diff --git a/projects/amdsmi/update_wrapper.sh b/projects/amdsmi/update_wrapper.sh new file mode 100755 index 0000000000..d7bc4da8e8 --- /dev/null +++ b/projects/amdsmi/update_wrapper.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash + +# this program generates py-interface/amdsmi_wrapper.py + +set -eu + +# get current dir +DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +# override by calling this script with: +# DOCKER_NAME=yourdockername ./update_wrapper.sh +DOCKER_NAME="${DOCKER_NAME:-dmitriigalantsev/amdsmi_wrapper_updater}" + +command -v docker &>/dev/null || { + echo "Please install docker!" >&2 + exit 1 +} + +does_image_exist () { + docker images | grep -q "$DOCKER_NAME" +} + +if ! does_image_exist; then + # if you prefer to not generate it yourself: + # pull from https://hub.docker.com/r/dmitriigalantsev/amdsmi_wrapper_updater + # using the following command: + # docker pull dmitriigalantsev/amdsmi_wrapper_updater + echo "No docker image found! Generating one" + # set to 0 because it's compatible with more systems + DOCKER_BUILDKIT="${DOCKER_BUILDKIT:0}" docker build "$DIR/py-interface" -t "$DOCKER_NAME":latest +fi + +docker run --rm -ti --volume "$DIR":/src:rw "$DOCKER_NAME":latest + +echo -e "Generated new wrapper! +[$DIR/py-interface/amdsmi_wrapper.py]"