Skip to content

Commit

Permalink
Swap blake3 to FetchContent + general cleanup (#402)
Browse files Browse the repository at this point in the history
  • Loading branch information
cmmarslender authored Oct 21, 2023
1 parent 26a835d commit df636fe
Show file tree
Hide file tree
Showing 18 changed files with 85 additions and 9,978 deletions.
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="mariano@chia.net",
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="mariano@chia.net",
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="mariano@chia.net",
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

0 comments on commit df636fe

Please sign in to comment.