Skip to content

Commit 0522529

Browse files
update libicsneo & refactor build_libicsneo.py (#171)
1 parent 91e6943 commit 0522529

7 files changed

Lines changed: 108 additions & 66 deletions

File tree

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,4 +102,5 @@ msvc/ipch*
102102

103103
# in-tree builds
104104
/libusb
105-
/libicsneo
105+
/libicsneo
106+
/libpcap

.readthedocs.yaml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@ version: 2
88
build:
99
os: ubuntu-22.04
1010
apt_packages:
11+
- curl
12+
- flex
13+
- bison
1114
- clang
1215
- clang-format
1316
- build-essential
14-
- libpcap0.8-dev
15-
- libusb-1.0-0-dev
1617
- cmake
1718
tools:
1819
python: "3.11"

build_libicsneo.py

Lines changed: 95 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -3,103 +3,143 @@
33
import os
44
import shutil
55
import sys
6+
from pathlib import Path
67

7-
LIBICSNEO_COMMIT = "9ef93eb73e1ada72ccc7a571744b9db1a564f18b"
8-
LIBUSB_COMMIT = "4239bc3a50014b8e6a5a2a59df1fff3b7469543b"
8+
ROOT = Path.cwd()
99
CPUS = str(multiprocessing.cpu_count())
1010

11+
LIBUSB_VERSION = "1.0.27"
12+
LIBUSB_ROOT = f"{ROOT}/libusb/{LIBUSB_VERSION}"
13+
LIBUSB_SOURCE = f"{LIBUSB_ROOT}/source"
14+
LIBUSB_BUILD = f"{LIBUSB_ROOT}/build"
15+
LIBUSB_INSTALL = f"{LIBUSB_ROOT}/install"
1116

12-
def checkout():
13-
if not os.path.isdir("libicsneo"):
14-
subprocess.check_output(["git", "clone", "https://github.com/intrepidcs/libicsneo.git"])
15-
subprocess.check_output(["git", "checkout", LIBICSNEO_COMMIT], cwd="libicsneo")
17+
LIBICSNEO_VERSION = "e37d939"
18+
LIBICSNEO_ROOT = f"{ROOT}/libicsneo/{LIBICSNEO_VERSION}"
19+
LIBICSNEO_SOURCE = f"{LIBICSNEO_ROOT}/source"
20+
LIBICSNEO_BUILD = f"{LIBICSNEO_ROOT}/build"
21+
LIBICSNEO_INSTALL = f"{LIBICSNEO_ROOT}/install"
1622

17-
if not os.path.isdir("libusb") and sys.platform == "darwin":
18-
subprocess.check_output(["git", "clone", "https://github.com/libusb/libusb.git"])
19-
subprocess.check_output(["git", "checkout", LIBUSB_COMMIT], cwd="libusb")
23+
LIBPCAP_VERSION = "1.10.4"
24+
LIBPCAP_ROOT = f"{ROOT}/libpcap/{LIBPCAP_VERSION}"
25+
LIBPCAP_SOURCE = f"{LIBPCAP_ROOT}/source"
26+
LIBPCAP_BUILD = f"{LIBPCAP_ROOT}/build"
27+
LIBPCAP_INSTALL = f"{LIBPCAP_ROOT}/install"
2028

29+
def checkout():
30+
if not os.path.isdir(LIBICSNEO_SOURCE):
31+
os.makedirs(LIBICSNEO_ROOT, exist_ok=True)
32+
subprocess.check_output(["git", "clone", "https://github.com/intrepidcs/libicsneo.git", LIBICSNEO_SOURCE], cwd=LIBICSNEO_ROOT)
33+
subprocess.check_output(["git", "checkout", LIBICSNEO_VERSION], cwd=LIBICSNEO_SOURCE)
34+
35+
if not os.path.isdir(LIBUSB_SOURCE):
36+
os.makedirs(LIBUSB_ROOT, exist_ok=True)
37+
subprocess.check_output(["curl", "-LO", f"https://github.com/libusb/libusb/releases/download/v{LIBUSB_VERSION}/libusb-{LIBUSB_VERSION}.tar.bz2"], cwd=LIBUSB_ROOT)
38+
subprocess.check_output(["tar", "-xf", f"libusb-{LIBUSB_VERSION}.tar.bz2"], cwd=LIBUSB_ROOT)
39+
subprocess.check_output(["mv", f"libusb-{LIBUSB_VERSION}", "source"], cwd=LIBUSB_ROOT)
40+
subprocess.check_output(["rm", f"libusb-{LIBUSB_VERSION}.tar.bz2"], cwd=LIBUSB_ROOT)
41+
42+
if not os.path.isdir(LIBPCAP_SOURCE):
43+
os.makedirs(LIBPCAP_ROOT, exist_ok=True)
44+
subprocess.check_output(["curl", "-LO", f"https://www.tcpdump.org/release/libpcap-{LIBPCAP_VERSION}.tar.gz"], cwd=LIBPCAP_ROOT)
45+
subprocess.check_output(["tar", "-xf", f"libpcap-{LIBPCAP_VERSION}.tar.gz"], cwd=LIBPCAP_ROOT)
46+
subprocess.check_output(["mv", f"libpcap-{LIBPCAP_VERSION}", "source"], cwd=LIBPCAP_ROOT)
47+
subprocess.check_output(["rm", f"libpcap-{LIBPCAP_VERSION}.tar.gz"], cwd=LIBPCAP_ROOT)
2148

2249
def _build_libusb():
23-
subprocess.check_output(["git", "clean", "-xdf"], cwd="libusb")
24-
25-
subprocess.check_output(["./bootstrap.sh"], cwd="libusb")
26-
50+
os.makedirs(LIBUSB_BUILD, exist_ok=True)
2751
env = os.environ.copy()
28-
env["CFLAGS"] = "-arch x86_64 -arch arm64 -mmacosx-version-min=10.13"
29-
env["CXXFLAGS"] = "-arch x86_64 -arch arm64 -mmacosx-version-min=10.13"
30-
subprocess.check_output(["./configure", "--disable-static", "--prefix=/tmp/libusb"], cwd="libusb", env=env)
31-
32-
subprocess.check_output(["make", "-j" + CPUS], cwd="libusb")
33-
subprocess.check_output(["make", "install"], cwd="libusb")
34-
35-
36-
def _build_icsneo_linux():
52+
if sys.platform == "darwin":
53+
env["CFLAGS"] = "-arch x86_64 -arch arm64 -mmacosx-version-min=10.13"
54+
env["CXXFLAGS"] = "-arch x86_64 -arch arm64 -mmacosx-version-min=10.13"
55+
else:
56+
env["CFLAGS"] = "-fPIC"
57+
env["CXXFLAGS"] = "-fPIC"
58+
subprocess.check_output([
59+
f"{LIBUSB_SOURCE}/configure",
60+
"--disable-shared",
61+
"--enable-static",
62+
f"--prefix={LIBUSB_INSTALL}",
63+
"--disable-udev"
64+
], cwd=LIBUSB_BUILD, env=env)
65+
66+
subprocess.check_output(["make", "-j" + CPUS], cwd=LIBUSB_BUILD)
67+
subprocess.check_output(["make", "install"], cwd=LIBUSB_BUILD)
68+
69+
def _build_libpcap():
70+
os.makedirs(LIBPCAP_BUILD, exist_ok=True)
71+
env = os.environ.copy()
72+
if sys.platform == "darwin":
73+
env["CFLAGS"] = "-arch x86_64 -arch arm64 -mmacosx-version-min=10.13"
74+
env["CXXFLAGS"] = "-arch x86_64 -arch arm64 -mmacosx-version-min=10.13"
75+
else:
76+
env["CFLAGS"] = "-fPIC"
77+
env["CXXFLAGS"] = "-fPIC"
78+
subprocess.check_output([
79+
f"{LIBPCAP_SOURCE}/configure",
80+
"--disable-shared",
81+
f"--prefix={LIBPCAP_INSTALL}",
82+
], cwd=LIBPCAP_BUILD, env=env)
83+
84+
subprocess.check_output(["make", "-j" + CPUS], cwd=LIBPCAP_BUILD)
85+
subprocess.check_output(["make", "install"], cwd=LIBPCAP_BUILD)
86+
87+
def _build_libicsneo_linux():
3788
subprocess.check_output(["git", "clean", "-xdf"], cwd="libicsneo")
3889
subprocess.check_output(["mkdir", "-p", "libicsneo/build"])
3990

4091
subprocess.check_output(
41-
["cmake", "..", "-DCMAKE_BUILD_TYPE=Release", "-DLIBICSNEO_BUILD_ICSNEOLEGACY=ON"], cwd="libicsneo/build"
92+
[
93+
"cmake",
94+
"-DCMAKE_BUILD_TYPE=Release",
95+
"-DLIBICSNEO_BUILD_ICSNEOLEGACY=ON",
96+
f"-DCMAKE_PREFIX_PATH={LIBUSB_INSTALL};{LIBPCAP_INSTALL}",
97+
"-S", LIBICSNEO_SOURCE,
98+
"-B", LIBICSNEO_BUILD
99+
]
42100
)
43101
subprocess.check_output(
44-
["cmake", "--build", ".", "--target", "icsneolegacy", "--parallel", CPUS], cwd="libicsneo/build"
102+
["cmake", "--build", LIBICSNEO_BUILD, "--target", "icsneolegacy", "--parallel", CPUS]
45103
)
46104

47-
48-
def _build_icsneo_macos():
49-
subprocess.check_output(["git", "clean", "-xdf"], cwd="libicsneo")
50-
subprocess.check_output(["mkdir", "-p", "libicsneo/build"])
51-
105+
def _build_libicsneo_macos():
52106
subprocess.check_output(
53107
[
54108
"cmake",
55-
"..",
56109
"-DCMAKE_BUILD_TYPE=Release",
57110
"-DCMAKE_OSX_ARCHITECTURES=arm64;x86_64",
58111
"-DLIBICSNEO_BUILD_ICSNEOLEGACY=ON",
59112
"-DCMAKE_OSX_DEPLOYMENT_TARGET=10.13",
60-
"-DLIBUSB_LIBRARIES=/tmp/libusb/lib/libusb-1.0.0.dylib",
61-
"-DLIBUSB_INCLUDE_DIR=/tmp/libusb/include/libusb-1.0",
62-
],
63-
cwd="libicsneo/build",
113+
f"-DCMAKE_PREFIX_PATH={LIBUSB_INSTALL};{LIBPCAP_INSTALL}",
114+
"-S", LIBICSNEO_SOURCE,
115+
"-B", LIBICSNEO_BUILD
116+
]
64117
)
65118

