Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Swap blake3 to FetchContent + general cleanup #402

Merged
merged 11 commits into from
Oct 21, 2023
23 changes: 19 additions & 4 deletions .github/workflows/build-test-cplusplus.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ jobs:
runs-on: ubuntu-22.04
steps:
- name: Checkout code
uses: actions/checkout@v3
uses: actions/checkout@v4

- name: cmake, RunTests, and valgrind on ubuntu-20.04
run: |
Expand All @@ -38,7 +38,7 @@ jobs:
runs-on: ubuntu-22.04
steps:
- name: Checkout code
uses: actions/checkout@v3
uses: actions/checkout@v4

- name: cmake, RunTests with address- and undefined sanitizer on Ubuntu
run: |
Expand All @@ -59,7 +59,7 @@ jobs:
runs-on: ubuntu-22.04
steps:
- name: Checkout code
uses: actions/checkout@v3
uses: actions/checkout@v4

- name: cmake, RunTests with thread sanitizer on Ubuntu
run: |
Expand All @@ -69,12 +69,27 @@ jobs:
cmake --build . -- -j 6
TSAN_OPTIONS="memory_limit_mb=6000" ./RunTests

mac:
name: MacOS
runs-on: macos-latest
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: cmake, RunTests on Mac
run: |
mkdir build
cd build
cmake ..
cmake --build . --config Release -j 6
./RunTests

windows:
name: Windows Latest
runs-on: windows-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
uses: actions/checkout@v4

- name: cmake, RunTests with Windows
run: |
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/build-wheels.yml
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ jobs:
CIBW_MANYLINUX_X86_64_IMAGE: ${{ matrix.python.manylinux['intel'] }}
CIBW_ARCHS_MACOS: ${{ matrix.os.cibw-archs-macos[matrix.arch.matrix] }}
run:
pipx run --spec='cibuildwheel==2.11.2' cibuildwheel --output-dir dist 2>&1
pipx run --spec='cibuildwheel==2.16.2' cibuildwheel --output-dir dist 2>&1

- name: Upload artifacts
uses: actions/upload-artifact@v3
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
.idea/
ProofOfSpace
RunTests
HellmanAttacks
Expand Down
78 changes: 45 additions & 33 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ FetchContent_Declare(
)
FetchContent_MakeAvailable(cxxopts)


option(CP_LINK_BLADEBIT_HARVESTER "Links libbladebit_harvester at build time instead of dynamically loading it." OFF)
option(CP_BUILD_BLADEBIT_HARVESTER "Pulls bladebit harvester target from git and builds it as a dependency.")

Expand Down Expand Up @@ -123,38 +122,35 @@ set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -fno-omit-frame-pointer -fsanitize=thre
set (CMAKE_LINKER_FLAGS "${CMAKE_LINKER_FLAGS} -fno-omit-frame-pointer -fsanitize=thread")
ENDIF()

