Merge master into staging-next
This commit is contained in:
commit
93b17c1b4d
|
@ -31,6 +31,8 @@ Used with Subversion. Expects `url` to a Subversion directory, `rev`, and `sha25
|
||||||
|
|
||||||
Used with Git. Expects `url` to a Git repo, `rev`, and `sha256`. `rev` in this case can be full the git commit id (SHA1 hash) or a tag name like `refs/tags/v1.0`.
|
Used with Git. Expects `url` to a Git repo, `rev`, and `sha256`. `rev` in this case can be full the git commit id (SHA1 hash) or a tag name like `refs/tags/v1.0`.
|
||||||
|
|
||||||
|
Additionally the following optional arguments can be given: `fetchSubmodules = true` makes `fetchgit` also fetch the submodules of a repository. If `deepClone` is set to true, the entire repository is cloned as opposing to just creating a shallow clone. `deepClone = true` also implies `leaveDotGit = true` which means that the `.git` directory of the clone won't be removed after checkout.
|
||||||
|
|
||||||
## `fetchfossil`
|
## `fetchfossil`
|
||||||
|
|
||||||
Used with Fossil. Expects `url` to a Fossil archive, `rev`, and `sha256`.
|
Used with Fossil. Expects `url` to a Fossil archive, `rev`, and `sha256`.
|
||||||
|
@ -49,6 +51,8 @@ A number of fetcher functions wrap part of `fetchurl` and `fetchzip`. They are m
|
||||||
|
|
||||||
`fetchFromGitHub` expects four arguments. `owner` is a string corresponding to the GitHub user or organization that controls this repository. `repo` corresponds to the name of the software repository. These are located at the top of every GitHub HTML page as `owner`/`repo`. `rev` corresponds to the Git commit hash or tag (e.g `v1.0`) that will be downloaded from Git. Finally, `sha256` corresponds to the hash of the extracted directory. Again, other hash algorithms are also available but `sha256` is currently preferred.
|
`fetchFromGitHub` expects four arguments. `owner` is a string corresponding to the GitHub user or organization that controls this repository. `repo` corresponds to the name of the software repository. These are located at the top of every GitHub HTML page as `owner`/`repo`. `rev` corresponds to the Git commit hash or tag (e.g `v1.0`) that will be downloaded from Git. Finally, `sha256` corresponds to the hash of the extracted directory. Again, other hash algorithms are also available but `sha256` is currently preferred.
|
||||||
|
|
||||||
|
`fetchFromGitHub` uses `fetchzip` to download the source archive generated by GitHub for the specified revision. If `leaveDotGit`, `deepClone` or `fetchSubmodules` are set to `true`, `fetchFromGitHub` will use `fetchgit` instead. Refer to its section for documentation of these options.
|
||||||
|
|
||||||
## `fetchFromGitLab`
|
## `fetchFromGitLab`
|
||||||
|
|
||||||
This is used with GitLab repositories. The arguments expected are very similar to fetchFromGitHub above.
|
This is used with GitLab repositories. The arguments expected are very similar to fetchFromGitHub above.
|
||||||
|
|
|
@ -1,7 +1,14 @@
|
||||||
{ pkgs, ... }:
|
{ config, ... }:
|
||||||
|
|
||||||
{
|
{
|
||||||
imports = [ ./sd-image-aarch64.nix ];
|
imports = [
|
||||||
|
../sd-card/sd-image-aarch64-new-kernel-installer.nix
|
||||||
boot.kernelPackages = pkgs.linuxPackages_latest;
|
];
|
||||||
|
config = {
|
||||||
|
warnings = [
|
||||||
|
''
|
||||||
|
.../cd-dvd/sd-image-aarch64-new-kernel.nix is deprecated and will eventually be removed.
|
||||||
|
Please switch to .../sd-card/sd-image-aarch64-new-kernel-installer.nix, instead.
|
||||||
|
''
|
||||||
|
];
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,80 +1,14 @@
|
||||||
# To build, use:
|
{ config, ... }:
|
||||||
# nix-build nixos -I nixos-config=nixos/modules/installer/cd-dvd/sd-image-aarch64.nix -A config.system.build.sdImage
|
|
||||||
{ config, lib, pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
../../profiles/base.nix
|
../sd-card/sd-image-aarch64-installer.nix
|
||||||
../../profiles/installation-device.nix
|
|
||||||
./sd-image.nix
|
|
||||||
];
|
];
|
||||||
|
config = {
|
||||||
boot.loader.grub.enable = false;
|
warnings = [
|
||||||
boot.loader.generic-extlinux-compatible.enable = true;
|
''
|
||||||
|
.../cd-dvd/sd-image-aarch64.nix is deprecated and will eventually be removed.
|
||||||
boot.consoleLogLevel = lib.mkDefault 7;
|
Please switch to .../sd-card/sd-image-aarch64-installer.nix, instead.
|
||||||
|
''
|
||||||
# The serial ports listed here are:
|
];
|
||||||
# - ttyS0: for Tegra (Jetson TX1)
|
|
||||||
# - ttyAMA0: for QEMU's -machine virt
|
|
||||||
boot.kernelParams = ["console=ttyS0,115200n8" "console=ttyAMA0,115200n8" "console=tty0"];
|
|
||||||
|
|
||||||
boot.initrd.availableKernelModules = [
|
|
||||||
# Allows early (earlier) modesetting for the Raspberry Pi
|
|
||||||
"vc4" "bcm2835_dma" "i2c_bcm2835"
|
|
||||||
# Allows early (earlier) modesetting for Allwinner SoCs
|
|
||||||
"sun4i_drm" "sun8i_drm_hdmi" "sun8i_mixer"
|
|
||||||
];
|
|
||||||
|
|
||||||
sdImage = {
|
|
||||||
populateFirmwareCommands = let
|
|
||||||
configTxt = pkgs.writeText "config.txt" ''
|
|
||||||
[pi3]
|
|
||||||
kernel=u-boot-rpi3.bin
|
|
||||||
|
|
||||||
[pi4]
|
|
||||||
kernel=u-boot-rpi4.bin
|
|
||||||
enable_gic=1
|
|
||||||
armstub=armstub8-gic.bin
|
|
||||||
|
|
||||||
# Otherwise the resolution will be weird in most cases, compared to
|
|
||||||
# what the pi3 firmware does by default.
|
|
||||||
disable_overscan=1
|
|
||||||
|
|
||||||
[all]
|
|
||||||
# Boot in 64-bit mode.
|
|
||||||
arm_64bit=1
|
|
||||||
|
|
||||||
# U-Boot needs this to work, regardless of whether UART is actually used or not.
|
|
||||||
# Look in arch/arm/mach-bcm283x/Kconfig in the U-Boot tree to see if this is still
|
|
||||||
# a requirement in the future.
|
|
||||||
enable_uart=1
|
|
||||||
|
|
||||||
# Prevent the firmware from smashing the framebuffer setup done by the mainline kernel
|
|
||||||
# when attempting to show low-voltage or overtemperature warnings.
|
|
||||||
avoid_warnings=1
|
|
||||||
'';
|
|
||||||
in ''
|
|
||||||
(cd ${pkgs.raspberrypifw}/share/raspberrypi/boot && cp bootcode.bin fixup*.dat start*.elf $NIX_BUILD_TOP/firmware/)
|
|
||||||
|
|
||||||
# Add the config
|
|
||||||
cp ${configTxt} firmware/config.txt
|
|
||||||
|
|
||||||
# Add pi3 specific files
|
|
||||||
cp ${pkgs.ubootRaspberryPi3_64bit}/u-boot.bin firmware/u-boot-rpi3.bin
|
|
||||||
|
|
||||||
# Add pi4 specific files
|
|
||||||
cp ${pkgs.ubootRaspberryPi4_64bit}/u-boot.bin firmware/u-boot-rpi4.bin
|
|
||||||
cp ${pkgs.raspberrypi-armstubs}/armstub8-gic.bin firmware/armstub8-gic.bin
|
|
||||||
cp ${pkgs.raspberrypifw}/share/raspberrypi/boot/bcm2711-rpi-4-b.dtb firmware/
|
|
||||||
'';
|
|
||||||
populateRootCommands = ''
|
|
||||||
mkdir -p ./files/boot
|
|
||||||
${config.boot.loader.generic-extlinux-compatible.populateCmd} -c ${config.system.build.toplevel} -d ./files/boot
|
|
||||||
'';
|
|
||||||
};
|
};
|
||||||
|
|
||||||
# the installation media is also the installation target,
|
|
||||||
# so we don't want to provide the installation configuration.nix.
|
|
||||||
installer.cloneConfig = false;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,57 +1,14 @@
|
||||||
# To build, use:
|
{ config, ... }:
|
||||||
# nix-build nixos -I nixos-config=nixos/modules/installer/cd-dvd/sd-image-armv7l-multiplatform.nix -A config.system.build.sdImage
|
|
||||||
{ config, lib, pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
../../profiles/base.nix
|
../sd-card/sd-image-armv7l-multiplatform-installer.nix
|
||||||
../../profiles/installation-device.nix
|
|
||||||
./sd-image.nix
|
|
||||||
];
|
];
|
||||||
|
config = {
|
||||||
boot.loader.grub.enable = false;
|
warnings = [
|
||||||
boot.loader.generic-extlinux-compatible.enable = true;
|
''
|
||||||
|
.../cd-dvd/sd-image-armv7l-multiplatform.nix is deprecated and will eventually be removed.
|
||||||
boot.consoleLogLevel = lib.mkDefault 7;
|
Please switch to .../sd-card/sd-image-armv7l-multiplatform-installer.nix, instead.
|
||||||
boot.kernelPackages = pkgs.linuxPackages_latest;
|
''
|
||||||
# The serial ports listed here are:
|
];
|
||||||
# - ttyS0: for Tegra (Jetson TK1)
|
|
||||||
# - ttymxc0: for i.MX6 (Wandboard)
|
|
||||||
# - ttyAMA0: for Allwinner (pcDuino3 Nano) and QEMU's -machine virt
|
|
||||||
# - ttyO0: for OMAP (BeagleBone Black)
|
|
||||||
# - ttySAC2: for Exynos (ODROID-XU3)
|
|
||||||
boot.kernelParams = ["console=ttyS0,115200n8" "console=ttymxc0,115200n8" "console=ttyAMA0,115200n8" "console=ttyO0,115200n8" "console=ttySAC2,115200n8" "console=tty0"];
|
|
||||||
|
|
||||||
sdImage = {
|
|
||||||
populateFirmwareCommands = let
|
|
||||||
configTxt = pkgs.writeText "config.txt" ''
|
|
||||||
# Prevent the firmware from smashing the framebuffer setup done by the mainline kernel
|
|
||||||
# when attempting to show low-voltage or overtemperature warnings.
|
|
||||||
avoid_warnings=1
|
|
||||||
|
|
||||||
[pi2]
|
|
||||||
kernel=u-boot-rpi2.bin
|
|
||||||
|
|
||||||
[pi3]
|
|
||||||
kernel=u-boot-rpi3.bin
|
|
||||||
|
|
||||||
# U-Boot used to need this to work, regardless of whether UART is actually used or not.
|
|
||||||
# TODO: check when/if this can be removed.
|
|
||||||
enable_uart=1
|
|
||||||
'';
|
|
||||||
in ''
|
|
||||||
(cd ${pkgs.raspberrypifw}/share/raspberrypi/boot && cp bootcode.bin fixup*.dat start*.elf $NIX_BUILD_TOP/firmware/)
|
|
||||||
cp ${pkgs.ubootRaspberryPi2}/u-boot.bin firmware/u-boot-rpi2.bin
|
|
||||||
cp ${pkgs.ubootRaspberryPi3_32bit}/u-boot.bin firmware/u-boot-rpi3.bin
|
|
||||||
cp ${configTxt} firmware/config.txt
|
|
||||||
'';
|
|
||||||
populateRootCommands = ''
|
|
||||||
mkdir -p ./files/boot
|
|
||||||
${config.boot.loader.generic-extlinux-compatible.populateCmd} -c ${config.system.build.toplevel} -d ./files/boot
|
|
||||||
'';
|
|
||||||
};
|
};
|
||||||
|
|
||||||
# the installation media is also the installation target,
|
|
||||||
# so we don't want to provide the installation configuration.nix.
|
|
||||||
installer.cloneConfig = false;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,46 +1,14 @@
|
||||||
# To build, use:
|
{ config, ... }:
|
||||||
# nix-build nixos -I nixos-config=nixos/modules/installer/cd-dvd/sd-image-raspberrypi.nix -A config.system.build.sdImage
|
|
||||||
{ config, lib, pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
../../profiles/base.nix
|
../sd-card/sd-image-raspberrypi-installer.nix
|
||||||
../../profiles/installation-device.nix
|
|
||||||
./sd-image.nix
|
|
||||||
];
|
];
|
||||||
|
config = {
|
||||||
boot.loader.grub.enable = false;
|
warnings = [
|
||||||
boot.loader.generic-extlinux-compatible.enable = true;
|
''
|
||||||
|
.../cd-dvd/sd-image-raspberrypi.nix is deprecated and will eventually be removed.
|
||||||
boot.consoleLogLevel = lib.mkDefault 7;
|
Please switch to .../sd-card/sd-image-raspberrypi-installer.nix, instead.
|
||||||
boot.kernelPackages = pkgs.linuxPackages_rpi1;
|
''
|
||||||
|
];
|
||||||
sdImage = {
|
|
||||||
populateFirmwareCommands = let
|
|
||||||
configTxt = pkgs.writeText "config.txt" ''
|
|
||||||
# Prevent the firmware from smashing the framebuffer setup done by the mainline kernel
|
|
||||||
# when attempting to show low-voltage or overtemperature warnings.
|
|
||||||
avoid_warnings=1
|
|
||||||
|
|
||||||
[pi0]
|
|
||||||
kernel=u-boot-rpi0.bin
|
|
||||||
|
|
||||||
[pi1]
|
|
||||||
kernel=u-boot-rpi1.bin
|
|
||||||
'';
|
|
||||||
in ''
|
|
||||||
(cd ${pkgs.raspberrypifw}/share/raspberrypi/boot && cp bootcode.bin fixup*.dat start*.elf $NIX_BUILD_TOP/firmware/)
|
|
||||||
cp ${pkgs.ubootRaspberryPiZero}/u-boot.bin firmware/u-boot-rpi0.bin
|
|
||||||
cp ${pkgs.ubootRaspberryPi}/u-boot.bin firmware/u-boot-rpi1.bin
|
|
||||||
cp ${configTxt} firmware/config.txt
|
|
||||||
'';
|
|
||||||
populateRootCommands = ''
|
|
||||||
mkdir -p ./files/boot
|
|
||||||
${config.boot.loader.generic-extlinux-compatible.populateCmd} -c ${config.system.build.toplevel} -d ./files/boot
|
|
||||||
'';
|
|
||||||
};
|
};
|
||||||
|
|
||||||
# the installation media is also the installation target,
|
|
||||||
# so we don't want to provide the installation configuration.nix.
|
|
||||||
installer.cloneConfig = false;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,14 @@
|
||||||
# To build, use:
|
{ config, ... }:
|
||||||
# nix-build nixos -I nixos-config=nixos/modules/installer/cd-dvd/sd-image-raspberrypi4.nix -A config.system.build.sdImage
|
|
||||||
{ config, lib, pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
{
|
||||||
imports = [ ./sd-image-aarch64.nix ];
|
imports = [
|
||||||
boot.kernelPackages = pkgs.linuxPackages_rpi4;
|
../sd-card/sd-image-raspberrypi4-installer.nix
|
||||||
|
];
|
||||||
|
config = {
|
||||||
|
warnings = [
|
||||||
|
''
|
||||||
|
.../cd-dvd/sd-image-raspberrypi4.nix is deprecated and will eventually be removed.
|
||||||
|
Please switch to .../sd-card/sd-image-raspberrypi4-installer.nix, instead.
|
||||||
|
''
|
||||||
|
];
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,245 +1,14 @@
|
||||||
# This module creates a bootable SD card image containing the given NixOS
|
{ config, ... }:
|
||||||
# configuration. The generated image is MBR partitioned, with a FAT
|
|
||||||
# /boot/firmware partition, and ext4 root partition. The generated image
|
|
||||||
# is sized to fit its contents, and a boot script automatically resizes
|
|
||||||
# the root partition to fit the device on the first boot.
|
|
||||||
#
|
|
||||||
# The firmware partition is built with expectation to hold the Raspberry
|
|
||||||
# Pi firmware and bootloader, and be removed and replaced with a firmware
|
|
||||||
# build for the target SoC for other board families.
|
|
||||||
#
|
|
||||||
# The derivation for the SD image will be placed in
|
|
||||||
# config.system.build.sdImage
|
|
||||||
|
|
||||||
{ config, lib, pkgs, ... }:
|
|
||||||
|
|
||||||
with lib;
|
|
||||||
|
|
||||||
let
|
|
||||||
rootfsImage = pkgs.callPackage ../../../lib/make-ext4-fs.nix ({
|
|
||||||
inherit (config.sdImage) storePaths;
|
|
||||||
compressImage = true;
|
|
||||||
populateImageCommands = config.sdImage.populateRootCommands;
|
|
||||||
volumeLabel = "NIXOS_SD";
|
|
||||||
} // optionalAttrs (config.sdImage.rootPartitionUUID != null) {
|
|
||||||
uuid = config.sdImage.rootPartitionUUID;
|
|
||||||
});
|
|
||||||
in
|
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
(mkRemovedOptionModule [ "sdImage" "bootPartitionID" ] "The FAT partition for SD image now only holds the Raspberry Pi firmware files. Use firmwarePartitionID to configure that partition's ID.")
|
../sd-card/sd-image.nix
|
||||||
(mkRemovedOptionModule [ "sdImage" "bootSize" ] "The boot files for SD image have been moved to the main ext4 partition. The FAT partition now only holds the Raspberry Pi firmware files. Changing its size may not be required.")
|
|
||||||
];
|
];
|
||||||
|
|
||||||
options.sdImage = {
|
|
||||||
imageName = mkOption {
|
|
||||||
default = "${config.sdImage.imageBaseName}-${config.system.nixos.label}-${pkgs.stdenv.hostPlatform.system}.img";
|
|
||||||
description = ''
|
|
||||||
Name of the generated image file.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
imageBaseName = mkOption {
|
|
||||||
default = "nixos-sd-image";
|
|
||||||
description = ''
|
|
||||||
Prefix of the name of the generated image file.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
storePaths = mkOption {
|
|
||||||
type = with types; listOf package;
|
|
||||||
example = literalExample "[ pkgs.stdenv ]";
|
|
||||||
description = ''
|
|
||||||
Derivations to be included in the Nix store in the generated SD image.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
firmwarePartitionID = mkOption {
|
|
||||||
type = types.str;
|
|
||||||
default = "0x2178694e";
|
|
||||||
description = ''
|
|
||||||
Volume ID for the /boot/firmware partition on the SD card. This value
|
|
||||||
must be a 32-bit hexadecimal number.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
firmwarePartitionName = mkOption {
|
|
||||||
type = types.str;
|
|
||||||
default = "FIRMWARE";
|
|
||||||
description = ''
|
|
||||||
Name of the filesystem which holds the boot firmware.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
rootPartitionUUID = mkOption {
|
|
||||||
type = types.nullOr types.str;
|
|
||||||
default = null;
|
|
||||||
example = "14e19a7b-0ae0-484d-9d54-43bd6fdc20c7";
|
|
||||||
description = ''
|
|
||||||
UUID for the filesystem on the main NixOS partition on the SD card.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
firmwareSize = mkOption {
|
|
||||||
type = types.int;
|
|
||||||
# As of 2019-08-18 the Raspberry pi firmware + u-boot takes ~18MiB
|
|
||||||
default = 30;
|
|
||||||
description = ''
|
|
||||||
Size of the /boot/firmware partition, in megabytes.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
populateFirmwareCommands = mkOption {
|
|
||||||
example = literalExample "'' cp \${pkgs.myBootLoader}/u-boot.bin firmware/ ''";
|
|
||||||
description = ''
|
|
||||||
Shell commands to populate the ./firmware directory.
|
|
||||||
All files in that directory are copied to the
|
|
||||||
/boot/firmware partition on the SD image.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
populateRootCommands = mkOption {
|
|
||||||
example = literalExample "''\${config.boot.loader.generic-extlinux-compatible.populateCmd} -c \${config.system.build.toplevel} -d ./files/boot''";
|
|
||||||
description = ''
|
|
||||||
Shell commands to populate the ./files directory.
|
|
||||||
All files in that directory are copied to the
|
|
||||||
root (/) partition on the SD image. Use this to
|
|
||||||
populate the ./files/boot (/boot) directory.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
postBuildCommands = mkOption {
|
|
||||||
example = literalExample "'' dd if=\${pkgs.myBootLoader}/SPL of=$img bs=1024 seek=1 conv=notrunc ''";
|
|
||||||
default = "";
|
|
||||||
description = ''
|
|
||||||
Shell commands to run after the image is built.
|
|
||||||
Can be used for boards requiring to dd u-boot SPL before actual partitions.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
compressImage = mkOption {
|
|
||||||
type = types.bool;
|
|
||||||
default = true;
|
|
||||||
description = ''
|
|
||||||
Whether the SD image should be compressed using
|
|
||||||
<command>zstd</command>.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
config = {
|
config = {
|
||||||
fileSystems = {
|
warnings = [
|
||||||
"/boot/firmware" = {
|
''
|
||||||
device = "/dev/disk/by-label/${config.sdImage.firmwarePartitionName}";
|
.../cd-dvd/sd-image.nix is deprecated and will eventually be removed.
|
||||||
fsType = "vfat";
|
Please switch to .../sd-card/sd-image.nix, instead.
|
||||||
# Alternatively, this could be removed from the configuration.
|
''
|
||||||
# The filesystem is not needed at runtime, it could be treated
|
];
|
||||||
# as an opaque blob instead of a discrete FAT32 filesystem.
|
|
||||||
options = [ "nofail" "noauto" ];
|
|
||||||
};
|
|
||||||
"/" = {
|
|
||||||
device = "/dev/disk/by-label/NIXOS_SD";
|
|
||||||
fsType = "ext4";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
sdImage.storePaths = [ config.system.build.toplevel ];
|
|
||||||
|
|
||||||
system.build.sdImage = pkgs.callPackage ({ stdenv, dosfstools, e2fsprogs,
|
|
||||||
mtools, libfaketime, util-linux, zstd }: stdenv.mkDerivation {
|
|
||||||
name = config.sdImage.imageName;
|
|
||||||
|
|
||||||
nativeBuildInputs = [ dosfstools e2fsprogs mtools libfaketime util-linux zstd ];
|
|
||||||
|
|
||||||
inherit (config.sdImage) compressImage;
|
|
||||||
|
|
||||||
buildCommand = ''
|
|
||||||
mkdir -p $out/nix-support $out/sd-image
|
|
||||||
export img=$out/sd-image/${config.sdImage.imageName}
|
|
||||||
|
|
||||||
echo "${pkgs.stdenv.buildPlatform.system}" > $out/nix-support/system
|
|
||||||
if test -n "$compressImage"; then
|
|
||||||
echo "file sd-image $img.zst" >> $out/nix-support/hydra-build-products
|
|
||||||
else
|
|
||||||
echo "file sd-image $img" >> $out/nix-support/hydra-build-products
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Decompressing rootfs image"
|
|
||||||
zstd -d --no-progress "${rootfsImage}" -o ./root-fs.img
|
|
||||||
|
|
||||||
# Gap in front of the first partition, in MiB
|
|
||||||
gap=8
|
|
||||||
|
|
||||||
# Create the image file sized to fit /boot/firmware and /, plus slack for the gap.
|
|
||||||
rootSizeBlocks=$(du -B 512 --apparent-size ./root-fs.img | awk '{ print $1 }')
|
|
||||||
firmwareSizeBlocks=$((${toString config.sdImage.firmwareSize} * 1024 * 1024 / 512))
|
|
||||||
imageSize=$((rootSizeBlocks * 512 + firmwareSizeBlocks * 512 + gap * 1024 * 1024))
|
|
||||||
truncate -s $imageSize $img
|
|
||||||
|
|
||||||
# type=b is 'W95 FAT32', type=83 is 'Linux'.
|
|
||||||
# The "bootable" partition is where u-boot will look file for the bootloader
|
|
||||||
# information (dtbs, extlinux.conf file).
|
|
||||||
sfdisk $img <<EOF
|
|
||||||
label: dos
|
|
||||||
label-id: ${config.sdImage.firmwarePartitionID}
|
|
||||||
|
|
||||||
start=''${gap}M, size=$firmwareSizeBlocks, type=b
|
|
||||||
start=$((gap + ${toString config.sdImage.firmwareSize}))M, type=83, bootable
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Copy the rootfs into the SD image
|
|
||||||
eval $(partx $img -o START,SECTORS --nr 2 --pairs)
|
|
||||||
dd conv=notrunc if=./root-fs.img of=$img seek=$START count=$SECTORS
|
|
||||||
|
|
||||||
# Create a FAT32 /boot/firmware partition of suitable size into firmware_part.img
|
|
||||||
eval $(partx $img -o START,SECTORS --nr 1 --pairs)
|
|
||||||
truncate -s $((SECTORS * 512)) firmware_part.img
|
|
||||||
faketime "1970-01-01 00:00:00" mkfs.vfat -i ${config.sdImage.firmwarePartitionID} -n ${config.sdImage.firmwarePartitionName} firmware_part.img
|
|
||||||
|
|
||||||
# Populate the files intended for /boot/firmware
|
|
||||||
mkdir firmware
|
|
||||||
${config.sdImage.populateFirmwareCommands}
|
|
||||||
|
|
||||||
# Copy the populated /boot/firmware into the SD image
|
|
||||||
(cd firmware; mcopy -psvm -i ../firmware_part.img ./* ::)
|
|
||||||
# Verify the FAT partition before copying it.
|
|
||||||
fsck.vfat -vn firmware_part.img
|
|
||||||
dd conv=notrunc if=firmware_part.img of=$img seek=$START count=$SECTORS
|
|
||||||
|
|
||||||
${config.sdImage.postBuildCommands}
|
|
||||||
|
|
||||||
if test -n "$compressImage"; then
|
|
||||||
zstd -T$NIX_BUILD_CORES --rm $img
|
|
||||||
fi
|
|
||||||
'';
|
|
||||||
}) {};
|
|
||||||
|
|
||||||
boot.postBootCommands = ''
|
|
||||||
# On the first boot do some maintenance tasks
|
|
||||||
if [ -f /nix-path-registration ]; then
|
|
||||||
set -euo pipefail
|
|
||||||
set -x
|
|
||||||
# Figure out device names for the boot device and root filesystem.
|
|
||||||
rootPart=$(${pkgs.util-linux}/bin/findmnt -n -o SOURCE /)
|
|
||||||
bootDevice=$(lsblk -npo PKNAME $rootPart)
|
|
||||||
partNum=$(lsblk -npo MAJ:MIN $rootPart | ${pkgs.gawk}/bin/awk -F: '{print $2}')
|
|
||||||
|
|
||||||
# Resize the root partition and the filesystem to fit the disk
|
|
||||||
echo ",+," | sfdisk -N$partNum --no-reread $bootDevice
|
|
||||||
${pkgs.parted}/bin/partprobe
|
|
||||||
${pkgs.e2fsprogs}/bin/resize2fs $rootPart
|
|
||||||
|
|
||||||
# Register the contents of the initial Nix store
|
|
||||||
${config.nix.package.out}/bin/nix-store --load-db < /nix-path-registration
|
|
||||||
|
|
||||||
# nixos-rebuild also requires a "system" profile and an /etc/NIXOS tag.
|
|
||||||
touch /etc/NIXOS
|
|
||||||
${config.nix.package.out}/bin/nix-env -p /nix/var/nix/profiles/system --set /run/current-system
|
|
||||||
|
|
||||||
# Prevents this from running on later boots.
|
|
||||||
rm -f /nix-path-registration
|
|
||||||
fi
|
|
||||||
'';
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
../../profiles/installation-device.nix
|
||||||
|
./sd-image-aarch64.nix
|
||||||
|
];
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
../../profiles/installation-device.nix
|
||||||
|
./sd-image-aarch64-new-kernel.nix
|
||||||
|
];
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
{ pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [ ./sd-image-aarch64.nix ];
|
||||||
|
|
||||||
|
boot.kernelPackages = pkgs.linuxPackages_latest;
|
||||||
|
}
|
79
nixos/modules/installer/sd-card/sd-image-aarch64.nix
Normal file
79
nixos/modules/installer/sd-card/sd-image-aarch64.nix
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
# To build, use:
|
||||||
|
# nix-build nixos -I nixos-config=nixos/modules/installer/cd-dvd/sd-image-aarch64.nix -A config.system.build.sdImage
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
../../profiles/base.nix
|
||||||
|
./sd-image.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.loader.grub.enable = false;
|
||||||
|
boot.loader.generic-extlinux-compatible.enable = true;
|
||||||
|
|
||||||
|
boot.consoleLogLevel = lib.mkDefault 7;
|
||||||
|
|
||||||
|
# The serial ports listed here are:
|
||||||
|
# - ttyS0: for Tegra (Jetson TX1)
|
||||||
|
# - ttyAMA0: for QEMU's -machine virt
|
||||||
|
boot.kernelParams = ["console=ttyS0,115200n8" "console=ttyAMA0,115200n8" "console=tty0"];
|
||||||
|
|
||||||
|
boot.initrd.availableKernelModules = [
|
||||||
|
# Allows early (earlier) modesetting for the Raspberry Pi
|
||||||
|
"vc4" "bcm2835_dma" "i2c_bcm2835"
|
||||||
|
# Allows early (earlier) modesetting for Allwinner SoCs
|
||||||
|
"sun4i_drm" "sun8i_drm_hdmi" "sun8i_mixer"
|
||||||
|
];
|
||||||
|
|
||||||
|
sdImage = {
|
||||||
|
populateFirmwareCommands = let
|
||||||
|
configTxt = pkgs.writeText "config.txt" ''
|
||||||
|
[pi3]
|
||||||
|
kernel=u-boot-rpi3.bin
|
||||||
|
|
||||||
|
[pi4]
|
||||||
|
kernel=u-boot-rpi4.bin
|
||||||
|
enable_gic=1
|
||||||
|
armstub=armstub8-gic.bin
|
||||||
|
|
||||||
|
# Otherwise the resolution will be weird in most cases, compared to
|
||||||
|
# what the pi3 firmware does by default.
|
||||||
|
disable_overscan=1
|
||||||
|
|
||||||
|
[all]
|
||||||
|
# Boot in 64-bit mode.
|
||||||
|
arm_64bit=1
|
||||||
|
|
||||||
|
# U-Boot needs this to work, regardless of whether UART is actually used or not.
|
||||||
|
# Look in arch/arm/mach-bcm283x/Kconfig in the U-Boot tree to see if this is still
|
||||||
|
# a requirement in the future.
|
||||||
|
enable_uart=1
|
||||||
|
|
||||||
|
# Prevent the firmware from smashing the framebuffer setup done by the mainline kernel
|
||||||
|
# when attempting to show low-voltage or overtemperature warnings.
|
||||||
|
avoid_warnings=1
|
||||||
|
'';
|
||||||
|
in ''
|
||||||
|
(cd ${pkgs.raspberrypifw}/share/raspberrypi/boot && cp bootcode.bin fixup*.dat start*.elf $NIX_BUILD_TOP/firmware/)
|
||||||
|
|
||||||
|
# Add the config
|
||||||
|
cp ${configTxt} firmware/config.txt
|
||||||
|
|
||||||
|
# Add pi3 specific files
|
||||||
|
cp ${pkgs.ubootRaspberryPi3_64bit}/u-boot.bin firmware/u-boot-rpi3.bin
|
||||||
|
|
||||||
|
# Add pi4 specific files
|
||||||
|
cp ${pkgs.ubootRaspberryPi4_64bit}/u-boot.bin firmware/u-boot-rpi4.bin
|
||||||
|
cp ${pkgs.raspberrypi-armstubs}/armstub8-gic.bin firmware/armstub8-gic.bin
|
||||||
|
cp ${pkgs.raspberrypifw}/share/raspberrypi/boot/bcm2711-rpi-4-b.dtb firmware/
|
||||||
|
'';
|
||||||
|
populateRootCommands = ''
|
||||||
|
mkdir -p ./files/boot
|
||||||
|
${config.boot.loader.generic-extlinux-compatible.populateCmd} -c ${config.system.build.toplevel} -d ./files/boot
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
# the installation media is also the installation target,
|
||||||
|
# so we don't want to provide the installation configuration.nix.
|
||||||
|
installer.cloneConfig = false;
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
../../profiles/installation-device.nix
|
||||||
|
./sd-image-armv7l-multiplatform.nix
|
||||||
|
];
|
||||||
|
}
|
|
@ -0,0 +1,56 @@
|
||||||
|
# To build, use:
|
||||||
|
# nix-build nixos -I nixos-config=nixos/modules/installer/cd-dvd/sd-image-armv7l-multiplatform.nix -A config.system.build.sdImage
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
../../profiles/base.nix
|
||||||
|
./sd-image.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.loader.grub.enable = false;
|
||||||
|
boot.loader.generic-extlinux-compatible.enable = true;
|
||||||
|
|
||||||
|
boot.consoleLogLevel = lib.mkDefault 7;
|
||||||
|
boot.kernelPackages = pkgs.linuxPackages_latest;
|
||||||
|
# The serial ports listed here are:
|
||||||
|
# - ttyS0: for Tegra (Jetson TK1)
|
||||||
|
# - ttymxc0: for i.MX6 (Wandboard)
|
||||||
|
# - ttyAMA0: for Allwinner (pcDuino3 Nano) and QEMU's -machine virt
|
||||||
|
# - ttyO0: for OMAP (BeagleBone Black)
|
||||||
|
# - ttySAC2: for Exynos (ODROID-XU3)
|
||||||
|
boot.kernelParams = ["console=ttyS0,115200n8" "console=ttymxc0,115200n8" "console=ttyAMA0,115200n8" "console=ttyO0,115200n8" "console=ttySAC2,115200n8" "console=tty0"];
|
||||||
|
|
||||||
|
sdImage = {
|
||||||
|
populateFirmwareCommands = let
|
||||||
|
configTxt = pkgs.writeText "config.txt" ''
|
||||||
|
# Prevent the firmware from smashing the framebuffer setup done by the mainline kernel
|
||||||
|
# when attempting to show low-voltage or overtemperature warnings.
|
||||||
|
avoid_warnings=1
|
||||||
|
|
||||||
|
[pi2]
|
||||||
|
kernel=u-boot-rpi2.bin
|
||||||
|
|
||||||
|
[pi3]
|
||||||
|
kernel=u-boot-rpi3.bin
|
||||||
|
|
||||||
|
# U-Boot used to need this to work, regardless of whether UART is actually used or not.
|
||||||
|
# TODO: check when/if this can be removed.
|
||||||
|
enable_uart=1
|
||||||
|
'';
|
||||||
|
in ''
|
||||||
|
(cd ${pkgs.raspberrypifw}/share/raspberrypi/boot && cp bootcode.bin fixup*.dat start*.elf $NIX_BUILD_TOP/firmware/)
|
||||||
|
cp ${pkgs.ubootRaspberryPi2}/u-boot.bin firmware/u-boot-rpi2.bin
|
||||||
|
cp ${pkgs.ubootRaspberryPi3_32bit}/u-boot.bin firmware/u-boot-rpi3.bin
|
||||||
|
cp ${configTxt} firmware/config.txt
|
||||||
|
'';
|
||||||
|
populateRootCommands = ''
|
||||||
|
mkdir -p ./files/boot
|
||||||
|
${config.boot.loader.generic-extlinux-compatible.populateCmd} -c ${config.system.build.toplevel} -d ./files/boot
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
# the installation media is also the installation target,
|
||||||
|
# so we don't want to provide the installation configuration.nix.
|
||||||
|
installer.cloneConfig = false;
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
../../profiles/installation-device.nix
|
||||||
|
./sd-image-raspberrypi4.nix
|
||||||
|
];
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
../../profiles/installation-device.nix
|
||||||
|
./sd-image-raspberrypi.nix
|
||||||
|
];
|
||||||
|
}
|
45
nixos/modules/installer/sd-card/sd-image-raspberrypi.nix
Normal file
45
nixos/modules/installer/sd-card/sd-image-raspberrypi.nix
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
# To build, use:
|
||||||
|
# nix-build nixos -I nixos-config=nixos/modules/installer/cd-dvd/sd-image-raspberrypi.nix -A config.system.build.sdImage
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
../../profiles/base.nix
|
||||||
|
./sd-image.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.loader.grub.enable = false;
|
||||||
|
boot.loader.generic-extlinux-compatible.enable = true;
|
||||||
|
|
||||||
|
boot.consoleLogLevel = lib.mkDefault 7;
|
||||||
|
boot.kernelPackages = pkgs.linuxPackages_rpi1;
|
||||||
|
|
||||||
|
sdImage = {
|
||||||
|
populateFirmwareCommands = let
|
||||||
|
configTxt = pkgs.writeText "config.txt" ''
|
||||||
|
# Prevent the firmware from smashing the framebuffer setup done by the mainline kernel
|
||||||
|
# when attempting to show low-voltage or overtemperature warnings.
|
||||||
|
avoid_warnings=1
|
||||||
|
|
||||||
|
[pi0]
|
||||||
|
kernel=u-boot-rpi0.bin
|
||||||
|
|
||||||
|
[pi1]
|
||||||
|
kernel=u-boot-rpi1.bin
|
||||||
|
'';
|
||||||
|
in ''
|
||||||
|
(cd ${pkgs.raspberrypifw}/share/raspberrypi/boot && cp bootcode.bin fixup*.dat start*.elf $NIX_BUILD_TOP/firmware/)
|
||||||
|
cp ${pkgs.ubootRaspberryPiZero}/u-boot.bin firmware/u-boot-rpi0.bin
|
||||||
|
cp ${pkgs.ubootRaspberryPi}/u-boot.bin firmware/u-boot-rpi1.bin
|
||||||
|
cp ${configTxt} firmware/config.txt
|
||||||
|
'';
|
||||||
|
populateRootCommands = ''
|
||||||
|
mkdir -p ./files/boot
|
||||||
|
${config.boot.loader.generic-extlinux-compatible.populateCmd} -c ${config.system.build.toplevel} -d ./files/boot
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
# the installation media is also the installation target,
|
||||||
|
# so we don't want to provide the installation configuration.nix.
|
||||||
|
installer.cloneConfig = false;
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
# To build, use:
|
||||||
|
# nix-build nixos -I nixos-config=nixos/modules/installer/cd-dvd/sd-image-raspberrypi4.nix -A config.system.build.sdImage
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [ ./sd-image-aarch64.nix ];
|
||||||
|
boot.kernelPackages = pkgs.linuxPackages_rpi4;
|
||||||
|
}
|
245
nixos/modules/installer/sd-card/sd-image.nix
Normal file
245
nixos/modules/installer/sd-card/sd-image.nix
Normal file
|
@ -0,0 +1,245 @@
|
||||||
|
# This module creates a bootable SD card image containing the given NixOS
|
||||||
|
# configuration. The generated image is MBR partitioned, with a FAT
|
||||||
|
# /boot/firmware partition, and ext4 root partition. The generated image
|
||||||
|
# is sized to fit its contents, and a boot script automatically resizes
|
||||||
|
# the root partition to fit the device on the first boot.
|
||||||
|
#
|
||||||
|
# The firmware partition is built with expectation to hold the Raspberry
|
||||||
|
# Pi firmware and bootloader, and be removed and replaced with a firmware
|
||||||
|
# build for the target SoC for other board families.
|
||||||
|
#
|
||||||
|
# The derivation for the SD image will be placed in
|
||||||
|
# config.system.build.sdImage
|
||||||
|
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
with lib;
|
||||||
|
|
||||||
|
let
|
||||||
|
rootfsImage = pkgs.callPackage ../../../lib/make-ext4-fs.nix ({
|
||||||
|
inherit (config.sdImage) storePaths;
|
||||||
|
compressImage = true;
|
||||||
|
populateImageCommands = config.sdImage.populateRootCommands;
|
||||||
|
volumeLabel = "NIXOS_SD";
|
||||||
|
} // optionalAttrs (config.sdImage.rootPartitionUUID != null) {
|
||||||
|
uuid = config.sdImage.rootPartitionUUID;
|
||||||
|
});
|
||||||
|
in
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
(mkRemovedOptionModule [ "sdImage" "bootPartitionID" ] "The FAT partition for SD image now only holds the Raspberry Pi firmware files. Use firmwarePartitionID to configure that partition's ID.")
|
||||||
|
(mkRemovedOptionModule [ "sdImage" "bootSize" ] "The boot files for SD image have been moved to the main ext4 partition. The FAT partition now only holds the Raspberry Pi firmware files. Changing its size may not be required.")
|
||||||
|
];
|
||||||
|
|
||||||
|
options.sdImage = {
|
||||||
|
imageName = mkOption {
|
||||||
|
default = "${config.sdImage.imageBaseName}-${config.system.nixos.label}-${pkgs.stdenv.hostPlatform.system}.img";
|
||||||
|
description = ''
|
||||||
|
Name of the generated image file.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
imageBaseName = mkOption {
|
||||||
|
default = "nixos-sd-image";
|
||||||
|
description = ''
|
||||||
|
Prefix of the name of the generated image file.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
storePaths = mkOption {
|
||||||
|
type = with types; listOf package;
|
||||||
|
example = literalExample "[ pkgs.stdenv ]";
|
||||||
|
description = ''
|
||||||
|
Derivations to be included in the Nix store in the generated SD image.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
firmwarePartitionID = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "0x2178694e";
|
||||||
|
description = ''
|
||||||
|
Volume ID for the /boot/firmware partition on the SD card. This value
|
||||||
|
must be a 32-bit hexadecimal number.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
firmwarePartitionName = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "FIRMWARE";
|
||||||
|
description = ''
|
||||||
|
Name of the filesystem which holds the boot firmware.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
rootPartitionUUID = mkOption {
|
||||||
|
type = types.nullOr types.str;
|
||||||
|
default = null;
|
||||||
|
example = "14e19a7b-0ae0-484d-9d54-43bd6fdc20c7";
|
||||||
|
description = ''
|
||||||
|
UUID for the filesystem on the main NixOS partition on the SD card.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
firmwareSize = mkOption {
|
||||||
|
type = types.int;
|
||||||
|
# As of 2019-08-18 the Raspberry pi firmware + u-boot takes ~18MiB
|
||||||
|
default = 30;
|
||||||
|
description = ''
|
||||||
|
Size of the /boot/firmware partition, in megabytes.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
populateFirmwareCommands = mkOption {
|
||||||
|
example = literalExample "'' cp \${pkgs.myBootLoader}/u-boot.bin firmware/ ''";
|
||||||
|
description = ''
|
||||||
|
Shell commands to populate the ./firmware directory.
|
||||||
|
All files in that directory are copied to the
|
||||||
|
/boot/firmware partition on the SD image.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
populateRootCommands = mkOption {
|
||||||
|
example = literalExample "''\${config.boot.loader.generic-extlinux-compatible.populateCmd} -c \${config.system.build.toplevel} -d ./files/boot''";
|
||||||
|
description = ''
|
||||||
|
Shell commands to populate the ./files directory.
|
||||||
|
All files in that directory are copied to the
|
||||||
|
root (/) partition on the SD image. Use this to
|
||||||
|
populate the ./files/boot (/boot) directory.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
postBuildCommands = mkOption {
|
||||||
|
example = literalExample "'' dd if=\${pkgs.myBootLoader}/SPL of=$img bs=1024 seek=1 conv=notrunc ''";
|
||||||
|
default = "";
|
||||||
|
description = ''
|
||||||
|
Shell commands to run after the image is built.
|
||||||
|
Can be used for boards requiring to dd u-boot SPL before actual partitions.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
compressImage = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
description = ''
|
||||||
|
Whether the SD image should be compressed using
|
||||||
|
<command>zstd</command>.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
config = {
|
||||||
|
fileSystems = {
|
||||||
|
"/boot/firmware" = {
|
||||||
|
device = "/dev/disk/by-label/${config.sdImage.firmwarePartitionName}";
|
||||||
|
fsType = "vfat";
|
||||||
|
# Alternatively, this could be removed from the configuration.
|
||||||
|
# The filesystem is not needed at runtime, it could be treated
|
||||||
|
# as an opaque blob instead of a discrete FAT32 filesystem.
|
||||||
|
options = [ "nofail" "noauto" ];
|
||||||
|
};
|
||||||
|
"/" = {
|
||||||
|
device = "/dev/disk/by-label/NIXOS_SD";
|
||||||
|
fsType = "ext4";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
sdImage.storePaths = [ config.system.build.toplevel ];
|
||||||
|
|
||||||
|
system.build.sdImage = pkgs.callPackage ({ stdenv, dosfstools, e2fsprogs,
|
||||||
|
mtools, libfaketime, util-linux, zstd }: stdenv.mkDerivation {
|
||||||
|
name = config.sdImage.imageName;
|
||||||
|
|
||||||
|
nativeBuildInputs = [ dosfstools e2fsprogs mtools libfaketime util-linux zstd ];
|
||||||
|
|
||||||
|
inherit (config.sdImage) compressImage;
|
||||||
|
|
||||||
|
buildCommand = ''
|
||||||
|
mkdir -p $out/nix-support $out/sd-image
|
||||||
|
export img=$out/sd-image/${config.sdImage.imageName}
|
||||||
|
|
||||||
|
echo "${pkgs.stdenv.buildPlatform.system}" > $out/nix-support/system
|
||||||
|
if test -n "$compressImage"; then
|
||||||
|
echo "file sd-image $img.zst" >> $out/nix-support/hydra-build-products
|
||||||
|
else
|
||||||
|
echo "file sd-image $img" >> $out/nix-support/hydra-build-products
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Decompressing rootfs image"
|
||||||
|
zstd -d --no-progress "${rootfsImage}" -o ./root-fs.img
|
||||||
|
|
||||||
|
# Gap in front of the first partition, in MiB
|
||||||
|
gap=8
|
||||||
|
|
||||||
|
# Create the image file sized to fit /boot/firmware and /, plus slack for the gap.
|
||||||
|
rootSizeBlocks=$(du -B 512 --apparent-size ./root-fs.img | awk '{ print $1 }')
|
||||||
|
firmwareSizeBlocks=$((${toString config.sdImage.firmwareSize} * 1024 * 1024 / 512))
|
||||||
|
imageSize=$((rootSizeBlocks * 512 + firmwareSizeBlocks * 512 + gap * 1024 * 1024))
|
||||||
|
truncate -s $imageSize $img
|
||||||
|
|
||||||
|
# type=b is 'W95 FAT32', type=83 is 'Linux'.
|
||||||
|
# The "bootable" partition is where u-boot will look file for the bootloader
|
||||||
|
# information (dtbs, extlinux.conf file).
|
||||||
|
sfdisk $img <<EOF
|
||||||
|
label: dos
|
||||||
|
label-id: ${config.sdImage.firmwarePartitionID}
|
||||||
|
|
||||||
|
start=''${gap}M, size=$firmwareSizeBlocks, type=b
|
||||||
|
start=$((gap + ${toString config.sdImage.firmwareSize}))M, type=83, bootable
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Copy the rootfs into the SD image
|
||||||
|
eval $(partx $img -o START,SECTORS --nr 2 --pairs)
|
||||||
|
dd conv=notrunc if=./root-fs.img of=$img seek=$START count=$SECTORS
|
||||||
|
|
||||||
|
# Create a FAT32 /boot/firmware partition of suitable size into firmware_part.img
|
||||||
|
eval $(partx $img -o START,SECTORS --nr 1 --pairs)
|
||||||
|
truncate -s $((SECTORS * 512)) firmware_part.img
|
||||||
|
faketime "1970-01-01 00:00:00" mkfs.vfat -i ${config.sdImage.firmwarePartitionID} -n ${config.sdImage.firmwarePartitionName} firmware_part.img
|
||||||
|
|
||||||
|
# Populate the files intended for /boot/firmware
|
||||||
|
mkdir firmware
|
||||||
|
${config.sdImage.populateFirmwareCommands}
|
||||||
|
|
||||||
|
# Copy the populated /boot/firmware into the SD image
|
||||||
|
(cd firmware; mcopy -psvm -i ../firmware_part.img ./* ::)
|
||||||
|
# Verify the FAT partition before copying it.
|
||||||
|
fsck.vfat -vn firmware_part.img
|
||||||
|
dd conv=notrunc if=firmware_part.img of=$img seek=$START count=$SECTORS
|
||||||
|
|
||||||
|
${config.sdImage.postBuildCommands}
|
||||||
|
|
||||||
|
if test -n "$compressImage"; then
|
||||||
|
zstd -T$NIX_BUILD_CORES --rm $img
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
}) {};
|
||||||
|
|
||||||
|
boot.postBootCommands = ''
|
||||||
|
# On the first boot do some maintenance tasks
|
||||||
|
if [ -f /nix-path-registration ]; then
|
||||||
|
set -euo pipefail
|
||||||
|
set -x
|
||||||
|
# Figure out device names for the boot device and root filesystem.
|
||||||
|
rootPart=$(${pkgs.util-linux}/bin/findmnt -n -o SOURCE /)
|
||||||
|
bootDevice=$(lsblk -npo PKNAME $rootPart)
|
||||||
|
partNum=$(lsblk -npo MAJ:MIN $rootPart | ${pkgs.gawk}/bin/awk -F: '{print $2}')
|
||||||
|
|
||||||
|
# Resize the root partition and the filesystem to fit the disk
|
||||||
|
echo ",+," | sfdisk -N$partNum --no-reread $bootDevice
|
||||||
|
${pkgs.parted}/bin/partprobe
|
||||||
|
${pkgs.e2fsprogs}/bin/resize2fs $rootPart
|
||||||
|
|
||||||
|
# Register the contents of the initial Nix store
|
||||||
|
${config.nix.package.out}/bin/nix-store --load-db < /nix-path-registration
|
||||||
|
|
||||||
|
# nixos-rebuild also requires a "system" profile and an /etc/NIXOS tag.
|
||||||
|
touch /etc/NIXOS
|
||||||
|
${config.nix.package.out}/bin/nix-env -p /nix/var/nix/profiles/system --set /run/current-system
|
||||||
|
|
||||||
|
# Prevents this from running on later boots.
|
||||||
|
rm -f /nix-path-registration
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
|
@ -113,7 +113,6 @@ in
|
||||||
"~@memlock"
|
"~@memlock"
|
||||||
"~@resources"
|
"~@resources"
|
||||||
"~@setuid"
|
"~@setuid"
|
||||||
"~@sync"
|
|
||||||
"~@timer"
|
"~@timer"
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
|
@ -82,11 +82,8 @@ in {
|
||||||
X-RestartIfChanged=false
|
X-RestartIfChanged=false
|
||||||
'';
|
'';
|
||||||
|
|
||||||
systemd.units."autovt@.service".unit = pkgs.runCommand "unit" { preferLocalBuild = true; }
|
systemd.suppressedSystemUnits = [ "autovt@.service" ];
|
||||||
''
|
systemd.units."kmsconvt@.service".aliases = [ "autovt@.service" ];
|
||||||
mkdir -p $out
|
|
||||||
ln -s ${config.systemd.units."kmsconvt@.service".unit}/kmsconvt@.service $out/autovt@.service
|
|
||||||
'';
|
|
||||||
|
|
||||||
systemd.services.systemd-vconsole-setup.enable = false;
|
systemd.services.systemd-vconsole-setup.enable = false;
|
||||||
|
|
||||||
|
|
|
@ -183,14 +183,20 @@ in
|
||||||
"systemd-udev-settle.service"
|
"systemd-udev-settle.service"
|
||||||
];
|
];
|
||||||
systemd.services.display-manager.conflicts = [
|
systemd.services.display-manager.conflicts = [
|
||||||
"getty@tty${gdm.initialVT}.service"
|
"getty@tty${gdm.initialVT}.service"
|
||||||
# TODO: Add "plymouth-quit.service" so GDM can control when plymouth quits.
|
"plymouth-quit.service"
|
||||||
# Currently this breaks switching configurations while using plymouth.
|
|
||||||
];
|
];
|
||||||
systemd.services.display-manager.onFailure = [
|
systemd.services.display-manager.onFailure = [
|
||||||
"plymouth-quit.service"
|
"plymouth-quit.service"
|
||||||
];
|
];
|
||||||
|
|
||||||
|
# Prevent nixos-rebuild switch from bringing down the graphical
|
||||||
|
# session. (If multi-user.target wants plymouth-quit.service which
|
||||||
|
# conflicts display-manager.service, then when nixos-rebuild
|
||||||
|
# switch starts multi-user.target, display-manager.service is
|
||||||
|
# stopped so plymouth-quit.service can be started.)
|
||||||
|
systemd.services.plymouth-quit.wantedBy = lib.mkForce [];
|
||||||
|
|
||||||
systemd.services.display-manager.serviceConfig = {
|
systemd.services.display-manager.serviceConfig = {
|
||||||
# Restart = "always"; - already defined in xserver.nix
|
# Restart = "always"; - already defined in xserver.nix
|
||||||
KillMode = "mixed";
|
KillMode = "mixed";
|
||||||
|
|
|
@ -171,23 +171,23 @@ in rec {
|
||||||
|
|
||||||
sd_image = forMatchingSystems [ "armv6l-linux" "armv7l-linux" "aarch64-linux" ] (system: makeSdImage {
|
sd_image = forMatchingSystems [ "armv6l-linux" "armv7l-linux" "aarch64-linux" ] (system: makeSdImage {
|
||||||
module = {
|
module = {
|
||||||
armv6l-linux = ./modules/installer/cd-dvd/sd-image-raspberrypi.nix;
|
armv6l-linux = ./modules/installer/sd-card/sd-image-raspberrypi-installer.nix;
|
||||||
armv7l-linux = ./modules/installer/cd-dvd/sd-image-armv7l-multiplatform.nix;
|
armv7l-linux = ./modules/installer/sd-card/sd-image-armv7l-multiplatform-installer.nix;
|
||||||
aarch64-linux = ./modules/installer/cd-dvd/sd-image-aarch64.nix;
|
aarch64-linux = ./modules/installer/sd-card/sd-image-aarch64-installer.nix;
|
||||||
}.${system};
|
}.${system};
|
||||||
inherit system;
|
inherit system;
|
||||||
});
|
});
|
||||||
|
|
||||||
sd_image_new_kernel = forMatchingSystems [ "aarch64-linux" ] (system: makeSdImage {
|
sd_image_new_kernel = forMatchingSystems [ "aarch64-linux" ] (system: makeSdImage {
|
||||||
module = {
|
module = {
|
||||||
aarch64-linux = ./modules/installer/cd-dvd/sd-image-aarch64-new-kernel.nix;
|
aarch64-linux = ./modules/installer/sd-card/sd-image-aarch64-new-kernel-installer.nix;
|
||||||
}.${system};
|
}.${system};
|
||||||
type = "minimal-new-kernel";
|
type = "minimal-new-kernel";
|
||||||
inherit system;
|
inherit system;
|
||||||
});
|
});
|
||||||
|
|
||||||
sd_image_raspberrypi4 = forMatchingSystems [ "aarch64-linux" ] (system: makeSdImage {
|
sd_image_raspberrypi4 = forMatchingSystems [ "aarch64-linux" ] (system: makeSdImage {
|
||||||
module = ./modules/installer/cd-dvd/sd-image-raspberrypi4.nix;
|
module = ./modules/installer/sd-card/sd-image-raspberrypi4-installer.nix;
|
||||||
inherit system;
|
inherit system;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -1,52 +1,135 @@
|
||||||
{ lib, config, fetchurl, stdenv, wrapGAppsHook, autoreconfHook
|
{ stdenv, lib, fetchgit, wrapGAppsHook, autoreconfHook, bison, flex
|
||||||
, curl, dbus, dbus-glib, enchant, gtk2, gnutls, gnupg, gpgme, gumbo
|
, curl, gtk2, gtk3, pkg-config, python2, python3, shared-mime-info
|
||||||
, libarchive, libcanberra-gtk2, libetpan, libnotify, libsoup, libxml2, networkmanager
|
, glib-networking, gsettings-desktop-schemas
|
||||||
, openldap, perl, pkg-config, poppler, python, shared-mime-info
|
|
||||||
, glib-networking, gsettings-desktop-schemas, libSM, libytnef, libical
|
# Use the experimental gtk3 branch.
|
||||||
# Build options
|
, useGtk3 ? false
|
||||||
# TODO: A flag to build the manual.
|
|
||||||
# TODO: Plugins that complain about their missing dependencies, even when
|
# Package compatibility: old parameters whose name were not directly derived
|
||||||
# provided:
|
|
||||||
# gdata requires libgdata
|
|
||||||
# geolocation requires libchamplain
|
|
||||||
, enableLdap ? false
|
|
||||||
, enableNetworkManager ? config.networking.networkmanager.enable or false
|
|
||||||
, enablePgp ? true
|
, enablePgp ? true
|
||||||
, enablePluginArchive ? false
|
|
||||||
, enablePluginLitehtmlViewer ? false
|
|
||||||
, enablePluginNotificationDialogs ? true
|
, enablePluginNotificationDialogs ? true
|
||||||
, enablePluginNotificationSounds ? true
|
, enablePluginNotificationSounds ? true
|
||||||
, enablePluginPdf ? false
|
, enablePluginPdf ? true
|
||||||
, enablePluginPython ? false
|
, enablePluginRavatar ? true
|
||||||
, enablePluginRavatar ? false
|
, enableSpellcheck ? true
|
||||||
, enablePluginRssyl ? false
|
|
||||||
, enablePluginSmime ? false
|
# Arguments to include external libraries
|
||||||
, enablePluginSpamassassin ? false
|
, enableLibSM ? true, libSM
|
||||||
, enablePluginSpamReport ? false
|
, enableGnuTLS ? true, gnutls
|
||||||
, enablePluginVcalendar ? false
|
, enableEnchant ? enableSpellcheck, enchant
|
||||||
, enableSpellcheck ? false
|
, enableDbus ? true, dbus, dbus-glib
|
||||||
|
, enableLdap ? true, openldap
|
||||||
|
, enableNetworkManager ? true, networkmanager
|
||||||
|
, enableLibetpan ? true, libetpan
|
||||||
|
, enableValgrind ? true, valgrind
|
||||||
|
, enableSvg ? true, librsvg
|
||||||
|
|
||||||
|
# Configure claws-mail's plugins
|
||||||
|
, enablePluginAcpiNotifier ? true
|
||||||
|
, enablePluginAddressKeeper ? true
|
||||||
|
, enablePluginArchive ? true, libarchive
|
||||||
|
, enablePluginAttRemover ? true
|
||||||
|
, enablePluginAttachWarner ? true
|
||||||
|
, enablePluginBogofilter ? true
|
||||||
|
, enablePluginBsfilter ? true
|
||||||
|
, enablePluginClamd ? true
|
||||||
|
, enablePluginDillo ? true
|
||||||
|
, enablePluginFetchInfo ? true
|
||||||
|
, enablePluginLibravatar ? enablePluginRavatar
|
||||||
|
, enablePluginLitehtmlViewer ? true, gumbo
|
||||||
|
, enablePluginMailmbox ? true
|
||||||
|
, enablePluginManageSieve ? true
|
||||||
|
, enablePluginNewMail ? true
|
||||||
|
, enablePluginNotification ? (enablePluginNotificationDialogs || enablePluginNotificationSounds), libcanberra-gtk2, libcanberra-gtk3, libnotify
|
||||||
|
, enablePluginPdfViewer ? enablePluginPdf, poppler
|
||||||
|
, enablePluginPerl ? true, perl
|
||||||
|
, enablePluginPython ? true
|
||||||
|
, enablePluginPgp ? enablePgp, gnupg, gpgme
|
||||||
|
, enablePluginRssyl ? true, libxml2
|
||||||
|
, enablePluginSmime ? true
|
||||||
|
, enablePluginSpamassassin ? true
|
||||||
|
, enablePluginSpamReport ? true
|
||||||
|
, enablePluginTnefParse ? true, libytnef
|
||||||
|
, enablePluginVcalendar ? true, libical
|
||||||
}:
|
}:
|
||||||
|
|
||||||
with lib;
|
with lib;
|
||||||
|
|
||||||
stdenv.mkDerivation rec {
|
let
|
||||||
pname = "claws-mail";
|
version = if useGtk3 then "3.99.0" else "3.17.8";
|
||||||
version = "3.17.8";
|
|
||||||
|
|
||||||
src = fetchurl {
|
# The official release uses gtk2 and contains the version tag.
|
||||||
url = "https://www.claws-mail.org/download.php?file=releases/claws-mail-${version}.tar.xz";
|
gtk2src = {
|
||||||
sha256 = "sha256-zbeygUmV1vSpw7HwvBRn7Vw88qXg2hcwqqJaisyv3a8=";
|
sha256 = "0l4f8q11iyj8pi120lrapgq51k5j64xf0jlczkzbm99rym752ch5";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# The corresponding commit in the gtk3 branch.
|
||||||
|
gtk3src = {
|
||||||
|
sha256 = "176h1swh1zx6dqyzfz470x4a1xicnv0zhy8ir47k7p23g6y17i2k";
|
||||||
|
};
|
||||||
|
|
||||||
|
python = if useGtk3 then python3 else python2;
|
||||||
|
pythonPkgs = if useGtk3
|
||||||
|
then
|
||||||
|
with python.pkgs; [ python wrapPython pygobject3 ]
|
||||||
|
else
|
||||||
|
with python.pkgs; [ python wrapPython pygtk pygobject2 ];
|
||||||
|
|
||||||
|
features = [
|
||||||
|
{ flags = [ "acpi_notifier-plugin" ]; enabled = enablePluginAcpiNotifier; }
|
||||||
|
{ flags = [ "address_keeper-plugin" ]; enabled = enablePluginAddressKeeper; }
|
||||||
|
{ flags = [ "archive-plugin" ]; enabled = enablePluginArchive; deps = [ libarchive ]; }
|
||||||
|
{ flags = [ "att_remover-plugin" ]; enabled = enablePluginAttRemover; }
|
||||||
|
{ flags = [ "attachwarner-plugin" ]; enabled = enablePluginAttachWarner; }
|
||||||
|
{ flags = [ "bogofilter-plugin" ]; enabled = enablePluginBogofilter; }
|
||||||
|
{ flags = [ "bsfilter-plugin" ]; enabled = enablePluginBsfilter; }
|
||||||
|
{ flags = [ "clamd-plugin" ]; enabled = enablePluginClamd; }
|
||||||
|
{ flags = [ "dbus" ]; enabled = enableDbus; deps = [ dbus dbus-glib ]; }
|
||||||
|
{ flags = [ "dillo-plugin" ]; enabled = enablePluginDillo; }
|
||||||
|
{ flags = [ "enchant" ]; enabled = enableEnchant; deps = [ enchant ]; }
|
||||||
|
{ flags = [ "fetchinfo-plugin" ]; enabled = enablePluginFetchInfo; }
|
||||||
|
{ flags = [ "gnutls" ]; enabled = enableGnuTLS; deps = [ gnutls ]; }
|
||||||
|
{ flags = [ "ldap" ]; enabled = enableLdap; deps = [ openldap ]; }
|
||||||
|
{ flags = [ "libetpan" ]; enabled = enableLibetpan; deps = [ libetpan ]; }
|
||||||
|
{ flags = [ "libravatar-plugin" ]; enabled = enablePluginLibravatar; }
|
||||||
|
{ flags = [ "libsm" ]; enabled = enableLibSM; deps = [ libSM ]; }
|
||||||
|
{ flags = [ "litehtml_viewer-plugin" ]; enabled = enablePluginLitehtmlViewer; deps = [ gumbo ]; }
|
||||||
|
{ flags = [ "mailmbox-plugin" ]; enabled = enablePluginMailmbox; }
|
||||||
|
{ flags = [ "managesieve-plugin" ]; enabled = enablePluginManageSieve; }
|
||||||
|
{ flags = [ "networkmanager" ]; enabled = enableNetworkManager; deps = [ networkmanager ]; }
|
||||||
|
{ flags = [ "newmail-plugin" ]; enabled = enablePluginNewMail; }
|
||||||
|
{ flags = [ "notification-plugin" ]; enabled = enablePluginNotification; deps = [ libnotify ] ++ [(if useGtk3 then libcanberra-gtk3 else libcanberra-gtk2)]; }
|
||||||
|
{ flags = [ "pdf_viewer-plugin" ]; enabled = enablePluginPdfViewer; deps = [ poppler ]; }
|
||||||
|
{ flags = [ "perl-plugin" ]; enabled = enablePluginPerl; deps = [ perl ]; }
|
||||||
|
{ flags = [ "pgpcore-plugin" "pgpinline-plugin" "pgpmime-plugin" ]; enabled = enablePluginPgp; deps = [ gnupg gpgme ]; }
|
||||||
|
{ flags = [ "python-plugin" ]; enabled = enablePluginPython; }
|
||||||
|
{ flags = [ "rssyl-plugin" ]; enabled = enablePluginRssyl; deps = [ libxml2 ]; }
|
||||||
|
{ flags = [ "smime-plugin" ]; enabled = enablePluginSmime; }
|
||||||
|
{ flags = [ "spam_report-plugin" ]; enabled = enablePluginSpamReport; }
|
||||||
|
{ flags = [ "spamassassin-plugin" ]; enabled = enablePluginSpamassassin; }
|
||||||
|
{ flags = [ "svg" ]; enabled = enableSvg; deps = [ librsvg ]; }
|
||||||
|
{ flags = [ "tnef_parse-plugin" ]; enabled = enablePluginTnefParse; deps = [ libytnef ]; }
|
||||||
|
{ flags = [ "valgrind" ]; enabled = enableValgrind; deps = [ valgrind ]; }
|
||||||
|
{ flags = [ "vcalendar-plugin" ]; enabled = enablePluginVcalendar; deps = [ libical ]; }
|
||||||
|
];
|
||||||
|
in stdenv.mkDerivation rec {
|
||||||
|
pname = "claws-mail";
|
||||||
|
inherit version;
|
||||||
|
|
||||||
|
src = fetchgit ({
|
||||||
|
rev = version;
|
||||||
|
url = "git://git.claws-mail.org/claws.git";
|
||||||
|
} // (if useGtk3 then gtk3src else gtk2src));
|
||||||
|
|
||||||
outputs = [ "out" "dev" ];
|
outputs = [ "out" "dev" ];
|
||||||
|
|
||||||
patches = [
|
patches = [ ./mime.patch ];
|
||||||
./mime.patch
|
|
||||||
];
|
|
||||||
|
|
||||||
preConfigure = ''
|
preConfigure = ''
|
||||||
# autotools check tries to dlopen libpython as a requirement for the python plugin
|
# autotools check tries to dlopen libpython as a requirement for the python plugin
|
||||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH''${LD_LIBRARY_PATH:+:}${python}/lib
|
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH''${LD_LIBRARY_PATH:+:}${python}/lib
|
||||||
|
# generate version without .git
|
||||||
|
[ -e version ] || echo "echo ${version}" > version
|
||||||
'';
|
'';
|
||||||
|
|
||||||
postPatch = ''
|
postPatch = ''
|
||||||
|
@ -54,51 +137,30 @@ stdenv.mkDerivation rec {
|
||||||
--subst-var-by MIMEROOTDIR ${shared-mime-info}/share
|
--subst-var-by MIMEROOTDIR ${shared-mime-info}/share
|
||||||
'';
|
'';
|
||||||
|
|
||||||
nativeBuildInputs = [ autoreconfHook pkg-config wrapGAppsHook python.pkgs.wrapPython ];
|
nativeBuildInputs = [ autoreconfHook pkg-config bison flex wrapGAppsHook ];
|
||||||
propagatedBuildInputs = with python.pkgs; [ python ] ++ optionals enablePluginPython [ pygtk pygobject2 ];
|
propagatedBuildInputs = pythonPkgs;
|
||||||
|
|
||||||
buildInputs =
|
buildInputs =
|
||||||
[ curl dbus dbus-glib gtk2 gnutls gsettings-desktop-schemas
|
[ curl gsettings-desktop-schemas glib-networking ]
|
||||||
libetpan perl glib-networking libSM libytnef
|
++ [(if useGtk3 then gtk3 else gtk2)]
|
||||||
]
|
++ concatMap (f: optionals f.enabled f.deps) (filter (f: f ? deps) features)
|
||||||
++ optional enableSpellcheck enchant
|
;
|
||||||
++ optionals (enablePgp || enablePluginSmime) [ gnupg gpgme ]
|
|
||||||
++ optional enablePluginArchive libarchive
|
|
||||||
++ optional enablePluginNotificationSounds libcanberra-gtk2
|
|
||||||
++ optional enablePluginNotificationDialogs libnotify
|
|
||||||
++ optional enablePluginLitehtmlViewer gumbo
|
|
||||||
++ optional enablePluginRssyl libxml2
|
|
||||||
++ optional enableNetworkManager networkmanager
|
|
||||||
++ optional enableLdap openldap
|
|
||||||
++ optional enablePluginPdf poppler
|
|
||||||
++ optional enablePluginVcalendar libical;
|
|
||||||
|
|
||||||
configureFlags =
|
configureFlags =
|
||||||
optional (!enableLdap) "--disable-ldap"
|
[
|
||||||
++ optional (!enableNetworkManager) "--disable-networkmanager"
|
"--disable-manual" # Missing docbook-tools, e.g., docbook2html
|
||||||
++ optionals (!enablePgp) [
|
"--disable-compface" # Missing compface library
|
||||||
"--disable-pgpcore-plugin"
|
"--disable-jpilot" # Missing jpilot library
|
||||||
"--disable-pgpinline-plugin"
|
|
||||||
"--disable-pgpmime-plugin"
|
"--disable-gdata-plugin" # Complains about missing libgdata, even when provided
|
||||||
]
|
"--disable-fancy-plugin" # Missing libwebkit-1.0 library
|
||||||
++ optional (!enablePluginArchive) "--disable-archive-plugin"
|
] ++
|
||||||
++ optional (!enablePluginLitehtmlViewer) "--disable-litehtml_viewer-plugin"
|
(map (feature: map (flag: strings.enableFeature feature.enabled flag) feature.flags) features);
|
||||||
++ optional (!enablePluginPdf) "--disable-pdf_viewer-plugin"
|
|
||||||
++ optional (!enablePluginPython) "--disable-python-plugin"
|
|
||||||
++ optional (!enablePluginRavatar) "--disable-libravatar-plugin"
|
|
||||||
++ optional (!enablePluginRssyl) "--disable-rssyl-plugin"
|
|
||||||
++ optional (!enablePluginSmime) "--disable-smime-plugin"
|
|
||||||
++ optional (!enablePluginSpamassassin) "--disable-spamassassin-plugin"
|
|
||||||
++ optional (!enablePluginSpamReport) "--disable-spam_report-plugin"
|
|
||||||
++ optional (!enablePluginVcalendar) "--disable-vcalendar-plugin"
|
|
||||||
++ optional (!enableSpellcheck) "--disable-enchant";
|
|
||||||
|
|
||||||
enableParallelBuilding = true;
|
enableParallelBuilding = true;
|
||||||
|
|
||||||
pythonPath = with python.pkgs; [ pygobject2 pygtk ];
|
|
||||||
|
|
||||||
preFixup = ''
|
preFixup = ''
|
||||||
buildPythonPath "$out $pythonPath"
|
buildPythonPath "$out $pythonPkgs"
|
||||||
gappsWrapperArgs+=(--prefix XDG_DATA_DIRS : "${shared-mime-info}/share" --prefix PYTHONPATH : "$program_PYTHONPATH")
|
gappsWrapperArgs+=(--prefix XDG_DATA_DIRS : "${shared-mime-info}/share" --prefix PYTHONPATH : "$program_PYTHONPATH")
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
@ -112,6 +174,6 @@ stdenv.mkDerivation rec {
|
||||||
homepage = "https://www.claws-mail.org/";
|
homepage = "https://www.claws-mail.org/";
|
||||||
license = licenses.gpl3;
|
license = licenses.gpl3;
|
||||||
platforms = platforms.linux;
|
platforms = platforms.linux;
|
||||||
maintainers = with maintainers; [ fpletz globin orivej ];
|
maintainers = with maintainers; [ fpletz globin orivej oxzi ajs124 ];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,121 +0,0 @@
|
||||||
{ lib, config, fetchgit, stdenv, wrapGAppsHook, autoreconfHook, bison, flex
|
|
||||||
, curl, dbus, dbus-glib, enchant, gtk3, gnutls, gnupg, gpgme
|
|
||||||
, libarchive, libcanberra-gtk3, libetpan, libnotify, libsoup, libxml2, networkmanager
|
|
||||||
, openldap, perl, pkg-config, poppler, python, shared-mime-info, webkitgtk
|
|
||||||
, glib-networking, gsettings-desktop-schemas, libSM, libytnef, libical
|
|
||||||
# Build options
|
|
||||||
# TODO: A flag to build the manual.
|
|
||||||
# TODO: Plugins that complain about their missing dependencies, even when
|
|
||||||
# provided:
|
|
||||||
# gdata requires libgdata
|
|
||||||
# geolocation requires libchamplain
|
|
||||||
, enableLdap ? false
|
|
||||||
, enableNetworkManager ? config.networking.networkmanager.enable or false
|
|
||||||
, enablePgp ? true
|
|
||||||
, enablePluginArchive ? false
|
|
||||||
, enablePluginFancy ? true
|
|
||||||
, enablePluginNotificationDialogs ? true
|
|
||||||
, enablePluginNotificationSounds ? true
|
|
||||||
, enablePluginPdf ? false
|
|
||||||
, enablePluginPython ? false
|
|
||||||
, enablePluginRavatar ? false
|
|
||||||
, enablePluginRssyl ? false
|
|
||||||
, enablePluginSmime ? false
|
|
||||||
, enablePluginSpamassassin ? false
|
|
||||||
, enablePluginSpamReport ? false
|
|
||||||
, enablePluginVcalendar ? false
|
|
||||||
, enableSpellcheck ? false
|
|
||||||
}:
|
|
||||||
|
|
||||||
with lib;
|
|
||||||
|
|
||||||
stdenv.mkDerivation rec {
|
|
||||||
pname = "claws-mail-gtk3";
|
|
||||||
version = "3.99.0";
|
|
||||||
|
|
||||||
src = fetchgit {
|
|
||||||
url = "git://git.claws-mail.org/claws.git";
|
|
||||||
rev = version;
|
|
||||||
sha256 = "176h1swh1zx6dqyzfz470x4a1xicnv0zhy8ir47k7p23g6y17i2k";
|
|
||||||
};
|
|
||||||
|
|
||||||
outputs = [ "out" "dev" ];
|
|
||||||
|
|
||||||
patches = [ ./mime.patch ];
|
|
||||||
|
|
||||||
preConfigure = ''
|
|
||||||
# autotools check tries to dlopen libpython as a requirement for the python plugin
|
|
||||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH''${LD_LIBRARY_PATH:+:}${python}/lib
|
|
||||||
# generate version without .git
|
|
||||||
[ -e version ] || echo "echo ${version}" > version
|
|
||||||
'';
|
|
||||||
|
|
||||||
postPatch = ''
|
|
||||||
substituteInPlace src/procmime.c \
|
|
||||||
--subst-var-by MIMEROOTDIR ${shared-mime-info}/share
|
|
||||||
'';
|
|
||||||
|
|
||||||
nativeBuildInputs = [ autoreconfHook bison flex pkg-config wrapGAppsHook python.pkgs.wrapPython ];
|
|
||||||
propagatedBuildInputs = with python.pkgs; [ python ] ++ optionals enablePluginPython [ pygtk pygobject2 ];
|
|
||||||
|
|
||||||
buildInputs =
|
|
||||||
[ curl dbus dbus-glib gtk3 gnutls gsettings-desktop-schemas
|
|
||||||
libetpan perl glib-networking libSM libytnef
|
|
||||||
]
|
|
||||||
++ optional enableSpellcheck enchant
|
|
||||||
++ optionals (enablePgp || enablePluginSmime) [ gnupg gpgme ]
|
|
||||||
++ optional enablePluginArchive libarchive
|
|
||||||
++ optional enablePluginNotificationSounds libcanberra-gtk3
|
|
||||||
++ optional enablePluginNotificationDialogs libnotify
|
|
||||||
++ optional enablePluginFancy libsoup
|
|
||||||
++ optional enablePluginRssyl libxml2
|
|
||||||
++ optional enableNetworkManager networkmanager
|
|
||||||
++ optional enableLdap openldap
|
|
||||||
++ optional enablePluginPdf poppler
|
|
||||||
++ optional enablePluginFancy webkitgtk
|
|
||||||
++ optional enablePluginVcalendar libical;
|
|
||||||
|
|
||||||
configureFlags =
|
|
||||||
optional (!enableLdap) "--disable-ldap"
|
|
||||||
++ optional (!enableNetworkManager) "--disable-networkmanager"
|
|
||||||
++ optionals (!enablePgp) [
|
|
||||||
"--disable-pgpcore-plugin"
|
|
||||||
"--disable-pgpinline-plugin"
|
|
||||||
"--disable-pgpmime-plugin"
|
|
||||||
]
|
|
||||||
++ optional (!enablePluginArchive) "--disable-archive-plugin"
|
|
||||||
++ optional (!enablePluginFancy) "--disable-fancy-plugin"
|
|
||||||
++ optional (!enablePluginPdf) "--disable-pdf_viewer-plugin"
|
|
||||||
++ optional (!enablePluginPython) "--disable-python-plugin"
|
|
||||||
++ optional (!enablePluginRavatar) "--disable-libravatar-plugin"
|
|
||||||
++ optional (!enablePluginRssyl) "--disable-rssyl-plugin"
|
|
||||||
++ optional (!enablePluginSmime) "--disable-smime-plugin"
|
|
||||||
++ optional (!enablePluginSpamassassin) "--disable-spamassassin-plugin"
|
|
||||||
++ optional (!enablePluginSpamReport) "--disable-spam_report-plugin"
|
|
||||||
++ optional (!enablePluginVcalendar) "--disable-vcalendar-plugin"
|
|
||||||
++ optional (!enableSpellcheck) "--disable-enchant";
|
|
||||||
|
|
||||||
enableParallelBuilding = true;
|
|
||||||
|
|
||||||
pythonPath = with python.pkgs; [ pygobject2 pygtk ];
|
|
||||||
|
|
||||||
preFixup = ''
|
|
||||||
buildPythonPath "$out $pythonPath"
|
|
||||||
gappsWrapperArgs+=(--prefix XDG_DATA_DIRS : "${shared-mime-info}/share" --prefix PYTHONPATH : "$program_PYTHONPATH")
|
|
||||||
'';
|
|
||||||
|
|
||||||
postInstall = ''
|
|
||||||
mkdir -p $out/share/applications
|
|
||||||
cp claws-mail.desktop $out/share/applications
|
|
||||||
'';
|
|
||||||
|
|
||||||
NIX_CFLAGS_COMPILE = [ "-Wno-deprecated-declarations" ];
|
|
||||||
|
|
||||||
meta = {
|
|
||||||
description = "The user-friendly, lightweight, and fast email client";
|
|
||||||
homepage = "https://www.claws-mail.org/";
|
|
||||||
license = licenses.gpl3;
|
|
||||||
platforms = platforms.linux;
|
|
||||||
maintainers = with maintainers; [ fpletz globin orivej ];
|
|
||||||
};
|
|
||||||
}
|
|
|
@ -1,17 +1,19 @@
|
||||||
{ lib, fetchgit, fetchzip }:
|
{ lib, fetchgit, fetchzip }:
|
||||||
|
|
||||||
{ owner, repo, rev, name ? "source"
|
{ owner, repo, rev, name ? "source"
|
||||||
, fetchSubmodules ? false, private ? false
|
, fetchSubmodules ? false, leaveDotGit ? null
|
||||||
|
, deepClone ? false, private ? false
|
||||||
, githubBase ? "github.com", varPrefix ? null
|
, githubBase ? "github.com", varPrefix ? null
|
||||||
, ... # For hash agility
|
, ... # For hash agility
|
||||||
}@args: assert private -> !fetchSubmodules;
|
}@args:
|
||||||
let
|
let
|
||||||
baseUrl = "https://${githubBase}/${owner}/${repo}";
|
baseUrl = "https://${githubBase}/${owner}/${repo}";
|
||||||
passthruAttrs = removeAttrs args [ "owner" "repo" "rev" "fetchSubmodules" "private" "githubBase" "varPrefix" ];
|
passthruAttrs = removeAttrs args [ "owner" "repo" "rev" "fetchSubmodules" "private" "githubBase" "varPrefix" ];
|
||||||
varBase = "NIX${if varPrefix == null then "" else "_${varPrefix}"}_GITHUB_PRIVATE_";
|
varBase = "NIX${if varPrefix == null then "" else "_${varPrefix}"}_GITHUB_PRIVATE_";
|
||||||
|
useFetchGit = fetchSubmodules || (leaveDotGit == true) || deepClone;
|
||||||
# We prefer fetchzip in cases we don't need submodules as the hash
|
# We prefer fetchzip in cases we don't need submodules as the hash
|
||||||
# is more stable in that case.
|
# is more stable in that case.
|
||||||
fetcher = if fetchSubmodules then fetchgit else fetchzip;
|
fetcher = if useFetchGit then fetchgit else fetchzip;
|
||||||
privateAttrs = lib.optionalAttrs private {
|
privateAttrs = lib.optionalAttrs private {
|
||||||
netrcPhase = ''
|
netrcPhase = ''
|
||||||
if [ -z "''$${varBase}USERNAME" -o -z "''$${varBase}PASSWORD" ]; then
|
if [ -z "''$${varBase}USERNAME" -o -z "''$${varBase}PASSWORD" ]; then
|
||||||
|
@ -26,8 +28,14 @@ let
|
||||||
'';
|
'';
|
||||||
netrcImpureEnvVars = [ "${varBase}USERNAME" "${varBase}PASSWORD" ];
|
netrcImpureEnvVars = [ "${varBase}USERNAME" "${varBase}PASSWORD" ];
|
||||||
};
|
};
|
||||||
fetcherArgs = (if fetchSubmodules
|
fetcherArgs = (if useFetchGit
|
||||||
then { inherit rev fetchSubmodules; url = "${baseUrl}.git"; }
|
then {
|
||||||
|
inherit rev deepClone fetchSubmodules; url = "${baseUrl}.git";
|
||||||
|
} // lib.optionalAttrs (leaveDotGit != null) { inherit leaveDotGit; }
|
||||||
else ({ url = "${baseUrl}/archive/${rev}.tar.gz"; } // privateAttrs)
|
else ({ url = "${baseUrl}/archive/${rev}.tar.gz"; } // privateAttrs)
|
||||||
) // passthruAttrs // { inherit name; };
|
) // passthruAttrs // { inherit name; };
|
||||||
in fetcher fetcherArgs // { meta.homepage = baseUrl; inherit rev; }
|
in
|
||||||
|
|
||||||
|
assert private -> !useFetchGit;
|
||||||
|
|
||||||
|
fetcher fetcherArgs // { meta.homepage = baseUrl; inherit rev; }
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
buildDunePackage rec {
|
buildDunePackage rec {
|
||||||
pname = "qcheck-core";
|
pname = "qcheck-core";
|
||||||
version = "0.16";
|
version = "0.17";
|
||||||
|
|
||||||
useDune2 = true;
|
useDune2 = true;
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@ buildDunePackage rec {
|
||||||
owner = "c-cube";
|
owner = "c-cube";
|
||||||
repo = "qcheck";
|
repo = "qcheck";
|
||||||
rev = version;
|
rev = version;
|
||||||
sha256 = "1s5dpqj8zvd3wr2w3fp4wb6yc57snjpxzzfv9fb6l9qgigswwjdr";
|
sha256 = "0qfyqhfg98spmfci9z6f527a16gwjnx2lrbbgw67p37ys5acrfar";
|
||||||
};
|
};
|
||||||
|
|
||||||
meta = {
|
meta = {
|
||||||
|
|
|
@ -21,14 +21,18 @@ buildDunePackage rec {
|
||||||
})
|
})
|
||||||
];
|
];
|
||||||
|
|
||||||
# disable remaining broken tests, see
|
# 1. disable remaining broken tests, see
|
||||||
# https://github.com/andrenth/ocaml-stdint/issues/59
|
# https://github.com/andrenth/ocaml-stdint/issues/59
|
||||||
|
# 2. fix tests to liberal test range
|
||||||
|
# https://github.com/andrenth/ocaml-stdint/pull/61
|
||||||
postPatch = ''
|
postPatch = ''
|
||||||
substituteInPlace tests/stdint_test.ml \
|
substituteInPlace tests/stdint_test.ml \
|
||||||
--replace 'test "An integer should perform left-shifts correctly"' \
|
--replace 'test "An integer should perform left-shifts correctly"' \
|
||||||
'skip "An integer should perform left-shifts correctly"' \
|
'skip "An integer should perform left-shifts correctly"' \
|
||||||
--replace 'test "Logical shifts must not sign-extend"' \
|
--replace 'test "Logical shifts must not sign-extend"' \
|
||||||
'skip "Logical shifts must not sign-extend"'
|
'skip "Logical shifts must not sign-extend"' \
|
||||||
|
--replace 'let pos_int = QCheck.map_same_type abs in_range' \
|
||||||
|
'let pos_int = QCheck.int_range 0 maxi'
|
||||||
'';
|
'';
|
||||||
|
|
||||||
doCheck = true;
|
doCheck = true;
|
||||||
|
|
|
@ -15,16 +15,16 @@
|
||||||
|
|
||||||
rustPlatform.buildRustPackage rec {
|
rustPlatform.buildRustPackage rec {
|
||||||
pname = "nushell";
|
pname = "nushell";
|
||||||
version = "0.27.0";
|
version = "0.27.1";
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
src = fetchFromGitHub {
|
||||||
owner = pname;
|
owner = pname;
|
||||||
repo = pname;
|
repo = pname;
|
||||||
rev = version;
|
rev = version;
|
||||||
sha256 = "sha256-OesIOL5jn5a3yvOSayMXmZQK9XpYxspOvDvZ6OY5JD4=";
|
sha256 = "sha256-Ms3ofPU7pd1qOxTJ7jImT2DawTcFLeI7Fi+xihsWhKY=";
|
||||||
};
|
};
|
||||||
|
|
||||||
cargoSha256 = "sha256-YFtpg5IXhWJmBtX79MIBme4SKOoq+13UakvAJnTzJFo=";
|
cargoSha256 = "sha256-cJ+P/AaptZGOyjIu+66M1/rMYpVPFZGQDPeakUws3CQ=";
|
||||||
|
|
||||||
nativeBuildInputs = [ pkg-config ]
|
nativeBuildInputs = [ pkg-config ]
|
||||||
++ lib.optionals (withStableFeatures && stdenv.isLinux) [ python3 ];
|
++ lib.optionals (withStableFeatures && stdenv.isLinux) [ python3 ];
|
||||||
|
|
|
@ -4,12 +4,12 @@
|
||||||
}:
|
}:
|
||||||
mkDerivation {
|
mkDerivation {
|
||||||
pname = "nix-output-monitor";
|
pname = "nix-output-monitor";
|
||||||
version = "1.0.1.0";
|
version = "1.0.1.1";
|
||||||
src = fetchFromGitHub {
|
src = fetchFromGitHub {
|
||||||
owner = "maralorn";
|
owner = "maralorn";
|
||||||
repo = "nix-output-monitor";
|
repo = "nix-output-monitor";
|
||||||
sha256 = "10a3sn5isdb9q13yzdclng35jwfaf4lxrkdxwbhwms1k2ll08qk6";
|
sha256 = "1wi1gsl5q1sy7k6k5wxhwpwzki7rghhbsyzm84hnw6h93w6401ax";
|
||||||
rev = "1.0.1.0";
|
rev = "v1.0.1.1";
|
||||||
};
|
};
|
||||||
isLibrary = true;
|
isLibrary = true;
|
||||||
isExecutable = true;
|
isExecutable = true;
|
||||||
|
|
|
@ -2,16 +2,16 @@
|
||||||
|
|
||||||
rustPlatform.buildRustPackage rec {
|
rustPlatform.buildRustPackage rec {
|
||||||
pname = "jwt-cli";
|
pname = "jwt-cli";
|
||||||
version = "3.3.0";
|
version = "4.0.0";
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
src = fetchFromGitHub {
|
||||||
owner = "mike-engel";
|
owner = "mike-engel";
|
||||||
repo = pname;
|
repo = pname;
|
||||||
rev = version;
|
rev = version;
|
||||||
sha256 = "09zi55ffkhsckvqj84xnxn9bgfkrj9wnzqbh9hfsxzbk4xy7fc2h";
|
sha256 = "sha256-82Le0kdt/fnSQwsRRYHy4Jv9rsCPGf5dIWmoZE2cPxY=";
|
||||||
};
|
};
|
||||||
|
|
||||||
cargoSha256 = "1k13pw202fr5mvd0ys39n3dxwcl3sd01j6izfb28k06b6pav3wc8";
|
cargoSha256 = "sha256-nk4nrsePiUirVPoOPehCOf5ZoGVj3jy7PnSZENnpcaM=";
|
||||||
|
|
||||||
buildInputs = lib.optional stdenv.isDarwin Security;
|
buildInputs = lib.optional stdenv.isDarwin Security;
|
||||||
|
|
||||||
|
|
|
@ -21568,8 +21568,9 @@ in
|
||||||
claws-mail = callPackage ../applications/networking/mailreaders/claws-mail {
|
claws-mail = callPackage ../applications/networking/mailreaders/claws-mail {
|
||||||
inherit (xorg) libSM;
|
inherit (xorg) libSM;
|
||||||
};
|
};
|
||||||
claws-mail-gtk3 = callPackage ../applications/networking/mailreaders/claws-mail/gtk3.nix {
|
claws-mail-gtk3 = callPackage ../applications/networking/mailreaders/claws-mail {
|
||||||
inherit (xorg) libSM;
|
inherit (xorg) libSM;
|
||||||
|
useGtk3 = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
clfswm = callPackage ../applications/window-managers/clfswm { };
|
clfswm = callPackage ../applications/window-managers/clfswm { };
|
||||||
|
|
Loading…
Reference in a new issue