66119
subprocess.check_output(
67-
["cmake", "--build", ".", "--target", "icsneolegacy", "--parallel", CPUS], cwd="libicsneo/build"
68-
)
69-
subprocess.check_output(
70-
[
71-
"install_name_tool",
72-
"-change",
73-
"/tmp/libusb/lib/libusb-1.0.0.dylib",
74-
"@loader_path/libusb-1.0.0.dylib",
75-
"libicsneolegacy.dylib",
76-
],
77-
cwd="libicsneo/build",
120+
["cmake", "--build", LIBICSNEO_BUILD, "--target", "icsneolegacy", "--parallel", CPUS]
78121
)
79122

80-
81123
def build():
82124
print("Building libicsneo...")
125+
_build_libusb()
126+
_build_libpcap()
83127
if sys.platform == "darwin":
84-
_build_libusb()
85-
_build_icsneo_macos()
128+
_build_libicsneo_macos()
86129
elif sys.platform == "linux":
87-
_build_icsneo_linux()
88-
130+
_build_libicsneo_linux()
89131

90132
def copy():
91133
if sys.platform == "darwin":
92-
shutil.copyfile("/tmp/libusb/lib/libusb-1.0.0.dylib", "ics/libusb-1.0.0.dylib")
93-
shutil.copyfile("libicsneo/build/libicsneolegacy.dylib", "ics/libicsneolegacy.dylib")
134+
shutil.copyfile(f"{LIBICSNEO_BUILD}/libicsneolegacy.dylib", "ics/libicsneolegacy.dylib")
94135
elif sys.platform == "linux":
95-
shutil.copyfile("libicsneo/build/libicsneolegacy.so", "ics/libicsneolegacy.so")
136+
shutil.copyfile(f"{LIBICSNEO_BUILD}/libicsneolegacy.so", "ics/libicsneolegacy.so")
96137

