added modules for qFlipper, ChameleonUltraGUI, and AngryOxide

ChameleonUltraGUI and AngryOxide also had derivations written to package them
This commit is contained in:
Emile Clark-Boman 2025-05-11 22:29:40 +10:00
parent c626227f55
commit 3bc320cc6a
12 changed files with 1082 additions and 3 deletions

2
NEW_TODO Normal file
View file

@ -0,0 +1,2 @@
- [ ] True using `gitHashes` argument instead of patching?

View file

@ -459,6 +459,8 @@ in {
fish.enable = true;
bash = {
completion.enable = true;
interactiveShellInit = ''
if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]]
then

View file

@ -42,7 +42,7 @@ in {
networkmanager.enable = true;
firewall.allowedTCPPorts = [
22 # sshd
]
];
};
users = {
@ -80,5 +80,8 @@ in {
];
programs = {
bash = {
completion.enable = true;
};
};
}

View file

@ -1,7 +1,6 @@
{
pkgs,
inputs,
lib,
...
}: let
home-manager = builtins.fetchTarball {
@ -16,6 +15,10 @@ in {
../modules/steam.nix
../modules/obsidian.nix
../modules/angryoxide.nix
../modules/flipperzero.nix
../modules/chameleonultragui.nix
];
programs.spicetify = let
@ -230,6 +233,8 @@ in {
doggo
tldr
btop
eza
ripgrep
# TODO: once upgraded past Nix-24.07 this line won't be necessary (I think)
# helix will support nixd by default
@ -241,6 +246,7 @@ in {
git-filter-repo
brightnessctl
acpi
upower
vim
powertop
gcc
@ -270,6 +276,8 @@ in {
# cause it isn't POSIX compliant, so instead Bash is my login and
# will just exec fish (^-^)
bash = {
completion.enable = true;
interactiveShellInit = ''
if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]]
then

View file

@ -0,0 +1,5 @@
{pkgs, ...}: {
environment.systemPackages = with pkgs; [
(callPackage ../packages/angryoxide {})
];
}

View file

@ -0,0 +1,5 @@
{pkgs, ...}: {
environment.systemPackages = with pkgs; [
(callPackage ../packages/chameleonultragui {})
];
}

View file

@ -0,0 +1,6 @@
{pkgs, ...}: {
environment.systemPackages = with pkgs; [
# flipper zero desktop app
qflipper
];
}

View file

@ -273,6 +273,8 @@ in {
# cause it isn't POSIX compliant, so instead Bash is my login and
# will just exec fish (^-^)
bash = {
completion.enable = true;
interactiveShellInit = ''
if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]]
then

5
hosts/packages/README Normal file
View file

@ -0,0 +1,5 @@
This directory (`hosts/packages`) contains custom package derivations, and differs
from `hosts/modules/` which contains importable modules for my nixdots.
Often each package I write will have a corresponding module that simply
calls `pkgs.callPackage` to install the derivation to the system environment.

View file

@ -0,0 +1,84 @@
{
pkgs,
lib,
...
}: let
# shared/global properties
angryoxide-owner = "Ragnt";
angryoxide-pname = "AngryOxide";
angryoxide-version = "0.8.32";
angryoxide-meta = {
homepage = "https://github.com/${angryoxide-owner}/${angryoxide-pname}";
license = lib.licenses.gpl3;
maintainers = [lib.maintainers.emileclarkb];
};
# "Vendored LibWifi used in AngryOxide"
angryoxide-libwifi-src = pkgs.fetchFromGitHub {
owner = angryoxide-owner;
repo = "libwifi";
# this specific revision is requested (by rev "e1352..." of AngryOxide)
rev = "71268e1898ad88b8b5d709e186836db417b33e81";
sha256 = "0af9y7bvr3rban6bslsd9smrvibfp1b7d4nfw7wkdxfp49kx6zyr";
};
# Using `mkDerivation` not `buildRustPackage` because
# AngryOxide uses Git submodules for a patched version of "LibWifi",
# and these aren't moved into `/build/source/libs/` for the `buildPhase`.
# Simply fix right? Well no I can't override `buildPhase`...
angryoxide-src = pkgs.stdenv.mkDerivation rec {
pname = "${angryoxide-pname}-source";
version = angryoxide-version;
src = pkgs.fetchFromGitHub {
owner = "Ragnt";
repo = pname;
rev = "e1352c8aad370efa8db69d175686e4353c6002bd";
sha256 = "07nhvy7kp7z4y0fdslv56pw7kz6idcpma42f4hyilrmazjbbjmja";
# clone git submodules (needed for the rust workspace libs)
fetchSubmodules = true;
};
buildPhase = ''
# ensure $out and /libwifi paths exist
mkdir -p $out/libs/libwifi
# copy only the necessary source files
cp Cargo.toml Cargo.lock $out/
cp -r $src/.cargo $src/assets $src/completions $src/libs $src/src $out/
# ensure libwifi submodule is copied to the build environment
cp -r ${angryoxide-libwifi-src}/. $out/libs/libwifi/
'';
installPhase = let
# SOURCE
completionScriptBash = "completions/bash_angry_oxide_completions";
# DESTINATION
completionDirBash = "$out/share/bash-completion/completions";
in ''
# mkdir -p $out/bin
#mkdir $out/bin
#cp target/release/angryoxide $out/bin
# add bash completions
#mkdir -p ${completionDirBash}
#cp ${completionScriptBash} ${completionDirBash}/angryoxide
'';
meta =
{
description = "AngryOxide's source files isolated by (@emileclarkb) into a separate Nix derivation.";
}
// angryoxide-meta;
};
in
pkgs.rustPackages.rustPlatform.buildRustPackage {
pname = angryoxide-pname;
version = angryoxide-version;
src = angryoxide-src;
cargoHash = "sha256-Dxo1iLxl+wn2qAZh3+bf2n00MPE2LlG5boB6iJC/CDA=";
meta =
{
description = "802.11 Attack Tool";
}
// angryoxide-meta;
}

View file

@ -0,0 +1,483 @@
{
pkgs,
lib,
makeDesktopItem,
copyDesktopItems,
...
}:
# ChameleonUltraGUI requires flutter sdk >3.0.0
pkgs.flutter324.buildFlutterApplication
rec {
pname = "ChameleonUltraGUI";
version = "1.1.2";
src = pkgs.fetchFromGitHub {
owner = "GameTec-live";
repo = "ChameleonUltraGUI";
sha256 = "1mb6wkqk6vaamrhflfhsgp5gvqiw2qkvmy7j65abcx7sn5990i27";
rev = "11424abaccb4a010fcbeab9799ae8f675d8afe99";
};
desktopItems = [
(makeDesktopItem {
name = pname;
desktopName = pname;
genericName = pname;
icon = "chameleonultragui";
comment = meta.description;
exec = "chameleonultragui %u";
type = "Application";
terminal = false;
categories = ["Utility"];
keywords = [
"Flutter"
"share"
"files"
"chameleon"
"chameleonultra"
"chameleonlite"
];
})
];
# path to application within fetched sources
sourceRoot = "source/chameleonultragui";
buildInputs = [
pkgs.imagemagick # creating mipmaps for share/icons
pkgs.yj # converting pubspec.lock yaml->json
];
nativeBuildInputs = [
copyDesktopItems
];
buildArguments = ["--release"];
# source files compile with Flutter >3.29.0 but this
# derivation uses 3.24.0 (so we patch for compatability)
postPatch = let
argbPatch = ''
--- general.dart.old 2025-05-11 15:59:51.812132078 +1000
+++ general.dart 2025-05-11 15:58:14.755856407 +1000
@@ -211,7 +211,7 @@
}
String colorToHex(Color color) {
- return '#\''${color.toARGB32().toRadixString(16).padLeft(8, '0').substring(2)}';
+ return '#\''${color.value.toRadixString(16).padLeft(8, '0').substring(2)}';
}
Color hexToColor(String hex) {
'';
in ''
# patch source files using Color.toARGB32 method (not defined in Flutter 3.24)
argbPatch="${argbPatch}"
patch lib/helpers/general.dart <(echo "$argbPatch")
'';
postInstall = ''
# create mipmaps of desktop logo
logoOriginal="assets/logo-color-desktop.png"
for i in 16 32 64 128 256 512; do
res="$i"x"$i"
d="$out"/share/icons/hicolor/"$res"/apps
mkdir -p $d
${pkgs.imagemagick}/bin/magick $logoOriginal -resize $res $d/chameleonultragui.png
done
'';
# Nix doesn't natively have a fromYAML function (so I made this instead)
pubspecLock = let
appRoot = "${src}/chameleonultragui";
# when generating patch files use -u flag and then
# make sure to escape all " characters for Nix string
pubspecLockPatch = ''
--- pubspec.lock.bak2025-05-10 15:42:44.287730979 +1000
+++ pubspec.lock2025-05-10 15:41:23.778480048 +1000
@@ -5,18 +5,23 @@
dependency: transitive
description:
name: _fe_analyzer_shared
- sha256: dc27559385e905ad30838356c5f5d574014ba39872d732111cd07ac0beff4c57
+ sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834
url: \"https://pub.dev\"
source: hosted
- version: \"80.0.0\"
+ version: \"72.0.0\"
+ _macros:
+ dependency: transitive
+ description: dart
+ source: sdk
+ version: \"0.3.2\"
analyzer:
dependency: transitive
description:
name: analyzer
- sha256: \"192d1c5b944e7e53b24b5586db760db934b177d4147c42fbca8c8c5f1eb8d11e\"
+ sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139
url: \"https://pub.dev\"
source: hosted
- version: \"7.3.0\"
+ version: \"6.7.0\"
archive:
dependency: \"direct main\"
description:
@@ -37,26 +42,26 @@
dependency: \"direct main\"
description:
name: async
- sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63
+ sha256: \"947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c\"
url: \"https://pub.dev\"
source: hosted
- version: \"2.12.0\"
+ version: \"2.11.0\"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
- sha256: \"8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea\"
+ sha256: \"6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66\"
url: \"https://pub.dev\"
source: hosted
- version: \"2.1.2\"
+ version: \"2.1.1\"
characters:
dependency: transitive
description:
name: characters
- sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803
+ sha256: \"04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605\"
url: \"https://pub.dev\"
source: hosted
- version: \"1.4.0\"
+ version: \"1.3.0\"
checked_yaml:
dependency: transitive
description:
@@ -77,18 +82,18 @@
dependency: transitive
description:
name: clock
- sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
+ sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
url: \"https://pub.dev\"
source: hosted
- version: \"1.1.2\"
+ version: \"1.1.1\"
collection:
dependency: \"direct main\"
description:
name: collection
- sha256: \"2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76\"
+ sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
url: \"https://pub.dev\"
source: hosted
- version: \"1.19.1\"
+ version: \"1.18.0\"
convert:
dependency: \"direct main\"
description:
@@ -157,10 +162,10 @@
dependency: transitive
description:
name: fake_async
- sha256: \"6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc\"
+ sha256: \"511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78\"
url: \"https://pub.dev\"
source: hosted
- version: \"1.3.2\"
+ version: \"1.3.1\"
ffi:
dependency: \"direct main\"
description:
@@ -196,11 +201,10 @@
file_saver:
dependency: \"direct main\"
description:
- path: \".\"
- ref: fix-windows
- resolved-ref: \"3038d74d5560dcca528423fffd745abf31eb88ae\"
- url: \"https://github.com/Foxushka/file_saver.git\"
- source: git
+ name: file_saver
+ sha256: \"017a127de686af2d2fbbd64afea97052d95f2a0f87d19d25b87e097407bf9c1e\"
+ url: \"https://pub.dev\"
+ source: hosted
version: \"0.2.14\"
fixnum:
dependency: transitive
@@ -234,11 +238,10 @@
flutter_libserialport:
dependency: \"direct main\"
description:
- path: \".\"
- ref: main
- resolved-ref: \"6740aae075505a220a98492910b090824efc7910\"
- url: \"https://github.com/NeariX67/flutter_libserialport.git\"
- source: git
+ name: flutter_libserialport
+ sha256: d193b5ac819db6540d20cc8d20d9f5ec9e3396edb4d2c4a23c97863fa9132336
+ url: \"https://pub.dev\"
+ source: hosted
version: \"0.5.0\"
flutter_lints:
dependency: \"direct dev\"
@@ -347,18 +350,18 @@
dependency: transitive
description:
name: leak_tracker
- sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec
+ sha256: \"3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05\"
url: \"https://pub.dev\"
source: hosted
- version: \"10.0.8\"
+ version: \"10.0.5\"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
- sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573
+ sha256: \"932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806\"
url: \"https://pub.dev\"
source: hosted
- version: \"3.0.9\"
+ version: \"3.0.5\"
leak_tracker_testing:
dependency: transitive
description:
@@ -399,14 +402,22 @@
url: \"https://pub.dev\"
source: hosted
version: \"1.3.0\"
+ macros:
+ dependency: transitive
+ description:
+ name: macros
+ sha256: \"0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536\"
+ url: \"https://pub.dev\"
+ source: hosted
+ version: \"0.1.2-main.4\"
matcher:
dependency: transitive
description:
name: matcher
- sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
+ sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
url: \"https://pub.dev\"
source: hosted
- version: \"0.12.17\"
+ version: \"0.12.16+1\"
material_color_utilities:
dependency: transitive
description:
@@ -419,10 +430,10 @@
dependency: transitive
description:
name: meta
- sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
+ sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
url: \"https://pub.dev\"
source: hosted
- version: \"1.16.0\"
+ version: \"1.15.0\"
mobile_scanner:
dependency: \"direct main\"
description:
@@ -467,10 +478,10 @@
dependency: \"direct main\"
description:
name: path
- sha256: \"75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5\"
+ sha256: \"087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af\"
url: \"https://pub.dev\"
source: hosted
- version: \"1.9.1\"
+ version: \"1.9.0\"
path_provider:
dependency: transitive
description:
@@ -723,15 +734,15 @@
dependency: transitive
description: flutter
source: sdk
- version: \"0.0.0\"
+ version: \"0.0.99\"
source_span:
dependency: transitive
description:
name: source_span
- sha256: \"254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c\"
+ sha256: \"53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c\"
url: \"https://pub.dev\"
source: hosted
- version: \"1.10.1\"
+ version: \"1.10.0\"
sprintf:
dependency: transitive
description:
@@ -744,42 +755,42 @@
dependency: transitive
description:
name: stack_trace
- sha256: \"8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1\"
+ sha256: \"73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b\"
url: \"https://pub.dev\"
source: hosted
- version: \"1.12.1\"
+ version: \"1.11.1\"
stream_channel:
dependency: transitive
description:
name: stream_channel
- sha256: \"969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d\"
+ sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
url: \"https://pub.dev\"
source: hosted
- version: \"2.1.4\"
+ version: \"2.1.2\"
string_scanner:
dependency: transitive
description:
name: string_scanner
- sha256: \"921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43\"
+ sha256: \"556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde\"
url: \"https://pub.dev\"
source: hosted
- version: \"1.4.1\"
+ version: \"1.2.0\"
term_glyph:
dependency: transitive
description:
name: term_glyph
- sha256: \"7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e\"
+ sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
url: \"https://pub.dev\"
source: hosted
- version: \"1.2.2\"
+ version: \"1.2.1\"
test_api:
dependency: transitive
description:
name: test_api
- sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd
+ sha256: \"5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb\"
url: \"https://pub.dev\"
source: hosted
- version: \"0.7.4\"
+ version: \"0.7.2\"
typed_data:
dependency: transitive
description:
@@ -855,12 +866,11 @@
usb_serial:
dependency: \"direct main\"
description:
- path: \".\"
- ref: fix-usbserial
- resolved-ref: \"9fcbacc92bec19ea02d33a40d9f39e45d19cf637\"
- url: \"https://github.com/Foxushka/usbserial.git\"
- source: git
- version: \"0.5.1\"
+ name: usb_serial
+ sha256: a605a600e34e7f28d4e80851ca3999ef747e42e406138887b8a88b8c382a8b07
+ url: \"https://pub.dev\"
+ source: hosted
+ version: \"0.5.2\"
uuid:
dependency: \"direct main\"
description:
@@ -881,10 +891,10 @@
dependency: transitive
description:
name: vm_service
- sha256: \"0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14\"
+ sha256: \"5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d\"
url: \"https://pub.dev\"
source: hosted
- version: \"14.3.1\"
+ version: \"14.2.5\"
wakelock_plus:
dependency: \"direct main\"
description:
@@ -958,5 +968,5 @@
source: hosted
version: \"2.2.1\"
sdks:
- dart: \">=3.7.0-0 <4.0.0\"
+ dart: \">=3.5.0 <4.0.0\"
flutter: \">=3.24.0\"
'';
in
builtins.fromJSON
(
builtins.readFile (pkgs.runCommand "${pname}-buildenv" {
inputs = [
# DEBUG (both lines commented)
#pkgs.flutter324 # ChameleonUltraGUI requires sdk >3.0.0
#pkgs.yj
];
} ''
# copy source files to a temporary path to rebuild the lockfile
buildPath=$(mktemp -d)
cp -r "${appRoot}/." "$buildPath/"
outPubspecLock="$buildPath/pubspec.lock"
# MUST define variables to use multiline Nix string in bash scripting
pubspecLockPatch="${pubspecLockPatch}"
# apply the pubspec.yaml patch and regenerate lock file
# (create a temporary home directory for flutter to play in)
#(cd $buildPath && chmod -R +w . \
# && patch ./pubspec.yaml <(echo "$pubspecYamlPatch") \
# && export HOME=$(mktemp -d) \
# && flutter --disable-analytics \
# && flutter config --no-cli-animations \
# && ${pkgs.flutter}/bin/flutter pub get)
# patch the lockfile
chmod +w $outPubspecLock
patch $outPubspecLock <(echo "$pubspecLockPatch")
# convert new lockfile to json and return
${pkgs.yj}/bin/yj < "$buildPath/pubspec.lock" > $out
'')
);
# TODO: try this instead of patching
# gitHashes = {
# dartssh2 = "sha256-2pypKwurziwGLZYuGaxlS2lzN3UvJp3bRTvvYYxEqRI=";
# hotkey_manager_linux = "sha256-aO0h94YZvgV/ggVupNw8GjyZsnXrq3qTHRDtuhNv3oI=";
# system_info2 = "sha256-fly7E2vG+bQ/+QGzXk+DYba73RZccltdW2LpZGDKX60=";
# tray_menu = "sha256-riiAiBEms+9ARog8i+MR1fto1Yqx+gwbBWyNbNq6VTM=";
# window_size = "sha256-71PqQzf+qY23hTJvcm0Oye8tng3Asr42E2vfF1nBmVA=";
# xterm = "sha256-h8vIonTPUVnNqZPk/A4ZV7EYCMyM0rrErL9ZOMe4ZBE=";
# };
meta = with lib; {
description = "A GUI for the Chameleon Ultra written in Flutter for crossplatform";
homepage = "https://github.com/GameTec-live/ChameleonUltraGUI";
license = licenses.gpl3;
maintainers = [maintainers.emileclarkb];
platforms = platforms.linux;
};
}
# find /nix/store -type f -print 2>/dev/null | rg "share/applications"
# NOTE: this command will show that there the desktop file was generated
# at some point. just not anymore??
# NOTE2: read over ~/workshop/packaging/nixpkgs-24.11/pkgs/build-support/make-desktopitem/default.nix
# and see exactly how makeDesktopItem is defined!
# perhaps the item is added to the build environment but not the output?
# NOTE: see how it builds derivations for the desktop and makes the desktop items?
# (every time I build it does actually make the desktop items)
# HOWEVER I just dont think they're being copied over...
# /nix/store/4hqs6dkxqngi6wi95dmizbvmgm7l5cf0-ChameleonUltraGUI.desktop/share/applications/ChameleonUltraGUI.desktop
# /nix/store/869gy031lf243k0x9ir7gmrsfksipca1-ChameleonUltraGUI.desktop/share/applications/ChameleonUltraGUI.desktop
# /nix/store/adqq7slakkhpjc4hln19jd6p22cc9ci6-ChameleonUltraGUI.desktop/share/applications/ChameleonUltraGUI.desktop
# /nix/store/x9fa3na0is70h4ya4dbfsivk4m3mab57-ChameleonUltraGUI.desktop/share/applications/ChameleonUltraGUI.desktop

View file

@ -0,0 +1,474 @@
{
pkgs,
lib,
...
}:
# ChameleonUltraGUI requires flutter sdk >3.0.0
pkgs.flutter324.buildFlutterApplication
(self: {
pname = "ChameleonUltraGUI";
version = "1.1.2";
src = pkgs.fetchFromGitHub {
owner = "GameTec-live";
repo = "ChameleonUltraGUI";
sha256 = "1mb6wkqk6vaamrhflfhsgp5gvqiw2qkvmy7j65abcx7sn5990i27";
rev = "11424abaccb4a010fcbeab9799ae8f675d8afe99";
};
desktopItems = [
(pkgs.makeDesktopItem {
name = self.pname;
desktopName = "Chameleon Ultra GUI";
icon = self.pname;
comment = self.meta.description;
exec = "chameleonultragui";
terminal = false;
categories = [
"Utility"
];
})
];
# path to application within fetched sources
sourceRoot = "source/chameleonultragui";
buildInputs = [
pkgs.imagemagick # creating mipmaps for share/icons
pkgs.yj # converting pubspec.lock yaml->json
];
buildArguments = ["--release"];
# source files compile with Flutter >3.29.0 but this
# derivation uses 3.24.0 (so we patch for compatability)
postPatch = let
argbPatch = ''
--- general.dart.old 2025-05-11 15:59:51.812132078 +1000
+++ general.dart 2025-05-11 15:58:14.755856407 +1000
@@ -211,7 +211,7 @@
}
String colorToHex(Color color) {
- return '#\''${color.toARGB32().toRadixString(16).padLeft(8, '0').substring(2)}';
+ return '#\''${color.value.toRadixString(16).padLeft(8, '0').substring(2)}';
}
Color hexToColor(String hex) {
'';
in ''
# patch source files using Color.toARGB32 method (not defined in Flutter 3.24)
argbPatch="${argbPatch}"
patch lib/helpers/general.dart <(echo "$argbPatch")
'';
# installPhase = ''
# runHook preInstall
# # create mipmaps of desktop logo
# logoOriginal="assets/logo-color-desktop.png"
# for i in 16 32 64 128 256 512; do
# res="$i"x"$i"
# logoOut="$out"/share/icons/hicolor/"$res"/apps
# mkdir -p $logoOut
# ${pkgs.imagemagick}/bin/magick $logoOriginal -resize $res $logoOut/${pname}.png
# done
# runHook postInstall
# '';
# Nix doesn't natively have a fromYAML function (so I made this instead)
pubspecLock = let
appRoot = "${self.src}/chameleonultragui";
# when generating patch files use -u flag and then
# make sure to escape all " characters for Nix string
pubspecLockPatch = ''
--- pubspec.lock.bak2025-05-10 15:42:44.287730979 +1000
+++ pubspec.lock2025-05-10 15:41:23.778480048 +1000
@@ -5,18 +5,23 @@
dependency: transitive
description:
name: _fe_analyzer_shared
- sha256: dc27559385e905ad30838356c5f5d574014ba39872d732111cd07ac0beff4c57
+ sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834
url: \"https://pub.dev\"
source: hosted
- version: \"80.0.0\"
+ version: \"72.0.0\"
+ _macros:
+ dependency: transitive
+ description: dart
+ source: sdk
+ version: \"0.3.2\"
analyzer:
dependency: transitive
description:
name: analyzer
- sha256: \"192d1c5b944e7e53b24b5586db760db934b177d4147c42fbca8c8c5f1eb8d11e\"
+ sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139
url: \"https://pub.dev\"
source: hosted
- version: \"7.3.0\"
+ version: \"6.7.0\"
archive:
dependency: \"direct main\"
description:
@@ -37,26 +42,26 @@
dependency: \"direct main\"
description:
name: async
- sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63
+ sha256: \"947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c\"
url: \"https://pub.dev\"
source: hosted
- version: \"2.12.0\"
+ version: \"2.11.0\"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
- sha256: \"8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea\"
+ sha256: \"6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66\"
url: \"https://pub.dev\"
source: hosted
- version: \"2.1.2\"
+ version: \"2.1.1\"
characters:
dependency: transitive
description:
name: characters
- sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803
+ sha256: \"04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605\"
url: \"https://pub.dev\"
source: hosted
- version: \"1.4.0\"
+ version: \"1.3.0\"
checked_yaml:
dependency: transitive
description:
@@ -77,18 +82,18 @@
dependency: transitive
description:
name: clock
- sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
+ sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
url: \"https://pub.dev\"
source: hosted
- version: \"1.1.2\"
+ version: \"1.1.1\"
collection:
dependency: \"direct main\"
description:
name: collection
- sha256: \"2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76\"
+ sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
url: \"https://pub.dev\"
source: hosted
- version: \"1.19.1\"
+ version: \"1.18.0\"
convert:
dependency: \"direct main\"
description:
@@ -157,10 +162,10 @@
dependency: transitive
description:
name: fake_async
- sha256: \"6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc\"
+ sha256: \"511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78\"
url: \"https://pub.dev\"
source: hosted
- version: \"1.3.2\"
+ version: \"1.3.1\"
ffi:
dependency: \"direct main\"
description:
@@ -196,11 +201,10 @@
file_saver:
dependency: \"direct main\"
description:
- path: \".\"
- ref: fix-windows
- resolved-ref: \"3038d74d5560dcca528423fffd745abf31eb88ae\"
- url: \"https://github.com/Foxushka/file_saver.git\"
- source: git
+ name: file_saver
+ sha256: \"017a127de686af2d2fbbd64afea97052d95f2a0f87d19d25b87e097407bf9c1e\"
+ url: \"https://pub.dev\"
+ source: hosted
version: \"0.2.14\"
fixnum:
dependency: transitive
@@ -234,11 +238,10 @@
flutter_libserialport:
dependency: \"direct main\"
description:
- path: \".\"
- ref: main
- resolved-ref: \"6740aae075505a220a98492910b090824efc7910\"
- url: \"https://github.com/NeariX67/flutter_libserialport.git\"
- source: git
+ name: flutter_libserialport
+ sha256: d193b5ac819db6540d20cc8d20d9f5ec9e3396edb4d2c4a23c97863fa9132336
+ url: \"https://pub.dev\"
+ source: hosted
version: \"0.5.0\"
flutter_lints:
dependency: \"direct dev\"
@@ -347,18 +350,18 @@
dependency: transitive
description:
name: leak_tracker
- sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec
+ sha256: \"3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05\"
url: \"https://pub.dev\"
source: hosted
- version: \"10.0.8\"
+ version: \"10.0.5\"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
- sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573
+ sha256: \"932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806\"
url: \"https://pub.dev\"
source: hosted
- version: \"3.0.9\"
+ version: \"3.0.5\"
leak_tracker_testing:
dependency: transitive
description:
@@ -399,14 +402,22 @@
url: \"https://pub.dev\"
source: hosted
version: \"1.3.0\"
+ macros:
+ dependency: transitive
+ description:
+ name: macros
+ sha256: \"0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536\"
+ url: \"https://pub.dev\"
+ source: hosted
+ version: \"0.1.2-main.4\"
matcher:
dependency: transitive
description:
name: matcher
- sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
+ sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
url: \"https://pub.dev\"
source: hosted
- version: \"0.12.17\"
+ version: \"0.12.16+1\"
material_color_utilities:
dependency: transitive
description:
@@ -419,10 +430,10 @@
dependency: transitive
description:
name: meta
- sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
+ sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
url: \"https://pub.dev\"
source: hosted
- version: \"1.16.0\"
+ version: \"1.15.0\"
mobile_scanner:
dependency: \"direct main\"
description:
@@ -467,10 +478,10 @@
dependency: \"direct main\"
description:
name: path
- sha256: \"75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5\"
+ sha256: \"087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af\"
url: \"https://pub.dev\"
source: hosted
- version: \"1.9.1\"
+ version: \"1.9.0\"
path_provider:
dependency: transitive
description:
@@ -723,15 +734,15 @@
dependency: transitive
description: flutter
source: sdk
- version: \"0.0.0\"
+ version: \"0.0.99\"
source_span:
dependency: transitive
description:
name: source_span
- sha256: \"254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c\"
+ sha256: \"53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c\"
url: \"https://pub.dev\"
source: hosted
- version: \"1.10.1\"
+ version: \"1.10.0\"
sprintf:
dependency: transitive
description:
@@ -744,42 +755,42 @@
dependency: transitive
description:
name: stack_trace
- sha256: \"8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1\"
+ sha256: \"73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b\"
url: \"https://pub.dev\"
source: hosted
- version: \"1.12.1\"
+ version: \"1.11.1\"
stream_channel:
dependency: transitive
description:
name: stream_channel
- sha256: \"969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d\"
+ sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
url: \"https://pub.dev\"
source: hosted
- version: \"2.1.4\"
+ version: \"2.1.2\"
string_scanner:
dependency: transitive
description:
name: string_scanner
- sha256: \"921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43\"
+ sha256: \"556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde\"
url: \"https://pub.dev\"
source: hosted
- version: \"1.4.1\"
+ version: \"1.2.0\"
term_glyph:
dependency: transitive
description:
name: term_glyph
- sha256: \"7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e\"
+ sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
url: \"https://pub.dev\"
source: hosted
- version: \"1.2.2\"
+ version: \"1.2.1\"
test_api:
dependency: transitive
description:
name: test_api
- sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd
+ sha256: \"5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb\"
url: \"https://pub.dev\"
source: hosted
- version: \"0.7.4\"
+ version: \"0.7.2\"
typed_data:
dependency: transitive
description:
@@ -855,12 +866,11 @@
usb_serial:
dependency: \"direct main\"
description:
- path: \".\"
- ref: fix-usbserial
- resolved-ref: \"9fcbacc92bec19ea02d33a40d9f39e45d19cf637\"
- url: \"https://github.com/Foxushka/usbserial.git\"
- source: git
- version: \"0.5.1\"
+ name: usb_serial
+ sha256: a605a600e34e7f28d4e80851ca3999ef747e42e406138887b8a88b8c382a8b07
+ url: \"https://pub.dev\"
+ source: hosted
+ version: \"0.5.2\"
uuid:
dependency: \"direct main\"
description:
@@ -881,10 +891,10 @@
dependency: transitive
description:
name: vm_service
- sha256: \"0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14\"
+ sha256: \"5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d\"
url: \"https://pub.dev\"
source: hosted
- version: \"14.3.1\"
+ version: \"14.2.5\"
wakelock_plus:
dependency: \"direct main\"
description:
@@ -958,5 +968,5 @@
source: hosted
version: \"2.2.1\"
sdks:
- dart: \">=3.7.0-0 <4.0.0\"
+ dart: \">=3.5.0 <4.0.0\"
flutter: \">=3.24.0\"
'';
in
builtins.fromJSON
(
builtins.readFile (pkgs.runCommand "${self.pname}-buildenv" {
inputs = [
# DEBUG (both lines commented)
#pkgs.flutter324 # ChameleonUltraGUI requires sdk >3.0.0
#pkgs.yj
];
} ''
# copy source files to a temporary path to rebuild the lockfile
buildPath=$(mktemp -d)
cp -r "${appRoot}/." "$buildPath/"
outPubspecLock="$buildPath/pubspec.lock"
# MUST define variables to use multiline Nix string in bash scripting
pubspecLockPatch="${pubspecLockPatch}"
# apply the pubspec.yaml patch and regenerate lock file
# (create a temporary home directory for flutter to play in)
#(cd $buildPath && chmod -R +w . \
# && patch ./pubspec.yaml <(echo "$pubspecYamlPatch") \
# && export HOME=$(mktemp -d) \
# && flutter --disable-analytics \
# && flutter config --no-cli-animations \
# && ${pkgs.flutter}/bin/flutter pub get)
# patch the lockfile
chmod +w $outPubspecLock
patch $outPubspecLock <(echo "$pubspecLockPatch")
# convert new lockfile to json and return
${pkgs.yj}/bin/yj < "$buildPath/pubspec.lock" > $out
'')
);
# TODO: try this instead of patching
# gitHashes = {
# dartssh2 = "sha256-2pypKwurziwGLZYuGaxlS2lzN3UvJp3bRTvvYYxEqRI=";
# hotkey_manager_linux = "sha256-aO0h94YZvgV/ggVupNw8GjyZsnXrq3qTHRDtuhNv3oI=";
# system_info2 = "sha256-fly7E2vG+bQ/+QGzXk+DYba73RZccltdW2LpZGDKX60=";
# tray_menu = "sha256-riiAiBEms+9ARog8i+MR1fto1Yqx+gwbBWyNbNq6VTM=";
# window_size = "sha256-71PqQzf+qY23hTJvcm0Oye8tng3Asr42E2vfF1nBmVA=";
# xterm = "sha256-h8vIonTPUVnNqZPk/A4ZV7EYCMyM0rrErL9ZOMe4ZBE=";
# };
meta = with lib; {
description = "A GUI for the Chameleon Ultra written in Flutter for crossplatform";
homepage = "https://github.com/GameTec-live/ChameleonUltraGUI";
license = licenses.gpl3;
maintainers = [maintainers.emileclarkb];
platforms = platforms.linux;
};
})
.overrideAttrs (
previousAttrs: {
installPhase =
previousAttrs.installPhase
+ ''
# create mipmaps of desktop logo
logoOriginal="assets/logo-color-desktop.png"
for i in 16 32 64 128 256 512; do
res="$i"x"$i"
logoOut="$out"/share/icons/hicolor/"$res"/apps
mkdir -p $logoOut
${pkgs.imagemagick}/bin/magick $logoOriginal -resize $res $logoOut/${previousAttrs.pname}.png
done
'';
}
)