Skip to content

Commit d95a16a

Browse files
author
Release Manager
committed
sagemathgh-38872: Native Windows build <!-- ^ Please provide a concise and informative title. --> <!-- ^ Don't put issue numbers in the title, do this in the PR description below. --> <!-- ^ For example, instead of "Fixes sagemath#12345" use "Introduce new method to calculate 1 + 2". --> <!-- v Describe your changes below in detail. --> <!-- v Why is this change required? What problem does it solve? --> <!-- v If this PR resolves an open issue, please link to it here. For example, "Fixes sagemath#12345". --> The goal of this PR is to provide a native Windows build of Sage using MSVC (using the new Meson build system). Instructions on how to test are under the `Windows` tab at https://doc- pr-38872--sagemath.netlify.app/html/en/installation/meson. Afterwards, you should be able to import some sage modules in a normal `python` install (but most modules actually don't properly import due to various errors that will be fixed peu a peu in follow-up PRs) ## State of Windows support of dependencies - m4rie: upstream (https://github.com/malb/m4rie) doesn't provide win build - ec: not sure if upstream (https://github.com/JohnCremona/eclib) provide win build - ecm: upstream (https://gitlab.inria.fr/zimmerma/ecm) doesn't provide native win build (only Cygwin) - ntl: upstream provides win build (kind of), but it's not yet available on conda (conda-forge/ntl-feedstock#16) - maxima/ecl: upstream provides win build, but it's not yet available on conda (conda-forge/maxima-feedstock#38) - GAP: only cygiwn build exists https://github.com/gap- system/gap/issues/4157 - [pari](http://pari.math.u-bordeaux.fr/pub/pari): now available on conda (conda-forge/pari-feedstock#45) - cypari2: no windows support yet sagemath/cypari2#19 - lrcalc - pplpy - primecountpy - fpylll - rw - cliquer - lcalc - ecl - braiding - gc - homfly - iml - brial_groebner ## Conda Issues: - Meson cannot find libraries without pkg-config files. - Workaround: Check that `set LIB` includes the conda env (e.g. `...\.conda\envs\sage-dev\Library\lib`). If not, run `conda deactivate` followed by `conda activate sage-dev` and then check again. - Alternatively, `set LIB=%CONDA_PREFIX%\Library\lib;%LIB%` - Possible upstream improvement: the compilers conda package should set `LIB` - If you don't have the debug version of Python installed, you may get "LINK : fatal error LNK1104: cannot open file 'python311_d.lib'" - Workaround: `meson setup builddir -Dbuildtype=release` - Alternatively, in `<path to conda>\sage-dev\include\pyconfig.h` uncomment: `//# define Py_DEBUG` and change `python311_d.lib` to `python311.lib` - Possible upstream improvement: conda should either ship a debug version of python or a correct `pyconfig.h` - conda-forge/gsl-feedstock#63 - Workaround: Fallback to find_library in meson and/or change the `gsl.pc` to match: ``` prefix=C:/Users/Tobia/.conda/envs/sage-dev/Library exec_prefix=C:/Users/Tobia/.conda/envs/sage-dev/Library libdir=C:/Users/Tobia/.conda/envs/sage-dev/Library/lib sharedlibdir=C:/Users/Tobia/.conda/envs/sage-dev/Library/lib includedir=C:/Users/Tobia/.conda/envs/sage-dev/Library/include GSL_CBLAS_LIB=-lgslcblas Name: GSL Description: GNU Scientific Library Version: 2.7 Libs: -L${libdir} -lgsl ${GSL_CBLAS_LIB} Cflags: -I${includedir} ``` - conda-forge/compilers-feedstock#66 - Workaround: Run everything in "VS x64 Native Tools Command Prompt" (for 64bit) or "Developer Command Prompt for VS2022 (or 2019)" (for 32bit) - conda-forge/libgd-feedstock#55 - Workaround: Fallback to find_library in meson - conda-forge/m4ri-feedstock#15 - Workaround: Don't try to use m4ri on windows - conda-forge/libflint-feedstock#38 - Workaround: Don't try to use flint on windows ## Upstream issues Singular - Singular/Singular#1245 - Singular/Singular#1246 - Singular/Singular#1247 Flint: - flintlib/flint#2100 - mingw-w64/mingw-w64#65 (indirectly since pthread is flint dependency). Would be fixed by conda-forge/libflint-feedstock#38. -> Workaround: Change `typedef __int64 pid_t;` to `typedef int pid_t;` in `.conda\envs\sage-dev\Library\include\pthread_compat.h` - flintlib/flint#2101: -> Workaround: disable compilation of fraction_field_FpT for now Cysignals: - sagemath/cysignals#207 - sagemath/cysignals#206 ### 📝 Checklist <!-- Put an `x` in all the boxes that apply. --> - [ ] The title is concise and informative. - [ ] The description explains in detail what this PR is about. - [ ] I have linked a relevant issue or discussion. - [ ] I have created tests covering the changes. - [ ] I have updated the documentation and checked the documentation preview. ### ⌛ Dependencies <!-- List all open PRs that this PR logically depends on. For example, --> <!-- - sagemath#12345: short description why this is a dependency --> <!-- - sagemath#34567: ... --> URL: sagemath#38872 Reported by: Tobias Diez Reviewer(s): Dima Pasechnik
2 parents 94baf41 + 4280241 commit d95a16a