IF (WIN32)
set(BLAKE3_SRC
src/b3/blake3.c
src/b3/blake3_portable.c
src/b3/blake3_dispatch.c
src/b3/blake3_avx2.c
src/b3/blake3_avx512.c
src/b3/blake3_sse41.c
)
ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "riscv64|arm64")
set(BLAKE3_SRC
src/b3/blake3.c
src/b3/blake3_portable.c
src/b3/blake3_dispatch.c
pybind11_add_module(chiapos ${CMAKE_CURRENT_SOURCE_DIR}/python-bindings/chiapos.cpp src/chacha8.c)
add_executable(ProofOfSpace
src/cli.cpp
src/chacha8.c
)
ELSE()
set(BLAKE3_SRC
src/b3/blake3.c
src/b3/blake3_portable.c
src/b3/blake3_dispatch.c
src/b3/blake3_avx2_x86-64_unix.S
src/b3/blake3_avx512_x86-64_unix.S
src/b3/blake3_sse41_x86-64_unix.S

FetchContent_Declare(
blake3
GIT_REPOSITORY https://github.com/BLAKE3-team/BLAKE3.git
GIT_TAG 1.5.0
)
ENDIF()

pybind11_add_module(chiapos ${CMAKE_CURRENT_SOURCE_DIR}/python-bindings/chiapos.cpp src/chacha8.c ${BLAKE3_SRC})
FetchContent_GetProperties(blake3)
if(NOT blake3_POPULATED)
FetchContent_Populate(blake3)

add_executable(ProofOfSpace
src/cli.cpp
src/chacha8.c
${BLAKE3_SRC}
# Set BLAKE3 to build as a static library
set(BUILD_SHARED_LIBS FALSE CACHE BOOL "Build static libraries" FORCE)

add_subdirectory(${blake3_SOURCE_DIR}/c ${blake3_BINARY_DIR})
endif()

set(BLAKE3_SRC ${blake3_SOURCE_DIR}/c)
set(BLAKE3_INCLUDE_DIR ${blake3_SOURCE_DIR}/c)
target_link_libraries(chiapos PRIVATE blake3)
target_link_libraries(ProofOfSpace PRIVATE blake3)
include_directories(
${INCLUDE_DIRECTORIES}
${BLAKE3_INCLUDE_DIR}
)

option(BUILD_PROOF_OF_SPACE_STATICALLY "Build ProofOfSpace target statically" OFF)
Expand All @@ -173,7 +169,14 @@ FetchContent_MakeAvailable(Catch2)
add_executable(RunTests
tests/test.cpp
src/chacha8.c
${BLAKE3_SRC}
)

target_link_libraries(RunTests
PRIVATE
fse
Threads::Threads
Catch2::Catch2
blake3
)

find_package(Threads REQUIRED)
Expand Down Expand Up @@ -231,12 +234,21 @@ if (${CP_LINK_BLADEBIT_HARVESTER})
target_link_directories(chiapos PUBLIC ${CMAKE_SOURCE_DIR}/libs/green_reaper/lib)
target_link_directories(ProofOfSpace PUBLIC ${CMAKE_SOURCE_DIR}/libs/green_reaper/lib)
target_link_directories(RunTests PUBLIC ${CMAKE_SOURCE_DIR}/libs/green_reaper/lib)

set_property(TARGET chiapos APPEND PROPERTY BUILD_RPATH "$ORIGIN")
set_property(TARGET ProofOfSpace APPEND PROPERTY BUILD_RPATH "$ORIGIN")
set_property(TARGET RunTests APPEND PROPERTY BUILD_RPATH "$ORIGIN")

if (WIN32)
add_custom_command(TARGET chiapos POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${CMAKE_SOURCE_DIR}/libs/green_reaper/lib/bladebit_harvester.dll"
"$<TARGET_FILE_DIR:chiapos>/bladebit_harvester.dll"
)
message("The bladebit dll was copied to: $<TARGET_FILE_DIR:chiapos>/bladebit_harvester.dll")
endif()
endif()


#enable_testing()
#add_test(NAME RunTests COMMAND RunTests)
enable_testing()
add_test(NAME RunTests COMMAND RunTests)
175 changes: 16 additions & 159 deletions setup.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
#!/usr/bin/python3
import os
import re
import shutil
import sys
import platform
import subprocess

from setuptools import setup, errors, Extension
from setuptools import setup, Extension
from setuptools.command.build_ext import build_ext
from distutils.version import LooseVersion

Expand Down Expand Up @@ -76,160 +75,18 @@ def build_extension(self, ext):
)


class get_pybind_include(object):
"""Helper class to determine the pybind11 include path

The purpose of this class is to postpone importing pybind11
until it is actually installed, so that the ``get_include()``
method can be invoked."""

def __init__(self, user=False):
self.user = user

def __str__(self):
import pybind11

return pybind11.get_include(self.user)


ext_modules = [
Extension(
"chiapos",
[
"lib/FiniteStateEntropy/lib/entropy_common.c",
"lib/FiniteStateEntropy/lib/fse_compress.c",
"lib/FiniteStateEntropy/lib/fse_decompress.c",
"lib/FiniteStateEntropy/lib/hist.c",
"python-bindings/chiapos.cpp",
"uint128_t/uint128_t.cpp",
"src/b3/blake3.c",
"src/b3/blake3_portable.c",
"src/b3/blake3_dispatch.c",
"src/b3/blake3_avx2.c",
"src/b3/blake3_avx512.c",
"src/b3/blake3_sse41.c",
"src/chacha8.c",
],
include_dirs=[
# Path to pybind11 headers
get_pybind_include(),
get_pybind_include(user=True),
"src",
"uint128_t",
".",
],
),
]


# As of Python 3.6, CCompiler has a `has_flag` method.
# cf http://bugs.python.org/issue26689
def has_flag(compiler, flagname):
"""Return a boolean indicating whether a flag name is supported on
the specified compiler.
"""
import tempfile

with tempfile.NamedTemporaryFile("w", suffix=".cpp") as f:
f.write("int main (int argc, char **argv) { return 0; }")
try:
compiler.compile([f.name], extra_postargs=[flagname])
except errors.CompileError:
return False
return True


def cpp_flag(compiler):
"""Return the -std=c++[11/14/17] compiler flag.

The newer version is prefered over c++11 (when it is available).
"""
flags = ["-std=c++17", "-std=c++14", "-std=c++11"]

for flag in flags:
if has_flag(compiler, flag):
return flag

raise RuntimeError("Unsupported compiler -- at least C++11 support " "is needed!")


class BuildExt(build_ext):
"""A custom build extension for adding compiler-specific options."""

c_opts = {
"msvc": ["/EHsc", "/std:c++17", "/O2"],
"unix": [""],
}
l_opts = {
"msvc": [],
"unix": [""],
}

if sys.platform == "darwin":
darwin_opts = ["-stdlib=libc++", "-mmacosx-version-min=10.14"]
c_opts["unix"] += darwin_opts
l_opts["unix"] += darwin_opts # type: ignore

def build_extensions(self):
ct = self.compiler.compiler_type
opts = self.c_opts.get(ct, [])
link_opts = self.l_opts.get(ct, [])
if ct == "unix":
opts.append('-DVERSION_INFO="%s"' % self.distribution.get_version())
opts.append(cpp_flag(self.compiler))
if has_flag(self.compiler, "-fvisibility=hidden"):
opts.append("-fvisibility=hidden")
elif ct == "msvc":
opts.append('/DVERSION_INFO=\\"%s\\"' % self.distribution.get_version())

# Link bladebit_harvester
if os.getenv("CP_USE_GREEN_REAPER") == "1":
opts.append("/DUSE_GREEN_REAPER=1")
opts.append("/DBLADEBIT_HARVESTER_LINKED=1")
opts.append("/Ilibs/green_reaper/include")
link_opts.append("libs/green_reaper/lib/bladebit_harvester.lib")

for ext in self.extensions:
ext.extra_compile_args = opts
ext.extra_link_args = link_opts
build_ext.build_extensions(self)

# Copy bladebit_harvester.dll on windows to the target build directory
# in order to package it into the root directory of the wheel
if os.getenv("CP_USE_GREEN_REAPER") == "1" and sys.platform == "win32":
shutil.copy2("libs/green_reaper/lib/bladebit_harvester.dll", self.build_lib + "/bladebit_harvester.dll")


if platform.system() == "Windows":
setup(
name="chiapos",
author="Mariano Sorgente",
author_email="[email protected]",
description="Chia proof of space plotting, proving, and verifying (wraps C++)",
license="Apache License",
python_requires=">=3.7",
long_description=open("README.md").read(),
long_description_content_type="text/markdown",
url="https://github.com/Chia-Network/chiapos",
setup_requires=["pybind11>=2.10.0"],
tests_require=["pytest"],
ext_modules=ext_modules,
cmdclass={"build_ext": BuildExt},
zip_safe=False,
)
else:
setup(
name="chiapos",
author="Mariano Sorgente",
author_email="[email protected]",
description="Chia proof of space plotting, proving, and verifying (wraps C++)",
license="Apache License",
python_requires=">=3.7",
long_description=open("README.md").read(),
long_description_content_type="text/markdown",
url="https://github.com/Chia-Network/chiapos",
tests_require=["pytest"],
ext_modules=[CMakeExtension("chiapos", ".")],
cmdclass=dict(build_ext=CMakeBuild),
zip_safe=False,
)
setup(
name="chiapos",
author="Mariano Sorgente",
author_email="[email protected]",
description="Chia proof of space plotting, proving, and verifying (wraps C++)",
license="Apache License",
python_requires=">=3.7",
long_description=open("README.md").read(),
long_description_content_type="text/markdown",
url="https://github.com/Chia-Network/chiapos",
tests_require=["pytest"],
ext_modules=[CMakeExtension("chiapos", ".")],
cmdclass=dict(build_ext=CMakeBuild),
zip_safe=False,
)
Loading