BAO2IEK7OO7NITD5SPGG544GKPAYNAIDS4D6BOCXGO5UVER7D67AC {inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";inputs.flake-utils.url = "github:numtide/flake-utils";outputs = { self, nixpkgs, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system: letpkgs = nixpkgs.legacyPackages.${system};in {buildInputs = [];shellHook = '''';};});}devShells.default = pkgs.mkShell {
const std = @import("std");pub fn main(init: std.process.Init) !void {std.debug.print("passed:\n", .{});var it = init.minimal.args.iterate();while (it.next()) |arg| std.debug.print("{} ", .{arg});}test "simple test" {const gpa = std.testing.allocator;var list: std.ArrayList(i32) = .empty;defer list.deinit(gpa); // Try commenting this out and see if zig detects the memory leak!try list.append(gpa, 42);try std.testing.expectEqual(@as(i32, 42), list.pop());}test "fuzz example" {try std.testing.fuzz({}, testOne, .{});}fn testOne(context: void, smith: *std.testing.Smith) !void {_ = context;// Try passing `--fuzz` to `zig build test` and see if it manages to fail this test case!const gpa = std.testing.allocator;var list: std.ArrayList(u8) = .empty;defer list.deinit(gpa);while (!smith.eos()) switch (smith.value(enum { add_data, dup_data })) {.add_data => {const slice = try list.addManyAsSlice(gpa, smith.value(u4));smith.bytes(slice);},.dup_data => {if (list.items.len == 0) continue;if (list.items.len > std.math.maxInt(u32)) return error.SkipZigTest;const len = smith.valueRangeAtMost(u32, 1, @min(32, list.items.len));const off = smith.valueRangeAtMost(u32, 0, @intCast(list.items.len - len));try list.appendSlice(gpa, list.items[off..][0..len]);try std.testing.expectEqualSlices(u8,list.items[off..][0..len],list.items[list.items.len - len ..],);},};}
{inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";inputs.flake-utils.url = "github:numtide/flake-utils";inputs.zig.url = "github:mitchellh/zig-overlay";outputs = { self, nixpkgs, flake-utils, zig }: flake-utils.lib.eachSystem ["x86_64-linux"] (system: letpkgs = nixpkgs.legacyPackages.${system};in {devShells.default = pkgs.mkShell {buildInputs = [zig.packages.${system}.masterpkgs.zls];shellHook = '''';};});}
const std = @import("std");pub fn build(b: *std.Build) void {const target = b.standardTargetOptions(.{});const optimize = b.standardOptimizeOption(.{});const exe = b.addExecutable(.{.name = "zig",.root_module = b.createModule(.{.root_source_file = b.path("src/main.zig"),.target = target,.optimize = optimize,.imports = &.{},}),});b.installArtifact(exe);const run_step = b.step("run", "Run the app");const run_cmd = b.addRunArtifact(exe);run_step.dependOn(&run_cmd.step);run_cmd.step.dependOn(b.getInstallStep());if (b.args) |args| {run_cmd.addArgs(args);}const exe_tests = b.addTest(.{.root_module = exe.root_module,});const run_exe_tests = b.addRunArtifact(exe_tests);const test_step = b.step("test", "Run tests");test_step.dependOn(&run_exe_tests.step);}
fn main() {println!("Hello, world!");}
{inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";inputs.flake-utils.url = "github:numtide/flake-utils";inputs.rust.url = "github:oxalica/rust-overlay";outputs = { self, nixpkgs, flake-utils, rust }: flake-utils.lib.eachSystem ["x86_64-linux"] (system: letpkgs = nixpkgs.legacyPackages.${system};rust-bin = rust.lib.mkRustBin { } pkgs.buildPackages;in {devShells.default = pkgs.mkShell {buildInputs = [rust-bin.stable.latest.minimalpkgs.rust-analyzer];shellHook = '''';};});}
[package]name = "rust"version = "0.1.0"edition = "2024"[dependencies]
{inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";inputs.flake-utils.url = "github:numtide/flake-utils";outputs = { self, nixpkgs, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system: letpkgs = nixpkgs.legacyPackages.${system};in {devShells.default = pkgs.mkShell {buildInputs = [];shellHook = '''';};});}
{inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";inputs.flake-utils.url = "github:numtide/flake-utils";outputs = { self, nixpkgs, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system: letpkgs = nixpkgs.legacyPackages.${system};in {devShells.default = pkgs.mkShell {buildInputs = with pkgs; [ccachegdb(haskellPackages.ghcWithPackages (p: [p.shake]))];shellHook = '''';};packages.${system}.default = {pname = "pkg"; # passversion = "0.0"; # passsrc = ./.;buildPhase = ''shake install --opt-level=3 --prefix=$out'';};apps.${system}.default = {type = "app";program = "${self.packages.${system}.default}/bin/<app>"; # pass};});}
import Development.Shakeimport Development.Shake.Commandimport Development.Shake.FilePathimport Development.Shake.Utilimport System.IO (readFile)import System.Directory (findExecutable, getCurrentDirectory, removeDirectoryRecursive)import Data.Foldable (asum)import System.Console.GetOptimport Data.Hashable (hash)import System.Environmentimport System.Process (readProcess)import Data.Maybe (listToMaybe, fromMaybe)import Data.Function ((&))flags = fmap (filter (not . null) . lines) . readFilefindExe :: [String] -> IO (Maybe FilePath)findExe cmds = asum <$> mapM findExecutable cmdscdir = "src"incdir = "include"builddir = "_build"data BuildTypes = Default | Test | Bench deriving (Read)data OptLevels = Release | Debug deriving (Read)data Options= BuildType BuildTypes| OptLevel OptLevels| DisableCCACHE| Prefix FilePathoptions :: [OptDescr (Either a Options)]options =[ Option "t" ["build-type"] (ReqArg (Right . BuildType . read) "[default|test|bench]") "", Option "o" ["opt-level"] (ReqArg (Right . OptLevel . read) "[0-3|g]") "", Option "" ["disable-ccache"] (NoArg $ Right DisableCCACHE) "", Option "p" ["prefix"] (ReqArg (Right . Prefix) "/usr/local") ""]main :: IO ()main = shakeArgsWith shakeOptions options $ \opts targets -> pure $ Just $ docwd <- liftIO $ getCurrentDirectorylet proj = takeFileName cwdgitBranch <- liftIO $ readProcess "git" ["branch", "--show-current"] ""inNixShell <- liftIO $ System.Environment.getEnv "IN_NIX_SHELL"cflags <- liftIO $ flags "build/cflags"ldflags <- liftIO $ flags "build/ldflags"optflags <- liftIO $ flags "build/optflags"debugflags <- liftIO $ flags "build/debugflags"optldflags <- liftIO $ flags "build/optldflags"let typeFlag = [a | BuildType a <- opts] & listToMaybe & fromMaybe Defaultlet optFlag = [a | OptLevel a <- opts] & listToMaybe & fromMaybe Debuglet prefix = [a | Prefix a <- opts] & listToMaybe & fromMaybe (error "missing prefix")compile <- doJust cc <- liftIO $ findExe ["clang-21", "clang-20", "clang-19", "clang"]ccache <- liftIO $ findExe ["ccache"]let p DisableCCACHE = Truep _ = Falselet disable_ccache = any p optscase (disable_ccache, ccache) of(False, Just ch) -> return [ch, cc]_ -> return [cc]let typeFlags Default = []typeFlags Test = ["-DTEST_MODE"]typeFlags Bench = ["-DBENCHMARK_MODE"]let optFlags Release = optflagsoptFlags Debug = debugflagslet optLDFlags Release = optldflagsoptLDFlags Debug = debugflagslet compileFlags = cflags ++ typeFlags typeFlag ++ optFlags optFlag ++ ["-I" ++ incdir]let linkFlags = ldflags ++ optLDFlags optFlaglet seed = unwords compile ++ unwords compileFlags ++ unwords linkFlags ++ gitBranch ++ inNixShelllet h = abs $ hash seedlet outDir = builddir </> show hlet target = outDir </> projlet bin = builddir </> projwant targetsphony "all" $ doneed [bin]bin %> \out -> doneed [target]copyFileChanged target outtarget %> \out -> docs <- getDirectoryFiles cdir ["*.c"]let os = [outDir </> c -<.> "o" | c <- map takeFileName cs]need oscmd_ compile "-o" [out] os linkFlagsoutDir </> "*.o" %> \out -> dolet c = cdir </> (takeFileName $ out -<.> "c")let m = out -<.> "m"cmd_ compile "-o" [out] "-c" [c] "-MMD -MF" [m] compileFlagsneededMakefileDependencies mphony "install" $ docopyFileChanged bin (prefix </> "bin" </> proj)phony "clean" $ doliftIO $ removeDirectoryRecursive outDirphony "clean-all" $ doliftIO $ removeDirectoryRecursive builddir
NPROC != nprocMAKEFLAGS += -j$(NPROC)MAKEFLAGS += -r -RDEFAULT_OPTLEVEL := gDEFAULT_PREFIX := /usr/localDEFAULT_TYPE := defaultDEFAULT_USE_CCACHE := yDEFAULT_EMIT_LLVM := nDEFAULT_BUILD_FROM_ASM := n.PHONY: $(shell grep -ho "^[0-9a-z-]\\+:" $(MAKEFILE_LIST) | sed -e "s/://")define ERROR_INVALID_VALUE$(error invalid value for $$($1): expected one of $(or $2,[yn]) but got $($1))endefCLANG21 != command -v clang-21CLANG20 != command -v clang-20CLANG19 != command -v clang-19CLANG != command -v clangCC := $(or $(CLANG21),$(CLANG20),$(CLANG19),$(CLANG),$(error CC not found: install clang (>=19)))USE_CCACHE ?= $(DEFAULT_USE_CCACHE) ## use ccache [yn] (default: y)ifeq ($(strip $(USE_CCACHE)),y)CCACHE != command -v ccacheCC := $(CCACHE) $(CC)else ifeq ($(strip $(USE_CCACHE)),n)else$(call ERROR_INVALID_VALUE,USE_CCACHE)endifPROJECT_NAME := $(notdir $(CURDIR))CDIR := srcINCDIR := includeBUILDDIR := .buildPREFIX ?= $(DEFAULT_PREFIX) ## install prefix (default: /usr/local)OPTLEVEL ?= $(or $(OL), $(DEFAULT_OPTLEVEL)) ## optimization level [0-3|g] (default: g)LOGLEVEL ?= $(or $(LL), $(DEFAULT_LOGLEVEL))TYPE ?= $(or $(T), $(DEFAULT_TYPE)) ## build type [test|bench|default]# compiler flagsCFLAGS != cat build/cflagsOPTFLAGS != cat build/optflags# linker flagsLDFLAGS != cat build/ldflagsOPTLDFLAGS != cat build/optldflagsDEBUGFLAGS != cat build/debugflagsASMFLAGS != cat build/asmflags# Enables macro in the sourceCFLAGS += -DLOGLEVEL=$(LOGLEVEL)ifdef ASANCFLAGS += -fsanitize=$(ASAN)LDFLAGS += -fsanitize=$(ASAN)endififeq ($(MAKECMDGOALS),coverage)CFLAGS += -fprofile-instr-generate -fcoverage-mappingLDFLAGS += -fprofile-instr-generateTYPE := testOPTLEVEL := 0endififeq ($(strip $(TYPE)),test)CFLAGS += -DTEST_MODEelse ifeq ($(strip $(TYPE)),bench)CFLAGS += -DBENCHMARK_MODEelse ifeq ($(strip $(TYPE)),default)else$(call ERROR_INVALID_VALUE,TYPE,[test|bench|default])endififeq ($(strip $(OPTLEVEL)),g)CFLAGS += $(DEBUGFLAGS)LDFLAGS += $(DEBUGFLAGS)RUNNER ?= gdb ## runner (default in debug run: gdb)else ifneq ($(filter 1 2 3,$(OPTLEVEL)),)CFLAGS += $(OPTFLAGS) -O$(OPTLEVEL)LDFLAGS += $(OPTLDFLAGS) -O$(OPTLEVEL)else ifeq ($(strip $(OPTLEVEL)),0)else$(call ERROR_INVALID_VALUE,OPTLEVEL,[0-3|g])endififeq ($(MAKECMDGOALS),profile)CFLAGS += -pgLDFLAGS += -pgLDFLAGS := $(filter-out -s,$(LDFLAGS))endififdef TEST_FILTERCFLAGS += -DTEST_FILTER="\"$(TEST_FILTER)\""endif# generate output pathGITBRANCH != git branch --show-current 2>/dev/nullSEED = $(CC)$(CFLAGS)$(LDFLAGS)$(GITBRANCH)$(IN_NIX_SHELL)HASH != echo '$(SEED)' | md5sum | cut -d' ' -f1OUTDIR := $(BUILDDIR)/$(HASH)TARGET := $(OUTDIR)/$(PROJECT_NAME)EMIT_LLVM ?= $(DEFAULT_EMIT_LLVM) ## use llvmIR instead of asm [yn] (default: n)ifeq ($(strip $(EMIT_LLVM)),y)ASMFLAGS += -emit-llvmASMEXT := llelse ifeq ($(strip $(EMIT_LLVM)),n)ASMEXT := selse$(call ERROR_INVALID_VALUE,EMIT_LLVM)endif# source filesSRCS := $(wildcard $(CDIR)/*.c)OBJS := $(patsubst $(CDIR)/%.c,$(OUTDIR)/%.o,$(SRCS))DEPS := $(OBJS:.o=.d)ASMS := $(OBJS:.o=.$(ASMEXT))# e.g.)# $ make asm OL=3# $ # edit asm files...# $ make BUILD_FROM_ASM=y OL=3BUILD_FROM_ASM ?= $(DEFAULT_BUILD_FROM_ASM) ## use asm instead of c files [yn] (default: n)ifeq ($(strip $(BUILD_FROM_ASM)),y)SRCDIR := $(OUTDIR)SRCEXT := $(ASMEXT)CFLAGS =else ifeq ($(strip $(BUILD_FROM_ASM)),n)SRCDIR := $(CDIR)SRCEXT := celse$(call ERROR_INVALID_VALUE,BUILD_FROM_ASM)endifinclude $(realpath $(DEPS))### build rules.DEFAULT_GOAL := $(TARGET)# link$(TARGET): $(OBJS)$(CC) $(LDFLAGS) $^ -o $@# compile$(OBJS): $(OUTDIR)/%.o: $(SRCDIR)/%.$(SRCEXT) $(OUTDIR)/%.d | $(OUTDIR)/$(CC) $< $(CFLAGS) -c -o $@define DEPFLAGS-MM -MP -MT $1.o -MF $1.dendef$(DEPS): $(OUTDIR)/%.d: $(CDIR)/%.c | $(OUTDIR)/$(CC) $< $(CFLAGS) $(call DEPFLAGS,$(@:.d=))# e.g.) run with valgrind# make run RUNNER=valgrind# e.g.) don't use gdb (default debug RUNNER) in debug run# make run RUNNER=run: $(TARGET) ## run target$(RUNNER) $<# `make run-foo` is same as `make run RUNNER=foo`run-%: $(TARGET)$* $<test: ; $(MAKE) run TYPE=test RUNNER= ## run testasm: $(ASMS) ## generate asm files$(ASMS): $(OUTDIR)/%.$(ASMEXT): $(CDIR)/%.c | $(OUTDIR)/$(CC) $< $(ASMFLAGS) $(CFLAGS) -o $@clean-all: ; rm -rf $(BUILDDIR)# e.g.) remove test build for opt level 3# make clean OPTLEVEL=3 TYPE=testclean:ifneq ($(realpath $(OUTDIR)),)rm -rf $(OUTDIR)endif$(PREFIX)/bin/$(PROJECT_NAME): $(TARGET) | $(PREFIX)/bin/cp $< $@install: $(PREFIX)/bin/$(PROJECT_NAME)uninstall: ; rm $(PREFIX)/bin/$(PROJECT_NAME)doc: doc/Doxyfile ## generate docdoxygen $<doc/Doxyfile: doc/doxygen -g $@fmt: ; clang-format -Werror --dry-run $(SRCS) $(INCDIR)/*.hlint: $(SRCS)clang-tidy $^ -- $(CFLAGS)flawfinder $^cppcheck $^ --enable=all --suppress=missingIncludeSystem -I$(INCDIR)pre-commit: fmt test ## .git/hooks/pre-commitFP ?= /dev/stdoutlog: ## show build flags@echo "Compiler: $(CC)" > $(FP)@echo "CFLAGS: $(CFLAGS)" >> $(FP)@echo "LDFLAGS: $(LDFLAGS)" >> $(FP)@echo "TARGET: $(TARGET)" >> $(FP)@echo "SRCS: $(SRCS)" >> $(FP)@echo "OBJS: $(OBJS)" >> $(FP)@echo "DEPS: $(DEPS)" >> $(FP)info: $(TARGET) ## show target info@echo "target file size:"@size $(TARGET)help: ## show help@echo "$$ make # debug build"@echo "$$ make test # run test"@echo "$$ make run OL=3 # run release build"@echo@echo "build files: .build/HASH/*"@echo@echo "Variables:"@grep -h "^[^\t].* ## " $(MAKEFILE_LIST) \| sed -En "s/^ *([0-9A-Z_]+) .?= .*## (.*)$$/\\1 = \\2/p"@echo@echo "Targets:"@grep -h "^[^\t].* ## " $(MAKEFILE_LIST) \| sed -En "s/^([0-9a-z-]+): .*## (.*)$$/\\1: \\2/p"### llmfileLLMFILE ?= llmfile.txtFILES ?= makefile build.zig Shakefile.hs doc/t.typ doc/readme.typ doc/manual.typDIRS ?= build include srcFILES_IN_DIRS := $(wildcard $(addsuffix /*, $(DIRS)))SORTED_FILES_IN_DIRS := $(sort $(notdir $(basename $(FILES_IN_DIRS))))REAL_PATH_FILES_IN_DIRS := $(foreach f,$(SORTED_FILES_IN_DIRS),$(wildcard */$f.[ch]))LIST_FILES ?= $(FILES) $(REAL_PATH_FILES_IN_DIRS)$(LLMFILE): $(LIST_FILES)echo $^ | sed 's/ /\n/g' > $@echo >> $@ # newline# `head` automatically inserts the file name at the start of the filehead -n 9999 $^ >> $@llmfile: $(LLMFILE) ## for the llm to read### compiledb, = ,LOCAL_CCJ = $(OUTDIR)/compile_commands.jsondefine STRINGIFY$(foreach f,$1,"$f"$,)endef$(LOCAL_CCJ).%: | $(dir $(LOCAL_CCJ))echo '{"arguments":[' > $@echo '"$(lastword $(CC))",' >> $@echo '$(call STRINGIFY,$(CFLAGS))' >> $@echo '$(call STRINGIFY,$(call COMPILEFLAGS,$(OUTDIR)/$*.o))' >> $@echo '"$(SRCDIR)/$*.c"],' >> $@echo '"directory":"$(CURDIR)",' >> $@echo '"file":"$(CURDIR)/$(SRCDIR)/$*.c",' >> $@echo '"output":"$(CURDIR)/$(OUTDIR)/$*.o"},' >> $@$(LOCAL_CCJ): $(addprefix $(LOCAL_CCJ)., $(basename $(notdir $(SRCS))))echo "[" > $@cat $^ >> $@sed -i "\$$s/,$$/]/" $@compile_commands.json: $(LOCAL_CCJ)cp $< $@compiledb: compile_commands.json ## for lsp### coverageCOVDIR ?= $(OUTDIR)/coverage-reportPROFRAW := $(OUTDIR)/default.profrawPROFDATA := $(OUTDIR)/coverage.profdata$(PROFRAW): $(TARGET)LLVM_PROFILE_FILE=$@ ./$<$(PROFDATA): $(PROFRAW)llvm-profdata merge --sparse $< -o $@$(COVDIR): $(PROFDATA)llvm-cov show $(TARGET) --format=html --instr-profile=$< --output-dir=$@BROWSER ?= chacoverage: $(COVDIR) ## report test coverage$(BROWSER) $</index.html### perf$(OUTDIR)/perf.data: $(TARGET)perf record -o $@ -g ./$<perf: $(OUTDIR)/perf.data ## run perf analysisperf report -i $<### profilegmon.out: $(TARGET) ; ./$<$(OUTDIR)/gmon.out: gmon.out | $(OUTDIR)/mv $< $@$(OUTDIR)/profile.txt: $(OUTDIR)/gmon.outgprof $(TARGET) $< > $@profile: $(OUTDIR)/profile.txtless $<### last resort%/: ; mkdir -p $@
{inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";inputs.flake-utils.url = "github:numtide/flake-utils";outputs = { self, nixpkgs, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system: letpkgs = nixpkgs.legacyPackages.${system};in {devShells.default = pkgs.mkShell {buildInputs = with pkgs; [ccachegnumakegdbcppcheckflawfinderdoxygenllvmPackages_21.bintools-unwrappedllvmPackages_21.clangUseLLVMllvmPackages_21.clang-toolsllvmPackages_21.llvm];shellHook = '''';};packages.default = {pname = "pkg"; # passversion = "0.0"; # passsrc = ./.;buildPhase = ''make install OPTLEVEL=3 PREFIX=$out'';};apps.default = {type = "app";program = "${self.packages.${system}.default}/bin/<app>"; # pass};});}
templates.default = {path = ./templates;description = "basic flake";
templates = {default = {path = ./templates/default;description = "basic flake";};c-make = {path = ./templates/c-make;description = "c dev with make";};c-shake = {path = ./templates/c-shake;description = "c dev with shake";};zig = {path = ./templates/zig;description = "zig dev";};rust = {path = ./templates/rust;description = "rust dev";};