File tree

224 files changed

+2481
-175
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

224 files changed

+2481
-175
lines changed

.github/workflows/ci-meson.yml

+35-8
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ jobs:
2525
strategy:
2626
fail-fast: false
2727
matrix:
28-
os: ['ubuntu', 'macos']
28+
os: ['ubuntu', 'macos', 'windows']
2929
python: ['3.11', '3.12']
3030
tests: ['all']
3131
editable:
@@ -39,6 +39,9 @@ jobs:
3939
python: 3.12
4040
editable: true
4141
tests: 'all'
42+
- os: windows
43+
python: '3.13'
44+
tests: 'all'
4245

4346
steps:
4447
- uses: actions/checkout@v4
@@ -66,6 +69,17 @@ jobs:
6669
path: ~/conda_pkgs_dir
6770
key:
6871
${{ runner.os }}-conda-${{ hashFiles('environment-3.11-linux.yml') }}
72+
73+
- name: Setup MSVC environment
74+
if: runner.os == 'windows'
75+
uses: ilammy/msvc-dev-cmd@v1
76+
77+
- name: Remove Git link.exe
78+
if: runner.os == 'windows'
79+
# It conflicts with the vs linker
80+
# So we delete it, following the advice on https://github.com/ilammy/msvc-dev-cmd?tab=readme-ov-file#name-conflicts-with-shell-bash
81+
run: rm -f "C:/Program Files/Git/usr/bin/link.exe"
82+
shell: bash
6983

7084
- name: Compiler cache
7185
uses: hendrikmuhs/[email protected]
@@ -76,12 +90,14 @@ jobs:
7690
uses: conda-incubator/setup-miniconda@v3
7791
with:
7892
python-version: ${{ matrix.python }}
79-
miniforge-version: latest
93+
# Disabled for now due to
94+
# https://github.com/conda-incubator/setup-miniconda/issues/379
95+
# miniforge-version: latest
8096
use-mamba: true
8197
channels: conda-forge
8298
channel-priority: true
8399
activate-environment: sage-dev
84-
environment-file: environment-${{ matrix.python }}-${{ startsWith(matrix.os, 'macos') && (startsWith(runner.arch, 'ARM') && 'macos' || 'macos-x86_64') || 'linux' }}.yml
100+
environment-file: environment-${{ matrix.python }}-${{ startsWith(matrix.os, 'macos') && (startsWith(runner.arch, 'ARM') && 'macos' || 'macos-x86_64') || startsWith(matrix.os, 'ubuntu') && 'linux' || 'win' }}.yml
85101

