asterinas/test/nixos/common/merge_nixos_config.sh

69 lines
1.8 KiB
Bash
Executable File

#!/usr/bin/env bash
# SPDX-License-Identifier: MPL-2.0
# Usage: merge_nixos_config.sh <base_file> <extra_file> <merged_file>
#
# This script takes two NixOS configuration files, <base_file> and <extra_file>,
# as inputs and produces a new NixOS configuration file whose content is the
# combination of the two inputs. If the same key is set by both <base_file>
# and <extra_file>, then the value provided by <extra_file> takes precedence.
#
# A NixOS configuration file, usually named `configuration.nix`, is written in
# the following form:
#
# { config, lib, pkgs, ... }: {
# key1 = value1;
# key2 = value2;
# }
set -e
# Check for the correct number of arguments
if [ "$#" -ne 3 ]; then
echo "Usage: $0 <base_file> <extra_file> <merged_file>"
exit 1
fi
BASE_FILE="$1"
EXTRA_FILE="$2"
MERGED_FILE="$3"
# Check if input files exist
if [ ! -f "$BASE_FILE" ]; then
echo "Error: Base file not found at '$BASE_FILE'"
exit 1
fi
if [ ! -f "$EXTRA_FILE" ]; then
echo "Error: Extra file not found at '$EXTRA_FILE'"
exit 1
fi
BASE_CONTENT=$(cat "$BASE_FILE")
EXTRA_CONTENT=$(cat "$EXTRA_FILE")
# Create the merged configuration file by embedding the file contents directly.
cat > "$MERGED_FILE" <<EOF
# This file is generated by merge_nixos_config.sh
# It merges two configuration files. Do not edit directly.
{ config, lib, pkgs, ... }:
let
# The content of the original modules is embedded here.
baseModule = (
$BASE_CONTENT
);
extraModule = (
$EXTRA_CONTENT
);
# Evaluate each module with the standard NixOS arguments
base = baseModule { inherit config lib pkgs; };
extra = extraModule { inherit config lib pkgs; };
in
# Deeply merge the base and extra configurations.
# The value from extra_file takes precedence.
lib.recursiveUpdate base extra
EOF