yams/subprojects/packagefiles/libsql/meson.build

114 lines
4.6 KiB
Meson

project('libsql', 'c', version: '0.3.4')
cargo = find_program('cargo', required: true)
python = find_program('python3', 'python', required: true)
cc = meson.get_compiler('c')
buildtype = get_option('buildtype')
use_debug = buildtype == 'debug'
cargo_target = ''
git_usr_bin = ''
if host_machine.system() == 'windows'
libname = 'libsql.lib'
target_is_x64 = cc.compiles('''
#if !defined(_M_X64) && !defined(__x86_64__)
#error not x64
#endif
int main(void) { return 0; }
''', name: 'libsql cargo target is x64')
target_is_arm64 = cc.compiles('''
#if !defined(_M_ARM64) && !defined(__aarch64__)
#error not arm64
#endif
int main(void) { return 0; }
''', name: 'libsql cargo target is arm64')
if target_is_x64
cargo_target = 'x86_64-pc-windows-msvc'
elif target_is_arm64
cargo_target = 'aarch64-pc-windows-msvc'
endif
git_program = find_program('git', required: false)
if git_program.found()
git_usr_bin = git_program.full_path()
endif
else
libname = 'liblibsql.a'
endif
profile = use_debug ? 'debug' : 'release'
libsql_lib = custom_target(
'libsql_build',
output: libname,
command: [
python,
'-c',
'import os, shutil, subprocess, sys\n' +
'src_dir, profile, libname, output_path, cargo, cargo_target, git_usr_bin = sys.argv[1:8]\n' +
'env = os.environ.copy()\n' +
'if git_usr_bin:\n' +
' git_dir = os.path.dirname(git_usr_bin)\n' +
' candidates = [os.path.normpath(os.path.join(git_dir, "..", "usr", "bin"))]\n' +
' candidates += [r"C:\\Program Files\\Git\\usr\\bin", r"C:\\Program Files (x86)\\Git\\usr\\bin"]\n' +
' for candidate in candidates:\n' +
' if os.path.exists(os.path.join(candidate, "cp.exe")):\n' +
' env["PATH"] = env.get("PATH", "") + os.pathsep + candidate\n' +
' break\n' +
'if cargo_target and sys.platform == "win32":\n' +
' scoop_dir = os.path.dirname(os.path.dirname(cargo)) if os.path.basename(os.path.dirname(cargo)).lower() == "shims" else ""\n' +
' rustup_home = os.path.join(scoop_dir, "persist", "rustup", ".rustup") if scoop_dir else ""\n' +
' cargo_home = os.path.join(scoop_dir, "persist", "rustup", ".cargo") if scoop_dir else ""\n' +
' toolchains_dir = os.path.join(rustup_home, "toolchains")\n' +
' if os.path.isdir(toolchains_dir):\n' +
' for toolchain in os.listdir(toolchains_dir):\n' +
' candidate = os.path.join(toolchains_dir, toolchain)\n' +
' target_lib = os.path.join(candidate, "lib", "rustlib", cargo_target)\n' +
' cargo_exe = os.path.join(candidate, "bin", "cargo.exe")\n' +
' if os.path.isdir(target_lib) and os.path.exists(cargo_exe):\n' +
' cargo = cargo_exe\n' +
' env["RUSTUP_HOME"] = rustup_home\n' +
' env["CARGO_HOME"] = cargo_home\n' +
' env["RUSTUP_TOOLCHAIN"] = toolchain\n' +
' env["PATH"] = os.path.join(candidate, "bin") + os.pathsep + env.get("PATH", "")\n' +
' break\n' +
' target_env = cargo_target.replace("-", "_")\n' +
' env.setdefault("CMAKE_GENERATOR", "Ninja")\n' +
' env.setdefault("TARGET_CMAKE_GENERATOR", "Ninja")\n' +
' env.setdefault(f"CMAKE_GENERATOR_{target_env}", "Ninja")\n' +
' ninja = shutil.which("ninja", path=env.get("PATH", "")) or shutil.which("ninja.exe", path=env.get("PATH", ""))\n' +
' if ninja:\n' +
' env.setdefault("CMAKE_MAKE_PROGRAM", ninja)\n' +
' env.setdefault("TARGET_CMAKE_MAKE_PROGRAM", ninja)\n' +
' env.setdefault(f"CMAKE_MAKE_PROGRAM_{target_env}", ninja)\n' +
'cmd = [cargo, "build", "--locked"]\n' +
'if cargo_target:\n' +
' cmd += ["--target", cargo_target]\n' +
'if profile == "release":\n' +
' cmd.append("--release")\n' +
'subprocess.check_call(cmd, cwd=src_dir, env=env)\n' +
'target_dir = os.path.join(src_dir, "target")\n' +
'if cargo_target:\n' +
' target_dir = os.path.join(target_dir, cargo_target)\n' +
'lib_path = os.path.join(target_dir, profile, libname)\n' +
'if not os.path.exists(lib_path):\n' +
' raise SystemExit(f"libsql output not found: {lib_path}")\n' +
'os.makedirs(os.path.dirname(output_path), exist_ok=True)\n' +
'shutil.copy2(lib_path, output_path)\n',
meson.current_source_dir(),
profile,
libname,
'@OUTPUT@',
cargo,
cargo_target,
git_usr_bin
],
build_by_default: true
)
libsql_include = include_directories('.')
libsql_dep = declare_dependency(
include_directories: libsql_include,
link_args: [join_paths(meson.current_build_dir(), libname)],
sources: libsql_lib
)