86102
- name: Print Conda environment
87103
shell: bash -l {0}
@@ -92,9 +108,15 @@ jobs:
92108
- name: Build
93109
shell: bash -l {0}
94110
run: |
95-
export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
96-
export CC="ccache $CC"
97-
export CXX="ccache $CXX"
111+
if [[ "$RUNNER_OS" != "Windows" ]]; then
112+
export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
113+
export CC="ccache $CC"
114+
export CXX="ccache $CXX"
115+
else
116+
export LIB="$LIB;$CONDA_PREFIX\\Library\\lib"
117+
export INCLUDE="$INCLUDE;$CONDA_PREFIX\\Library\\include"
118+
fi
119+
98120
# Use --no-deps and pip check below to verify that all necessary dependencies are installed via conda
99121
pip install --no-build-isolation --no-deps --config-settings=builddir=builddir ${{ matrix.editable && '--editable' || '' }} . -v
100122
@@ -104,7 +126,7 @@ jobs:
104126
shell: bash -l {0}
105127
if: matrix.tests == 'all'
106128
run: |
107-
python3 tools/update-meson.py
129+
python tools/update-meson.py
108130
if ! ./tools/test-git-no-uncommitted-changes; then
109131
git add --intent-to-add . # also show newly created files in git diff
110132
git status
@@ -123,7 +145,12 @@ jobs:
123145
# If editable then deleting the directory will cause sage to detect rebuild, which will cause ninja to fail
124146
# so we don't delete the directory in this case
125147
${{ matrix.editable && 'true' || 'rm -R ./src/sage_setup/' }}
126-
./sage -t ${{ matrix.tests == 'all' && '--all' || '--new --long' }} -p4 --format github
148+
if [[ "$RUNNER_OS" == "Windows" ]]; then
149+
# Ignore errors on Windows, for now
150+
pytest --doctest-ignore-import-errors --doctest -rfEs -s src || true
151+
else
152+
./sage -t ${{ matrix.tests == 'all' && '--all' || '--new --long' }} -p4 --format github
153+
fi
127154
128155
- name: Check that all modules can be imported
129156
shell: bash -l {0}

.gitignore

+5
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,11 @@ builddir-*
305305
build-install
306306
build/cp*
307307

