OS-dependent libraries¶
This feature allows you to download and unpack libraries with appropriate binaries for the indicated operating system during the build process. To do this, you need to expand the meta section in the global configuration with the os-dependentLibraries field. This field takes the following attributes:
Property | Type | Description | default value |
---|---|---|---|
name* | string | is the name of the library we want to download. | - |
version* | string | is the specific version of the given library. | - |
dependencies | boolean | (Optional) is the parameter which determines whether the --no-deps flag will be used when installing the package from pip . When the value is set to true , the library will be installed along with all its dependencies. When the value is set to false (default) {name}={version} , it must be present in packages requirements.txt . |
false |
platform* | string | is the platform for downloading the specified library. The value depends on the available wheels for a given library, for example, for this wheel, cryptography-41.0.5-cp37-abi3-manylinux_2_28_x86_64.whl, the platform is manylinux_2_28_x86_64. | - |
python_version* | string | is the python version compatible with the library. | - |
target* | string | is the Path where the selected library will be unpacked. | - |
os* | string | is the name of the operating system which the library is intended for. Using this parameter, an appropriate insert into sys.path will be created. It takes 3 values windows, linux, and darwin. | - |
About wheels files¶
Generally, the wheel name convention is
{distribution}-{version}(-{build tag})?-{python tag}-{abi tag}-{platform tag}.whl.
For example, for this particular library,
grpcio-1.54.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
,
your pip parameters are:
- name = grpcio
- version = 1.54.2
- platform = manylinux_2_17_x86_64 or manylinux2014_x86_64
- python_version = 37
- target = your/path/to/target
- os = linux
and your pip command should look like this:
pip install --no-deps --platform manylinux_2_17_x86_64 --python-version 37 --target your/path/to/target --only-binary=:all: grpcio==1.54.2
A dot in the platform part indicates that a given distribution supports several platforms. In this case, “.” in manylinux_2_17_x86_64.manylinux2014_x86_64 means this distribution supports both manylinux_2_17_x86_64 and manylinux2014_x86_64.
Currently supported python versions are “3.7” and “3.9”. Syntax without dots (“37” or “39”) is also supported.
If there are libraries specified for different python versions, they must have different target paths.
"os-dependentLibraries": [
{
"name": "cryptography",
"version": "41.0.5",
"platform": "manylinux2014_x86_64",
"python_version": "37",
"os": "linux",
"target": "3rdparty/linux_libs"
},
{
"name": "cryptography",
"version": "41.0.5",
"dependencies": true,
"platform": "manylinux2014_x86_64",
"python_version": "3.9",
"os": "linux",
"target": "3rdparty/linux_lib_py39"
},
For more informations, see .whl and manylinux platform.
Usage¶
...
"meta": {
"name": "<TA name>",
"restRoot": "<restRoot>",
"version": "<TA version>",
"displayName": "<TA display name>",
"schemaVersion": "<schema version>",
"os-dependentLibraries": [
{
"name": "cryptography",
"version": "41.0.5",
"platform": "manylinux2014_x86_64",
"python_version": "37",
"os": "linux",
"target": "3rdparty/linux"
},
{
"name": "cryptography",
"version": "41.0.5",
"platform": "win_amd64",
"python_version": "37",
"os": "windows",
"target": "3rdparty/windows"
},
{
"name": "cryptography",
"version": "41.0.5",
"dependencies": true,
"platform": "manylinux2014_x86_64",
"python_version": "37",
"os": "linux",
"target": "3rdparty/linux_with_deps"
},
{
"name": "cffi",
"version": "1.15.1",
"platform": "win_amd64",
"python_version": "37",
"os": "windows",
"target": "3rdparty/windows"
}
]
}
Result¶
Running the build for the above configuration will result in the creation of the following structure:
output
└──<TA>
├── bin
...
└── lib
└── 3rdparty
├── linux
│ ├── cryptography
│ └── cryptography-41.0.5.dist-info
├── linux_with_deps
│ ├── _cffi_backend.cpython-37m-x86_64-linux-gnu.so
│ ├── cffi
│ ├── cffi-1.15.1.dist-info
│ ├── cryptography
│ ├── cryptography-41.0.5.dist-info
│ ├── pycparser
│ └── pycparser-2.21.dist-info
└── windows
├── _cffi_backend.cp37-win_amd64.pyd
├── cffi
├── cffi-1.15.1.dist-info
├── cryptography
└── cryptography-41.0.5.dist-info
During the build process, a python script “import_declare_test.py” will be created in output/ta_name/bin to manipulate system paths.
In each input using the specified libraries, this script must be imported.
Currently, three operating systems are supported: Windows, Linux, and Darwin.
If, for development purposes, there is a need to create other custom manipulations on sys.path,
create your own script called “import_declare_test.py” and place it in the package/bin folder.
This way, when building the TA, the default script will be replaced with the one created by the developer.
The default script for this configuration will look like this:
import os
import sys
import re
from os.path import dirname
ta_name = 'demo_addon_for_splunk'
pattern = re.compile(r'[\\/]etc[\\/]apps[\\/][^\\/]+[\\/]bin[\\/]?$')
new_paths = [path for path in sys.path if not pattern.search(path) or ta_name in path]
new_paths.insert(0, os.path.join(dirname(dirname(__file__)), "lib"))
new_paths.insert(0, os.path.sep.join([os.path.dirname(__file__), ta_name]))
sys.path = new_paths
bindir = os.path.dirname(os.path.realpath(os.path.dirname(__file__)))
libdir = os.path.join(bindir, "lib")
platform = sys.platform
if platform.startswith("linux"):
sys.path.insert(0, os.path.join(libdir, "3rdparty/linux_with_deps"))
sys.path.insert(0, os.path.join(libdir, "3rdparty/linux"))
if platform.startswith("win"):
sys.path.insert(0, os.path.join(libdir, "3rdparty/windows"))