duckdb: add v0.10.0, overhaul of package recipe (#38922)
* Expanding the duckdb package to fix the version number (required for external extensions to work) being pulled from git and have variants for the built-in extensions at build-time. This also changes the build system from CMakePackage to Makefile package (as advised from upstream). * - Reorganized and cleaned up variants - Updated the patch to work for 0.10.0+ - Removed (or made non-default) some unecessary variants - Added ninja as the default generator - Set up some shared library dependencies;
This commit is contained in:
parent
e3fe6bc0f7
commit
8ff7a20320
1 changed files with 131 additions and 5 deletions
|
@ -7,7 +7,7 @@
|
|||
from spack.package import *
|
||||
|
||||
|
||||
class Duckdb(CMakePackage):
|
||||
class Duckdb(MakefilePackage):
|
||||
"""DuckDB is an in-process SQL OLAP Database Management System."""
|
||||
|
||||
homepage = "https://duckdb.org"
|
||||
|
@ -15,9 +15,135 @@ class Duckdb(CMakePackage):
|
|||
git = "https://github.com/duckdb/duckdb.git"
|
||||
|
||||
license("MIT")
|
||||
maintainers("glentner")
|
||||
maintainers("glentner", "teaguesterling")
|
||||
|
||||
version("master", branch="master")
|
||||
version("0.9.2", sha256="afff7bd925a98dc2af4039b8ab2159b0705cbf5e0ee05d97f7bb8dce5f880dc2")
|
||||
version("0.8.1", sha256="a0674f7e320dc7ebcf51990d7fc1c0e7f7b2c335c08f5953702b5285e6c30694")
|
||||
version("0.7.1", sha256="67f840f861e5ffbe137d65a8543642d016f900b89dd035492d562ad11acf0e1e")
|
||||
version("0.10.0", sha256="5a925b8607d00a97c1a3ffe6df05c0a62a4df063abd022ada82ac1e917792013")
|
||||
version(
|
||||
"0.9.2",
|
||||
sha256="afff7bd925a98dc2af4039b8ab2159b0705cbf5e0ee05d97f7bb8dce5f880dc2",
|
||||
deprecated=True,
|
||||
)
|
||||
version(
|
||||
"0.9.1",
|
||||
sha256="37a43188d9354ce3ca101b2b118d867f5f76d04c3b83c09d86fd7508351a631b",
|
||||
deprecated=True,
|
||||
)
|
||||
version(
|
||||
"0.9.0",
|
||||
sha256="3dbf3326a831bf0797591572440e81a3d6d668f8e33a25ce04efae19afc3a23d",
|
||||
deprecated=True,
|
||||
)
|
||||
version(
|
||||
"0.8.1",
|
||||
sha256="a0674f7e320dc7ebcf51990d7fc1c0e7f7b2c335c08f5953702b5285e6c30694",
|
||||
deprecated=True,
|
||||
)
|
||||
version(
|
||||
"0.8.0",
|
||||
sha256="df3b8e0b72bce38914f0fb1cd02235d8b616df9209beb14beb06bfbcaaf2e97f",
|
||||
deprecated=True,
|
||||
)
|
||||
version(
|
||||
"0.7.1",
|
||||
sha256="67f840f861e5ffbe137d65a8543642d016f900b89dd035492d562ad11acf0e1e",
|
||||
deprecated=True,
|
||||
)
|
||||
|
||||
depends_on("python@3.7:")
|
||||
depends_on("cmake", type="build")
|
||||
depends_on("gmake", type="build")
|
||||
depends_on("ninja", when="+ninjabuild", type="build")
|
||||
depends_on("openssl", when="+httpfs")
|
||||
depends_on("icu4c", when="~icu")
|
||||
|
||||
# Build Options
|
||||
variant("autocomplete", default=True, description="Include autocomplete for CLI in build")
|
||||
variant("cli", default=True, description="Compile with command line client")
|
||||
variant("icu", default=False, description="Compile with bundled ICU library")
|
||||
variant("ninjabuild", default=True, description="Use GEN=ninja to build")
|
||||
variant(
|
||||
"openssl",
|
||||
default=False,
|
||||
description="Compile with bundled OpenSSL library",
|
||||
when="@:0.9.2",
|
||||
)
|
||||
|
||||
# Extensions
|
||||
variant("excel", default=True, description="Include Excel formatting extension in build")
|
||||
variant("fts", default=True, description="Include FTS (full text search) support in build")
|
||||
variant("httpfs", default=True, description="Include HTTPFS (& S3) support in build")
|
||||
variant("inet", default=True, description="Include INET (ip address) support in build")
|
||||
variant("json", default=True, description="Include JSON support in build")
|
||||
variant("parquet", default=True, description="Include parquent support in build")
|
||||
|
||||
# APIs
|
||||
variant("jdbc", default=False, description="Build JDBC driver (may not work)")
|
||||
variant("odbc", default=False, description="Build with ODBC driver (may not work)")
|
||||
variant("python", default=False, description="Build with Python driver (may not work)")
|
||||
|
||||
def setup_build_environment(self, env):
|
||||
if "+ninjabuild" in self.spec:
|
||||
env.set("GEN", "ninja")
|
||||
variant_flags = [
|
||||
"autocomplete",
|
||||
"cli",
|
||||
"excel",
|
||||
"fts",
|
||||
"httpfs",
|
||||
"icu",
|
||||
"inet",
|
||||
"jdbc",
|
||||
"json",
|
||||
"odbc",
|
||||
"openssl",
|
||||
"parquet",
|
||||
"python",
|
||||
]
|
||||
for flag in variant_flags:
|
||||
make_flag = "BUILD_" + flag.upper()
|
||||
if "+" + flag in self.spec:
|
||||
env.set(make_flag, "1")
|
||||
elif "~" + flag in self.spec:
|
||||
env.set(make_flag, "0")
|
||||
|
||||
def url_for_version(self, version):
|
||||
return "https://github.com/duckdb/duckdb/archive/refs/tags/v{0}.tar.gz".format(version)
|
||||
|
||||
def patch(self):
|
||||
# DuckDB pulls its version from a git tag, which it can't find in the tarball
|
||||
# and thus defaults to something arbitrary and breaks extensions.
|
||||
# We use the Spack version to inject it in the right place during the build
|
||||
|
||||
version = self.spec.version
|
||||
if not self.spec.satisfies("@0.10.0:"):
|
||||
# Prior to version 0.10.0, this was sufficient
|
||||
filter_file(
|
||||
r'(message\(STATUS "git hash \$\{GIT_COMMIT_HASH\}, '
|
||||
r'version \$\{DUCKDB_VERSION\}"\))',
|
||||
'set(DUCKDB_VERSION "v{0}")\n\\1'.format(version),
|
||||
"CMakeLists.txt",
|
||||
)
|
||||
else:
|
||||
# Override the fallback values that are set when GIT_COMMIT_HASH doesn't work
|
||||
for i, n in enumerate(["MAJOR", "MINOR", "PATCH"]):
|
||||
filter_file(
|
||||
r"set\(DUCKDB_{0}_VERSION \d+\)".format(n),
|
||||
"set(DUCKDB_{0}_VERSION {1})".format(n, version[i]),
|
||||
"CMakeLists.txt",
|
||||
)
|
||||
# Need to manually set DUCKDB_NORMALIZED_VERSION for helper scripts
|
||||
filter_file(
|
||||
r'(message\(STATUS "git hash \$\{GIT_COMMIT_HASH\},'
|
||||
r" version \$\{DUCKDB_VERSION\},"
|
||||
r' extension folder \$\{DUCKDB_NORMALIZED_VERSION\}"\))',
|
||||
'set(DUCKDB_VERSION "v${DUCKDB_MAJOR_VERSION}'
|
||||
'.${DUCKDB_MINOR_VERSION}.${DUCKDB_PATCH_VERSION}")'
|
||||
'\nset(DUCKDB_NORMALIZED_VERSION "${DUCKDB_VERSION}")'
|
||||
"\n\\1",
|
||||
"CMakeLists.txt",
|
||||
)
|
||||
|
||||
def install(self, spec, prefix):
|
||||
mkdir(prefix.bin)
|
||||
install("build/release/duckdb", prefix.bin)
|
||||
|
|
Loading…
Reference in a new issue