97138

98139
def clean():
99140
shutil.rmtree("libicsneo")
100141
shutil.rmtree("libusb")
101-
shutil.rmtree("/tmp/libusb")
102-
142+
shutil.rmtree("libpcap")
103143

104144
if __name__ == "__main__":
105145
if "--clean" in sys.argv:

build_mac.sh

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
python_directory="/Library/Frameworks/Python.framework/Versions"
44
python_versions=("3.7" "3.8" "3.9" "3.10" "3.11")
55

6-
# libusb dependencies
7-
brew install automake libtool cmake clang-format
6+
# dependencies
7+
brew install cmake clang-format
88
ret_value=$?
99
if [ $ret_value -ne 0 ]; then
10-
echo "Failed to install automake/libtoolgit..."
10+
echo "Failed to install clang/clang-format..."
1111
exit $ret_value
1212
fi
1313

doc/source/header.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,12 +173,12 @@ python_ics does not provide binaries for linux distributions so we will have to
173173
Fedora Dependencies (FC28)
174174
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
175175

176-
``sudo dnf install redhat-rpm-config gcc g++ python3-devel clang clang-tools-extra``
176+
``sudo dnf install redhat-rpm-config gcc g++ python3-devel clang clang-tools-extra flex bison``
177177

178178
Debian/Ubuntu Dependencies
179179
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
180180

181-
``sudo apt install build-essential python-dev clang-format``
181+
``sudo apt install build-essential python-dev clang-format flex bison``
182182

183183
libicsneo library
184184
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ before-build = "python -m pip install wheel"
66
manylinux-x86_64-image = "quay.io/pypa/manylinux_2_28_x86_64"
77

88
[tool.cibuildwheel.linux]
9-
before-build = "dnf install -y libpcap-devel cmake libusbx-devel clang clang-tools-extra"
9+
before-build = "dnf install -y cmake clang clang-tools-extra flex bison"
1010

1111
[tool.cibuildwheel.macos]
1212
archs = ["universal2"]
13-
before-build = "brew install automake libtool cmake clang-format"
13+
before-build = "brew install cmake clang-format"
1414

1515
[tool.cibuildwheel.windows]
1616
before-build = "choco install llvm"

travis/build-wheels.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ function repair_wheel {
1212

1313

1414
# Install a system package required by our library
15-
dnf install -y clang clang-tools-extra
15+
dnf install -y clang clang-tools-extra flex bison
1616

1717
# Compile wheels
1818
for PYBIN in /opt/python/*/bin; do

0 commit comments

Comments
 (0)