diff --git a/justfile b/justfile index 2620b067c..a83a63b95 100644 --- a/justfile +++ b/justfile @@ -202,3 +202,8 @@ format args='': [group('linter')] run-github-workflow args='format-check': nix-shell -p act --run "act -j {{ args }}" + +# Build botan3 amalgamation +[group('maintenance')] +build-botan3-amalgamation: + nix-build -E 'with import {}; callPackage ./scripts/botan3-amalgamation.nix {}' diff --git a/scripts/botan3-amalgamation.nix b/scripts/botan3-amalgamation.nix new file mode 100644 index 000000000..1949ecb78 --- /dev/null +++ b/scripts/botan3-amalgamation.nix @@ -0,0 +1,174 @@ +{ + lib, + stdenv, + fetchurl, + python3, + which, +}: + +stdenv.mkDerivation rec { + pname = "botan3-amalgamation"; + version = "3.8.1"; + + src = fetchurl { + url = "https://botan.randombit.net/releases/Botan-${version}.tar.xz"; + hash = "sha256-sDloHUuGGi9YU3Rti6gG9VPiOGntctie2/o8Pb+hfmg="; + }; + + nativeBuildInputs = [ + python3 + which + ]; + + # Configure to build amalgamation + configurePhase = '' + runHook preConfigure + + # Configure Botan to generate amalgamation files + # We only need the amalgamation, so we can use --no-install-python-module + # and other minimal flags to avoid building the full library + python3 configure.py \ + --amalgamation \ + --no-install-python-module \ + --prefix=$out + + runHook postConfigure + ''; + + # Build phase - we only need the amalgamation generation, not the full build + buildPhase = '' + runHook preBuild + + # The amalgamation files are generated during configure + # We just need to make sure they exist + if [ ! -f botan_all.cpp ] || [ ! -f botan_all.h ]; then + echo "Error: Amalgamation files were not generated" + exit 1 + fi + + ls -hal + + runHook postBuild + ''; + + # Install the amalgamation files + installPhase = '' + runHook preInstall + + mkdir -p $out/include + mkdir -p $out/src + + # Copy the amalgamation header and source + cp botan_all.h $out/include/ + cp botan_all.cpp $out/src/ + + echo "Amalgamation files installed:" + echo " Header: $out/include/botan_all.h" + echo " Source: $out/src/botan_all.cpp" + + # Create a simple usage example + cat > $out/README.md << EOF + # Botan ${version} Amalgamation + + This package provides the Botan ${version} cryptography library as amalgamation files: + + - \`include/botan_all.h\` - Single header file containing all Botan headers + - \`src/botan_all.cpp\` - Single source file containing all Botan implementation + + ## Usage + + To use in your C++ project: + + 1. Include the header: \`#include "botan_all.h"\` + 2. Compile with the source: \`g++ -std=c++20 your_code.cpp botan_all.cpp\` + + ## Example + + \`\`\`cpp + #include "botan_all.h" + #include + + int main() { + // Initialize Botan + Botan::LibraryInitializer init; + + // Use Botan functionality + auto rng = std::make_unique(); + auto random_data = rng->random_vec(32); + + std::cout << "Generated " << random_data.size() << " random bytes" << std::endl; + return 0; + } + \`\`\` + + ## Version Information + + - Botan Version: ${version} + - Generated: $(date) + - Configuration: Amalgamation build + EOF + + runHook postInstall + ''; + + # Verify the amalgamation files are valid + doCheck = true; + checkPhase = '' + runHook preCheck + + echo "Checking amalgamation files..." + + if [ ! -f botan_all.h ]; then + echo "ERROR: botan_all.h not found" + exit 1 + fi + + if [ ! -f botan_all.cpp ]; then + echo "ERROR: botan_all.cpp not found" + exit 1 + fi + + header_size=$(stat -c%s botan_all.h) + source_size=$(stat -c%s botan_all.cpp) + + if [ $header_size -lt 100000 ]; then + echo "WARNING: Header file seems too small ($header_size bytes)" + fi + + if [ $source_size -lt 1000000 ]; then + echo "WARNING: Source file seems too small ($source_size bytes)" + fi + + if ! grep -q "namespace Botan" botan_all.h; then + echo "ERROR: Botan namespace not found in header" + exit 1 + fi + + echo "Amalgamation files validation passed" + echo "Header size: $header_size bytes" + echo "Source size: $source_size bytes" + + runHook postCheck + ''; + + meta = with lib; { + description = "Botan ${version} cryptography library amalgamation files"; + longDescription = '' + This package provides Botan ${version} as amalgamation files - a single + header (botan_all.h) and source file (botan_all.cpp) that contain the + entire Botan cryptography library. This makes it easy to integrate Botan + into projects without dealing with complex build dependencies. + + Botan is a C++ cryptography library providing TLS, X.509, ECDSA, AES, + RSA, and many other cryptographic algorithms and protocols. + ''; + homepage = "https://botan.randombit.net/"; + changelog = "https://botan.randombit.net/news.html"; + license = licenses.bsd2; + maintainers = [ pbek ]; + platforms = platforms.all; + + # This is a source-only package + hydraPlatforms = [ ]; + }; +}