308+
# Meson subprojects
309+
/subprojects/*
310+
!/subprojects/*.wrap
311+
!/subprojects/packagefiles
312+
308313
# Meson temporary files
309314
subprojects/wrapdb.json
310315
src/sage/interfaces/__init__.py

.vscode/settings.json

-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
// This settings file is not ignored by git.
33
"files.exclude": {
44
"**/__pycache__": true,
5-
"src/**/*.cpp": true,
65
"src/**/*.so": true
76
},
87
"search.exclude": {

environment-3.10-win.yml

+283
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,283 @@
1+
name: sage-dev
2+
# Generated by conda-lock.
3+
# platform: win-64
4+
# input_hash: ce1d33261ea050a378b1ec514c2b4fd5b96fffc879766a3ae810cb6d2b9dc26e
5+
6+
channels:
7+
- conda-forge
8+
dependencies:
9+
- _openmp_mutex=4.5=2_gnu
10+
- alabaster=1.0.0=pyhd8ed1ab_1
11+
- annotated-types=0.7.0=pyhd8ed1ab_1
12+
- appdirs=1.4.4=pyhd8ed1ab_1
13+
- asttokens=3.0.0=pyhd8ed1ab_1
14+
- babel=2.16.0=pyhd8ed1ab_1
15+
- backports=1.0=pyhd8ed1ab_5
16+
- backports.tarfile=1.2.0=pyhd8ed1ab_1
17+
- beautifulsoup4=4.12.3=pyha770c72_1
18+
- blas=2.126=openblas
19+
- blas-devel=3.9.0=26_win64_openblas
20+
- boost-cpp=1.85.0=ha5ead02_4
21+
- brotli=1.1.0=h2466b09_2
22+
- brotli-bin=1.1.0=h2466b09_2
23+
- brotli-python=1.1.0=py310h9e98ed7_2
24+
- bzip2=1.0.8=h2466b09_7
25+
- ca-certificates=2024.12.14=h56e8100_0
26+
- cachecontrol=0.14.2=pyha770c72_0
27+
- cachecontrol-with-filecache=0.14.2=pyhd8ed1ab_0
28+
- cachy=0.3.0=pyhd8ed1ab_2
29+
- cairo=1.18.2=h5782bbf_1
30+
- certifi=2024.12.14=pyhd8ed1ab_0
31+
- charset-normalizer=3.4.1=pyhd8ed1ab_0
32+
- clang=19.1.7=default_hec7ea82_1
33+
- clang-19=19.1.7=default_hec7ea82_1
34+
- click=8.1.8=pyh7428d3b_0
35+
- click-default-group=1.2.4=pyhd8ed1ab_1
36+
- clikit=0.6.2=pyhd8ed1ab_3
37+
- colorama=0.4.6=pyhd8ed1ab_1
38+
- comm=0.2.2=pyhd8ed1ab_1
39+
- compiler-rt=19.1.7=hc790b64_0
40+
- compiler-rt_win-64=19.1.7=hc790b64_0
41+
- conda-lock=2.5.7=pyhd8ed1ab_1
42+
- conda-souschef=2.2.3=pyhd8ed1ab_0
43+
- contourpy=1.3.1=py310hc19bc0b_0
44+
- conway-polynomials=0.10=pyhd8ed1ab_0
45+
- coverage=7.6.10=py310h38315fa_0
46+
- cpython=3.10.16=py310hd8ed1ab_1
47+
- crashtest=0.4.1=pyhd8ed1ab_1
48+
- cycler=0.12.1=pyhd8ed1ab_1
49+
- cysignals=1.12.3=py310h9e98ed7_0
50+
- cython=3.0.11=py310he320566_3
51+
- debugpy=1.8.12=py310h9e98ed7_0
52+
- decorator=5.1.1=pyhd8ed1ab_1
53+
- distlib=0.3.9=pyhd8ed1ab_1
54+
- docutils=0.21.2=pyhd8ed1ab_1
55+
- double-conversion=3.3.0=h63175ca_0
56+
- ensureconda=1.4.4=pyhd8ed1ab_1
57+
- exceptiongroup=1.2.2=pyhd8ed1ab_1
58+
- execnet=2.1.1=pyhd8ed1ab_1
59+
- executing=2.1.0=pyhd8ed1ab_1
60+
- expat=2.6.4=he0c23c2_0
61+
- filelock=3.17.0=pyhd8ed1ab_0
62+
- flang=19.1.7=hbeecb71_0
63+
- flang_impl_win-64=19.1.7=h719f0c7_0
64+
- flang_win-64=19.1.7=h719f0c7_0
65+
- font-ttf-dejavu-sans-mono=2.37=hab24e00_0
66+
- font-ttf-inconsolata=3.000=h77eed37_0
67+
- font-ttf-source-code-pro=2.038=h77eed37_0
68+
- font-ttf-ubuntu=0.83=h77eed37_3
69+
- fontconfig=2.15.0=h765892d_1
70+
- fonts-conda-ecosystem=1=0
71+
- fonts-conda-forge=1=0
72+
- fonttools=4.55.6=py310h38315fa_0
73+
- fortran-compiler=1.9.0=h95e3450_0
74+
- freetype=2.12.1=hdaf720e_2
75+
- furo=2024.8.6=pyhd8ed1ab_2
76+
- gitdb=4.0.12=pyhd8ed1ab_0
77+
- gitpython=3.1.44=pyhff2d567_0
78+
- glpk=5.0=h8ffe710_0
79+
- gmp=6.3.0=hfeafd45_2
80+
- gmpy2=2.1.5=py310hff35a3b_3
81+
- graphite2=1.3.13=h63175ca_1003
82+
- grayskull=2.7.6=pyhd8ed1ab_0
83+
- gsl=2.8=h5b8d9c4_1
84+
- harfbuzz=10.2.0=h885c0d4_0
85+
- html5lib=1.1=pyhd8ed1ab_2
86+
- icu=75.1=he0c23c2_0
87+
- idna=3.10=pyhd8ed1ab_1
88+
- imagesize=1.4.1=pyhd8ed1ab_0
89+
- importlib-metadata=8.6.1=pyha770c72_0
90+
- importlib_resources=6.5.2=pyhd8ed1ab_0
91+
- iniconfig=2.0.0=pyhd8ed1ab_1
92+
- ipykernel=6.29.5=pyh4bbf305_0
93+
- ipython=8.31.0=pyh7428d3b_0
94+
- ipywidgets=8.1.5=pyhd8ed1ab_1
95+
- jaraco.classes=3.4.0=pyhd8ed1ab_2
96+
- jaraco.context=6.0.1=pyhd8ed1ab_0
97+
- jaraco.functools=4.1.0=pyhd8ed1ab_0
98+
- jedi=0.19.2=pyhd8ed1ab_1
99+
- jinja2=3.1.5=pyhd8ed1ab_0
100+
- jupyter_client=8.6.3=pyhd8ed1ab_1
101+
- jupyter_core=5.7.2=pyh5737063_1
102+
- jupyterlab_widgets=3.0.13=pyhd8ed1ab_1
103+
- keyring=25.6.0=pyh7428d3b_0
104+
- kiwisolver=1.4.7=py310hc19bc0b_0
105+
- krb5=1.21.3=hdf4eb48_0
106+
- lcms2=2.16=h67d730c_0
107+
- lerc=4.0.0=h63175ca_0
108+
- libblas=3.9.0=26_win64_openblas
109+
- libboost=1.85.0=h444863b_4
110+
- libboost-devel=1.85.0=h91493d7_4
111+
- libboost-headers=1.85.0=h57928b3_4
112+
- libbrotlicommon=1.1.0=h2466b09_2
113+
- libbrotlidec=1.1.0=h2466b09_2
114+
- libbrotlienc=1.1.0=h2466b09_2
115+
- libcblas=3.9.0=26_win64_openblas
116+
- libclang13=19.1.7=default_ha5278ca_1
117+
- libdeflate=1.23=h9062f6e_0
118+
- libexpat=2.6.4=he0c23c2_0
119+
- libffi=3.4.2=h8ffe710_5
120+
- libflang=19.1.7=he0c23c2_0
121+
- libflint=3.1.3.1=h37a7fb1_101
122+
- libgcc=14.2.0=h1383e82_1
123+
- libgd=2.3.3=h7208af6_11
124+
- libglib=2.82.2=h7025463_1
125+
- libgomp=14.2.0=h1383e82_1
126+
- libiconv=1.17=hcfcfb64_2
127+
- libintl=0.22.5=h5728263_3
128+
- libjpeg-turbo=3.0.0=hcfcfb64_1
129+
- liblapack=3.9.0=26_win64_openblas
130+
- liblapacke=3.9.0=26_win64_openblas
131+
- libllvm19=19.1.7=h3089188_1
132+
- liblzma=5.6.3=h2466b09_1
133+
- liblzma-devel=5.6.3=h2466b09_1
134+
- libopenblas=0.3.28=pthreads_head3c61_1
135+
- libpng=1.6.46=had7236b_0
136+
- libsodium=1.0.20=hc70643c_0
137+
- libsqlite=3.48.0=h67fdade_1
138+
- libtiff=4.7.0=h797046b_3
139+
- libwebp-base=1.5.0=h3b0e114_0
140+
- libwinpthread=12.0.0.r4.gg4f2fc60ca=h57928b3_9
141+
- libxcb=1.17.0=h0e4246c_0
142+
- libxml2=2.13.5=he286e8c_1
143+
- libxslt=1.1.39=h3df6e99_0
144+
- libzlib=1.3.1=h2466b09_2
145+
- lld=19.1.7=hd91d51b_0
146+
- llvm-tools=19.1.7=h2a44499_1
147+
- m4ri=20240729=h4afdad8_1
148+
- markupsafe=3.0.2=py310h38315fa_1
149+
- matplotlib=3.10.0=py310h5588dad_0
150+
- matplotlib-base=3.10.0=py310h37e0a56_0
151+
- matplotlib-inline=0.1.7=pyhd8ed1ab_1
152+
- memory-allocator=0.1.3=py310ha8f682b_1
153+
- meson=1.7.0=pyhd8ed1ab_0
154+
- meson-python=0.17.1=pyh70fd9c4_1
155+
- more-itertools=10.6.0=pyhd8ed1ab_0
156+
- mpc=1.3.1=h72bc38f_1
157+
- mpfr=4.2.1=hbc20e70_3
158+
- mpmath=1.3.0=pyhd8ed1ab_1
159+
- msgpack-python=1.1.0=py310hc19bc0b_0
160+
- munkres=1.1.4=pyh9f0ad1d_0
161+
- nauty=2.6.11=h2fa13f4_1
162+
- nest-asyncio=1.6.0=pyhd8ed1ab_1
163+
- networkx=3.4.2=pyh267e887_2
164+
- ninja=1.12.1=hc790b64_0
165+
- numpy=2.2.2=py310h4987827_0
166+
- openblas=0.3.28=pthreads_h4a7f399_1
167+
- openjpeg=2.5.3=h4d64b90_0
168+
- openssl=3.4.0=ha4e3fda_1
169+
- packaging=24.2=pyhd8ed1ab_2
170+
- pari-elldata=0.0.20161017=0
171+
- pari-galdata=0.0.20180411=0
172+
- pari-seadata=0.0.20090618=0
173+
- pari-seadata-small=0.0.20090618=0
174+
- parso=0.8.4=pyhd8ed1ab_1
175+
- pastel=0.2.1=pyhd8ed1ab_0
176+
- pcre2=10.44=h3d7b363_2
177+
- pexpect=4.9.0=pyhd8ed1ab_1
178+
- pickleshare=0.7.5=pyhd8ed1ab_1004
179+
- pillow=11.1.0=py310h9595edc_0
180+
- pip=25.0=pyh8b19718_0
181+
- pixman=0.44.2=had0cd8c_0
182+
- pkg-config=0.29.2=h88c491f_1009
183+
- pkgconfig=1.5.5=pyhd8ed1ab_5
184+
- pkginfo=1.12.0=pyhd8ed1ab_1
185+
- planarity=3.0.2.0=hcfcfb64_0
186+
- platformdirs=4.3.6=pyhd8ed1ab_1
187+
- pluggy=1.5.0=pyhd8ed1ab_1
188+
- primesieve=12.6=he0c23c2_0
189+
- progressbar2=4.5.0=pyhd8ed1ab_1
190+
- prompt-toolkit=3.0.50=pyha770c72_0
191+
- psutil=6.1.1=py310ha8f682b_0
192+
- pthread-stubs=0.4=h0e40799_1002
193+
- ptyprocess=0.7.0=pyhd8ed1ab_1
194+
- pure_eval=0.2.3=pyhd8ed1ab_1
195+
- pydantic=2.10.6=pyh3cfb1c2_0
196+
- pydantic-core=2.27.2=py310hc226416_0
197+
- pygments=2.19.1=pyhd8ed1ab_0
198+
- pylev=1.4.0=pyhd8ed1ab_0
199+
- pyparsing=3.2.1=pyhd8ed1ab_0
200+
- pyproject-metadata=0.9.0=pyhd8ed1ab_1
201+
- pyside6=6.8.1=py310h60c6385_0
202+
- pysocks=1.7.1=pyh09c184e_7
203+
- pytest=8.3.4=pyhd8ed1ab_1
204+
- pytest-xdist=3.6.1=pyhd8ed1ab_1
205+
- python=3.10.16=h37870fc_1_cpython
206+
- python-dateutil=2.9.0.post0=pyhff2d567_1
207+
- python-utils=3.9.1=pyhff2d567_1
208+
- python_abi=3.10=5_cp310
209+
- pytz=2024.2=pyhd8ed1ab_1
210+
- pywin32=307=py310h9e98ed7_3
211+
- pywin32-ctypes=0.2.3=py310h5588dad_1
212+
- pyyaml=6.0.2=py310h38315fa_2
213+
- pyzmq=26.2.0=py310h656833d_3
214+
- qhull=2020.2=hc790b64_5
215+
- qt6-main=6.8.1=h1259614_2
216+
- rapidfuzz=3.11.0=py310h9e98ed7_0
217+
- requests=2.32.3=pyhd8ed1ab_1
218+
- ruamel.yaml=0.18.10=py310ha8f682b_0
219+
- ruamel.yaml.clib=0.2.8=py310ha8f682b_1
220+
- ruamel.yaml.jinja2=0.2.7=pyhd8ed1ab_1
221+
- sagemath-db-elliptic-curves=0.8.1=hecc5488_0
222+
- sagemath-db-graphs=20210214=hd8ed1ab_0
223+
- sagemath-db-polytopes=20170220=1
224+
- scipy=1.15.1=py310h164493e_0
225+
- setuptools=75.8.0=pyhff2d567_0
226+
- six=1.17.0=pyhd8ed1ab_0
227+
- smmap=5.0.0=pyhd8ed1ab_0
228+
- snowballstemmer=2.2.0=pyhd8ed1ab_0
229+
- soupsieve=2.5=pyhd8ed1ab_1
230+
- sphinx=8.1.3=pyhd8ed1ab_1
231+
- sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_3
232+
- sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_1
233+
- sphinxcontrib-applehelp=2.0.0=pyhd8ed1ab_1
234+
- sphinxcontrib-devhelp=2.0.0=pyhd8ed1ab_1
235+
- sphinxcontrib-htmlhelp=2.1.0=pyhd8ed1ab_1
236+
- sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_1
237+
- sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_1
238+
- sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_1
239+
- sqlite=3.48.0=h2466b09_1
240+
- stack_data=0.6.3=pyhd8ed1ab_1
241+
- stdlib-list=0.11.0=pyhd8ed1ab_1
242+
- symmetrica=3.0.1=h1537add_0
243+
- sympy=1.13.3=pyh04b8f61_5
244+
- tk=8.6.13=h5226925_1
245+
- toml=0.10.2=pyhd8ed1ab_1
246+
- tomli=2.2.1=pyhd8ed1ab_1
247+
- tomli-w=1.2.0=pyhd8ed1ab_0
248+
- tomlkit=0.13.2=pyha770c72_1
249+
- toolz=0.12.1=pyhd8ed1ab_0
250+
- tornado=6.4.2=py310ha8f682b_0
251+
- traitlets=5.14.3=pyhd8ed1ab_1
252+
- typing-extensions=4.12.2=hd8ed1ab_1
253+
- typing_extensions=4.12.2=pyha770c72_1
254+
- tzdata=2025a=h78e105d_0
255+
- ucrt=10.0.22621.0=h57928b3_1
256+
- unicodedata2=16.0.0=py310ha8f682b_0
257+
- urllib3=1.26.19=pyhd8ed1ab_0
258+
- vc=14.3=h5fd82a7_24
259+
- vc14_runtime=14.42.34433=h6356254_24
260+
- virtualenv=20.29.1=pyhd8ed1ab_0
261+
- vs2015_runtime=14.42.34433=hfef2bbc_24
262+
- vs2022_win-64=19.42.34433=hd920555_24
263+
- vswhere=3.1.7=h57928b3_0
264+
- wcwidth=0.2.13=pyhd8ed1ab_1
265+
- webencodings=0.5.1=pyhd8ed1ab_3
266+
- wheel=0.45.1=pyhd8ed1ab_1
267+
- widgetsnbextension=4.0.13=pyhd8ed1ab_1
268+
- win_inet_pton=1.1.0=pyh7428d3b_8
269+
- winpthreads-devel=12.0.0.r4.gg4f2fc60ca=h57928b3_9
270+
- xorg-libice=1.1.2=h0e40799_0
271+
- xorg-libsm=1.2.5=h0e40799_0
272+
- xorg-libx11=1.8.10=hf48077a_1
273+
- xorg-libxau=1.0.12=h0e40799_0
274+
- xorg-libxdmcp=1.1.5=h0e40799_0
275+
- xorg-libxext=1.3.6=h0e40799_0
276+
- xorg-libxpm=3.5.17=h0e40799_1
277+
- xorg-libxt=1.3.1=h0e40799_0
278+
- xz=5.6.3=h208afaa_1
279+
- xz-tools=5.6.3=h2466b09_1
280+
- yaml=0.2.5=h8ffe710_2
281+
- zeromq=4.3.5=ha9f60a1_7
282+
- zipp=3.21.0=pyhd8ed1ab_1
283+
- zstd=1.5.6=h0ea2cb4_0

0 commit comments

Comments
 (0)