rewrite build system to build separate binary wheels for each platform. only tested on Linux so far. should fix #25.

This commit is contained in:
richard 2021-06-12 18:42:39 +01:00
parent 76121e34a9
commit 9eddc4e528
24 changed files with 148 additions and 25686 deletions

View file

@ -8,7 +8,13 @@ New CFFI API static bindings. Faster, fewer bugs and easier to maintain than ct
# Install # Install
## Option 1: Install from Pypi (easiest but currently out of date, Raylib 2.6 and Python 3.6 - 3.8) ## Option 1: Install from Pypi (easiest but may not be up to date or be available for your platform)
We distribute a statically linked binary Raylib library, install from Pypi.
pip3 install raylib
Some platforms that should be available:
**Windows 10 (64 bit): Python 3.6 - 3.8** **Windows 10 (64 bit): Python 3.6 - 3.8**
@ -16,18 +22,11 @@ New CFFI API static bindings. Faster, fewer bugs and easier to maintain than ct
**Linux (Ubuntu 16.04+): Python 3.6 - 3.8** **Linux (Ubuntu 16.04+): Python 3.6 - 3.8**
We distribute a statically linked Raylib library, install from Pypi. If yours isn't available then pip should attempt to build from source, but this has not been tested.
pip3 install raylib ## Option 2: Build from source (Raylib 3.5, all platforms)
## Option 2: Install from github (Raylib 3.5, Python 3.6 - 3.9, Linux, awaiting builds for other platforms) If you're using a platform we don't have binary builds for yet
The version on Pypi may not always be up to date. If you want to test the latest version,
clone the git repo and make a symlink to the `raylib` directory in your current project directory.
## Option 3: Build from source (Raylib 3.5, all platforms)
If you're using a platform we dont have binary builds for yet
then you can either *use the dynamic binding with your own dll* or else you will have to build from source. then you can either *use the dynamic binding with your own dll* or else you will have to build from source.
If you do build on a new platform please If you do build on a new platform please
submit your binaries as a PR. submit your binaries as a PR.
@ -54,13 +53,10 @@ Make a patched version of raylib header.
Build Build
cd static
pip3 install cffi pip3 install cffi
python3 build_linux.py cd ..
python3 raylib/static/build.py
To build a complete set of libs for Python 3.6, 3.7, 3.8 and 3.9:
./build_linux_multi.sh
To update the Linux dynamic libs (names will be different on other platfroms): To update the Linux dynamic libs (names will be different on other platfroms):
@ -68,6 +64,22 @@ To update the Linux dynamic libs (names will be different on other platfroms):
rm raylib/dynamic/*.so* rm raylib/dynamic/*.so*
cp -P /usr/local/lib/libraylib.so* raylib/dynamic/ cp -P /usr/local/lib/libraylib.so* raylib/dynamic/
### Distributing
To build a binary wheel distribution:
python3 setup.py bdist_wheel
and install it:
pip3 install dist/raylib*.whl
To build a complete set of libs for Python 3.6, 3.7, 3.8 and 3.9:
./raylib/static/build_multi.sh
(TODO move the dynamic libs into a separate package rather than include them with every one.)
### Raspberry Pi ### Raspberry Pi
The integrated GPU hardware in a Raspberry Pi ("VideoCore") is rather The integrated GPU hardware in a Raspberry Pi ("VideoCore") is rather
@ -90,9 +102,6 @@ For option 1, then also follow the above instructions, but with these
modifications: modifications:
- With `cmake`, use `cmake -DWITH_PIC=on -DSTATIC=on -DSHARED=on -DPLATFORM='Raspberry Pi' ..` - With `cmake`, use `cmake -DWITH_PIC=on -DSTATIC=on -DSHARED=on -DPLATFORM='Raspberry Pi' ..`
- Use `python3 build_rpi_nox.py` instead of `python3 build_linux.py`
- Use `build_rpi_nox_multi.sh` to build a complete set of libs if you need it
(if you're not sure, then you almost certainly don't).
# Use # Use

View file

@ -1,5 +1,5 @@
from ._raylib_cffi import ffi, lib as rl from raylib.static._raylib_cffi import ffi, lib as rl
from _raylib_cffi.lib import * from raylib.static._raylib_cffi.lib import *
from raylib.colors import * from raylib.colors import *
import cffi import cffi

File diff suppressed because it is too large Load diff

87
raylib/static/build.py Normal file
View file

@ -0,0 +1,87 @@
# Assumes raylib, GL, etc are all already installed as system libraries. We dont distribute them.
# Raylib must be installed and compiled with: cmake -DWITH_PIC=ON -DSHARED=ON -DSTATIC=ON ..
from cffi import FFI
import os
import platform
import sys
ffibuilder = FFI()
def build_linux():
print("BUILDING FOR LINUX")
ffibuilder.cdef(open("raylib/raylib_modified.h").read().replace('RLAPI ', ''))
ffibuilder.set_source("raylib.static._raylib_cffi",
"""
#include "../../raylib/raylib.h"
""",
extra_link_args=['/usr/local/lib/libraylib.a','-lm', '-lpthread', '-lGLU', '-lGL', '-lrt', '-lm', '-ldl', '-lX11', '-lpthread'],
libraries=['GL','m','pthread', 'dl', 'rt', 'X11']
)
if __name__ == "__main__":
ffibuilder.compile(verbose=True)
def build_windows():
print("BUILDING FOR WINDOWS")
ffibuilder.cdef(open("raylib/raylib_modified.h").read().replace('RLAPI ', '').replace('bool','int'))
ffibuilder.set_source("raylib.static._raylib_cffi",
"""
#include "../../raylib/raylib.h"
""",
extra_link_args=['/NODEFAULTLIB:MSVCRTD'],
libraries=['raylib_static', 'gdi32', 'shell32', 'user32','OpenGL32', 'winmm'],
)
if __name__ == "__main__":
ffibuilder.compile(verbose=True)
def build_mac():
print("BUILDING FOR MAC")
ffibuilder.cdef(open("raylib/raylib_modified.h").read().replace('RLAPI ', ''))
ffibuilder.set_source("raylib.static._raylib_cffi",
"""
#include "./../raylib/raylib.h" // the C header of the library, supplied by us here
"""
)
# Hack to produce static linked lib using static librarylib.a supplied by us
version = sys.implementation.cache_tag
if version == 'cpython-36' or version == 'cpython-37':
version += 'm'
command = "clang -bundle -undefined dynamic_lookup ./_raylib_cffi.o -L/usr/local/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/sqlite/lib ../../libraylib_mac.a -F/System/Library/Frameworks -framework OpenGL -framework Cocoa -framework IOKit -framework CoreFoundation -framework CoreVideo -o ./_raylib_cffi."+version+"-darwin.so"
if __name__ == "__main__":
ffibuilder.compile(verbose=True)
if platform.system()=="Darwin":
print(command)
os.system(command)
def build_rpi_nox():
print("BUILDING FOR RASPBERRY PI")
ffibuilder.cdef(open("raylib/raylib_modified.h").read().replace('RLAPI ', ''))
ffibuilder.set_source("raylib.static._raylib_cffi",
"""
#include "./../raylib/raylib.h"
""",
extra_link_args=['/usr/local/lib/libraylib.a',
'/opt/vc/lib/libEGL_static.a', '/opt/vc/lib/libGLESv2_static.a',
'-L/opt/vc/lib', '-lvcos', '-lbcm_host', '-lbrcmEGL', '-lbrcmGLESv2',
'-lm', '-lpthread', '-lrt'],
)
if __name__ == "__main__":
ffibuilder.compile(verbose=True)
if platform.system()=="Darwin":
build_mac()
elif platform.system()=="Linux":
if "x86" in platform.machine():
build_linux()
elif "arm" in platform.machine():
build_rpi_nox()
elif platform.system()=="Windows":
build_windows()
else:
print("WARNING: UKKNOWN PLATFORM - trying Linux build")
build_linux()

View file

@ -1,24 +0,0 @@
# Linux build assumes raylib, GL, etc are all already installed as system libraries. We dont distribute them.
# Raylib must be installed the compiled with: cmake -DWITH_PIC=ON -DSHARED=ON -DSTATIC=ON ..
from cffi import FFI
import os
import platform
ffibuilder = FFI()
ffibuilder.cdef(open("../raylib_modified.h").read().replace('RLAPI ', ''))
ffibuilder.set_source("_raylib_cffi",
"""
#include "../raylib.h"
""",
extra_link_args=['/usr/local/lib/libraylib.a','-lm', '-lpthread', '-lGLU', '-lGL', '-lrt', '-lm', '-ldl', '-lX11', '-lpthread'],
libraries=['GL','m','pthread', 'dl', 'rt', 'X11']
)
if __name__ == "__main__":
ffibuilder.compile(verbose=True)

View file

@ -1,23 +0,0 @@
#!/usr/bin/env bash
if ! command -v pyenv &> /dev/null
then
echo "Pyenv required: https://github.com/pyenv/pyenv-installer"
exit
fi
rm *linux-gnu.so
pyenv install -s 3.9.1
pyenv global 3.9.1
pip3 install cffi
python build_linux.py
pyenv install -s 3.8.7
pyenv global 3.8.7
pip3 install cffi
python build_linux.py
pyenv install -s 3.7.9
pyenv global 3.7.9
pip3 install cffi
python build_linux.py
pyenv install -s 3.6.12
pyenv global 3.6.12
pip3 install cffi
python build_linux.py

View file

@ -1,27 +0,0 @@
from cffi import FFI
import os
import platform
import sys
ffibuilder = FFI()
ffibuilder.cdef(open("../raylib_modified.h").read().replace('RLAPI ', ''))
ffibuilder.set_source("_raylib_cffi",
"""
#include "../raylib.h" // the C header of the library, supplied by us here
"""
)
# Hack to produce static linked lib using static librarylib.a supplied by us
version = sys.implementation.cache_tag
if version == 'cpython-36' or version == 'cpython-37':
version += 'm'
command = "clang -bundle -undefined dynamic_lookup ./_raylib_cffi.o -L/usr/local/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/sqlite/lib ../../libraylib_mac.a -F/System/Library/Frameworks -framework OpenGL -framework Cocoa -framework IOKit -framework CoreFoundation -framework CoreVideo -o ./_raylib_cffi."+version+"-darwin.so"
if __name__ == "__main__":
ffibuilder.compile(verbose=True)
if platform.system()=="Darwin":
print(command)
os.system(command)

View file

@ -1,11 +0,0 @@
#!/usr/bin/env bash
rm *darwin.so
pyenv global 3.8.1
pip3 install cffi
python build_mac.py
pyenv global 3.7.5
pip3 install cffi
python build_mac.py
pyenv global 3.6.9
pip3 install cffi
python build_mac.py

22
raylib/static/build_multi.sh Executable file
View file

@ -0,0 +1,22 @@
#!/usr/bin/env bash
if ! command -v pyenv &> /dev/null
then
echo "Pyenv required: https://github.com/pyenv/pyenv-installer"
exit
fi
function build() {
echo "Building for Python $1"
pyenv install -s $1
pyenv global $1
pip3 install cffi
pip3 install wheel
rm -rf raylib/static/_raylib_cffi.* build
python setup.py bdist_wheel
}
build 3.9.5
build 3.8.10
build 3.7.10
build 3.6.13

View file

@ -1,26 +0,0 @@
# Raspberry Pi native (non-X) build assumes the GPU libraries are installed in /opt/vc, as per Raspbian.
# Raylib must be installed the compiled with: cmake -DWITH_PIC=ON -DSHARED=ON -DSTATIC=ON -DPLATFORM='Raspberry Pi' ..
from cffi import FFI
import os
import platform
ffibuilder = FFI()
ffibuilder.cdef(open("../raylib_modified.h").read().replace('RLAPI ', ''))
ffibuilder.set_source("_raylib_cffi",
"""
#include "../raylib.h"
""",
extra_link_args=['/usr/local/lib/libraylib.a',
'/opt/vc/lib/libEGL_static.a', '/opt/vc/lib/libGLESv2_static.a',
'-L/opt/vc/lib', '-lvcos', '-lbcm_host', '-lbrcmEGL', '-lbrcmGLESv2',
'-lm', '-lpthread', '-lrt'],
)
if __name__ == "__main__":
ffibuilder.compile(verbose=True)

View file

@ -1,23 +0,0 @@
#!/usr/bin/env bash
if ! command -v pyenv &> /dev/null
then
echo "Pyenv required: https://github.com/pyenv/pyenv-installer"
exit
fi
rm *arm-linux-gnueabihf.so
pyenv install -s 3.9.1
pyenv global 3.9.1
pip3 install cffi
python3 build_rpi_nox.py
pyenv install -s 3.8.7
pyenv global 3.8.7
pip3 install cffi
python3 build_rpi_nox.py
pyenv install -s 3.7.9
pyenv global 3.7.9
pip3 install cffi
python3 build_rpi_nox.py
pyenv install -s 3.6.12
pyenv global 3.6.12
pip3 install cffi
python3 build_rpi_nox.py

View file

@ -1,17 +0,0 @@
# Windows build assumes raylib, OpenGL32, etc are all already installed as system libraries. We dont distribute them.
from cffi import FFI
ffibuilder = FFI()
ffibuilder.cdef(open("../raylib_modified.h").read().replace('RLAPI ', '').replace('bool','int'))
ffibuilder.set_source("_raylib_cffi",
"""
#include "../raylib.h"
""",
extra_link_args=['/NODEFAULTLIB:MSVCRTD'],
libraries=['raylib_static', 'gdi32', 'shell32', 'user32','OpenGL32', 'winmm'],
)
if __name__ == "__main__":
ffibuilder.compile(verbose=True)

View file

@ -1,5 +1,6 @@
import pathlib import pathlib
from setuptools import setup from setuptools import setup
from setuptools.dist import Distribution
# The directory containing this file # The directory containing this file
HERE = pathlib.Path(__file__).parent HERE = pathlib.Path(__file__).parent
@ -7,6 +8,11 @@ HERE = pathlib.Path(__file__).parent
# The text of the README file # The text of the README file
README = (HERE / "README.md").read_text() README = (HERE / "README.md").read_text()
class BinaryDistribution(Distribution):
"""Distribution which always forces a binary package with platform name"""
def has_ext_modules(foo):
return True
# This call to setup() does all the work # This call to setup() does all the work
setup( setup(
name="raylib", name="raylib",
@ -21,6 +27,7 @@ setup(
classifiers=[ classifiers=[
"License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)", "License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)",
"Programming Language :: Python :: 3", "Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.7",
@ -28,5 +35,6 @@ setup(
packages=["raylib", "raylib.dynamic", "raylib.static"], packages=["raylib", "raylib.dynamic", "raylib.static"],
include_package_data=True, include_package_data=True,
install_requires=["cffi>=1.14.0","inflection"], install_requires=["cffi>=1.14.0","inflection"],
#cffi_modules=["raylib/build_mac.py:ffibuilder"], # this would build libs whenever the module is installed, but we are distributing static libs instead distclass=BinaryDistribution,
cffi_modules=["raylib/static/build.py:ffibuilder"], # this would build libs whenever the module is installed, but we are distributing static libs instead
) )