function define_rust_rule(name, type, deps) local inputs = {} for _, input in ipairs(tup.glob(name .. "/src/*.rs")) do table.insert(inputs, input) end local input_rs local output if type == "bin" then input_rs = name .. "/src/main.rs" output = "out/bin/" .. name else input_rs = name .. "/src/lib.rs" output = "out/lib/lib" .. name .. ".rlib" end local externs = {} for _, dep in ipairs(deps) do local rlib = "out/lib/lib" .. dep .. ".rlib" table.insert(inputs, rlib) table.insert(externs, "--extern " .. dep .. "=" .. rlib) end local flags = "--edition=2024 -C opt-level=3 -C embed-bitcode=no -C strip=debuginfo --emit=link" local command = "rustc --crate-name " .. name .. " --crate-type=" .. type .. " " .. input_rs .. " -o %o " .. table.concat(externs, " ") .. " " .. flags tup.definerule{inputs = inputs, command = command, outputs = {output}} end define_rust_rule("dna_parsing", "lib", {}) define_rust_rule("dna2rna", "bin", {"dna_parsing"}) define_rust_rule("disassembler", "bin", {"dna_parsing"}) define_rust_rule("rna2bmp", "bin", {}) define_rust_rule("asm2dna", "bin", {}) local asm = tup.glob("asm/*.asm") asm.extra_inputs = {"out/bin/asm2dna"} tup.foreach_rule( asm, "./out/bin/asm2dna %f %o", {"out/dna/%B.dna"} ) local dna = tup.glob("out/dna/*.dna") dna.extra_inputs = {"out/bin/dna2rna"} tup.foreach_rule( dna, "./out/bin/dna2rna %f task/endo.dna %o", {"out/rna/%B.rna"} ) local rna = tup.glob("out/rna/*.rna") rna.extra_inputs = {"out/bin/rna2bmp"} tup.foreach_rule( rna, "./out/bin/rna2bmp %f %o", {"out/bmp/%B.bmp"} ) local bmp = tup.glob("out/bmp/*.bmp") tup.foreach_rule( bmp, "convert %f %o", {"out/png/%B.png"} )