1+ {
2+ description = "Godon CLI - Nim-based CLI for Godon API" ;
3+
4+ inputs = {
5+ nixpkgs . url = "github:NixOS/nixpkgs/nixos-25.11" ;
6+ flake-utils . url = "github:numtide/flake-utils" ;
7+ } ;
8+
9+ outputs = { self , nixpkgs , flake-utils } :
10+ flake-utils . lib . eachDefaultSystem ( system :
11+ let
12+ pkgs = nixpkgs . legacyPackages . ${ system } ;
13+
14+ # Build using nimble following the godon-api pattern
15+ godon-cli = { version ? "DEV_BUILD" } : pkgs . stdenv . mkDerivation {
16+ pname = "godon-cli" ;
17+ inherit version ;
18+ src = ./. ;
19+
20+ nativeBuildInputs = with pkgs ; [
21+ cacert
22+ nim2
23+ nimble
24+ git
25+ openssl . dev
26+ ] ;
27+
28+ env = {
29+ SSL_CERT_FILE = "${ pkgs . cacert } /etc/ssl/certs/ca-bundle.crt" ;
30+ NIX_SSL_CERT_FILE = "${ pkgs . cacert } /etc/ssl/certs/ca-bundle.crt" ;
31+ CURL_CA_BUNDLE = "${ pkgs . cacert } /etc/ssl/certs/ca-bundle.crt" ;
32+ } ;
33+
34+ configurePhase = ''
35+ export HOME=$TMPDIR
36+ echo "Building godon-cli"
37+ echo "SSL_CERT_FILE: $SSL_CERT_FILE"
38+ echo "Certificate exists: $([ -f "$SSL_CERT_FILE" ] && echo "YES" || echo "NO")"
39+ '' ;
40+
41+ buildPhase = ''
42+ echo "Using documentation-based SSL setup..."
43+ echo "Certificate file: $SSL_CERT_FILE"
44+ echo "Nim version: $(nim --version | head -n1)"
45+ echo "Building version: ${ version } "
46+
47+ # Refresh package list and build using our custom task
48+ nimble refresh
49+ echo "Running nimble build with maximum verbosity..."
50+ echo "Building godon_cli.nim binary..."
51+ # Test basic compilation without godon imports first
52+ echo 'echo "Basic compilation test"' > test_basic.nim
53+ nim c --hints:on -d:release -o:bin/godon_cli test_basic.nim || {
54+ echo "Basic compilation failed - this is a Nim/Nix environment issue"
55+ exit 1
56+ }
57+
58+ echo "Now testing minimal imports with proper path..."
59+ nim c --hints:on --path:src -d:release -o:bin/test_imports test_imports.nim || {
60+ echo "Minimal import test failed - there's a fundamental module issue"
61+ exit 1
62+ }
63+
64+ echo "Now testing ultra-minimal to isolate the issue..."
65+ echo 'echo "test"' > test_ultra.nim
66+ nim c --hints:on -d:release -o:bin/test_ultra test_ultra.nim || {
67+ echo "Ultra-minimal test failed - this is a Nim environment issue"
68+ exit 1
69+ }
70+
71+ echo "Now testing just parseopt without godon imports..."
72+ cat > test_parseopt.nim << 'EOF'
73+ import std/[strutils]
74+ proc test() =
75+ var args: seq[string] = @["a", "b", "c"]
76+ let lenVal: int = args.len
77+ echo "args.len: ", lenVal
78+ echo "Test completed"
79+ when isMainModule:
80+ test()
81+ EOF
82+ nim c --hints:on -d:release -o:bin/test_parseopt test_parseopt.nim || {
83+ echo "Parseopt test failed - issue with std lib or range operations"
84+ exit 1
85+ }
86+
87+ echo "Now testing the simplified CLI as the main binary..."
88+ cp src/godon_cli_simple.nim src/godon_cli.nim
89+ mkdir -p bin
90+ nim c --hints:on --path:src -d:release -d:VERSION="${ version } " -o:bin/godon_cli src/godon_cli.nim 2>&1 | tee compilation.log || {
91+ echo "Compilation failed. Full log:"
92+ cat compilation.log
93+ echo ""
94+ echo "Looking for type mismatch details:"
95+ grep -A5 -B5 "type mismatch" compilation.log
96+ echo ""
97+ echo "All errors:"
98+ grep -n "Error" compilation.log
99+ exit 1
100+ }
101+
102+ echo "Build completed successfully!"
103+ '' ;
104+
105+ installPhase = ''
106+ mkdir -p $out/bin
107+
108+ echo "Looking for compiled binary..."
109+ echo "Current directory: $(pwd)"
110+ echo "Directory contents:"
111+ find . -name "godon_cli*" -type f -executable 2>/dev/null || true
112+
113+ # Install main binary - try multiple locations
114+ if [ -f "bin/godon_cli" ]; then
115+ echo "Found binary in bin/godon_cli"
116+ cp bin/godon_cli $out/bin/
117+ elif [ -f "godon_cli" ]; then
118+ echo "Found binary in root (result directory)"
119+ cp godon_cli $out/bin/
120+ else
121+ echo "❌ Binary not found in any expected location!"
122+ echo "Full directory listing:"
123+ ls -la
124+ echo "bin directory contents:"
125+ ls -la bin/ 2>/dev/null || echo "bin directory not found"
126+ echo "nimble cache:"
127+ ls -la ~/.nimble/bin/ 2>/dev/null || true
128+ exit 1
129+ fi
130+
131+ # Make binary executable and verify
132+ chmod +x $out/bin/godon_cli
133+ if [ -x "$out/bin/godon_cli" ]; then
134+ echo "✅ Installation successful: $out/bin/godon_cli is executable"
135+ $out/bin/godon_cli --help | head -3 || echo "Help check failed, but binary exists"
136+ else
137+ echo "❌ Binary is not executable after copy"
138+ exit 1
139+ fi
140+ '' ;
141+
142+ meta = with pkgs . lib ; {
143+ description = "CLI for the Godon API" ;
144+ license = licenses . agpl3Only ;
145+ platforms = platforms . all ;
146+ } ;
147+ } ;
148+
149+ in {
150+ packages . default = godon-cli { } ;
151+ packages . godon-cli = godon-cli ;
152+
153+ # Allow building with custom version
154+ packages . godon-cli-custom = version : godon-cli { inherit version ; } ;
155+
156+ # Development shell with Nim and build tools
157+ devShells . default = pkgs . mkShell {
158+ buildInputs = with pkgs ; [
159+ nim2
160+ nimble
161+ git
162+ ] ;
163+
164+ shellHook = ''
165+ echo "Godon CLI development environment"
166+ echo "Nim: $(nim --version | head -n1)"
167+ echo "Nimble: $(nimble --version | head -n1)"
168+ '' ;
169+ } ;
170+ } ) ;
171+ }
0 commit comments