Skip to content

Instantly share code, notes, and snippets.

@zenspider
Created November 10, 2024 20:10
Show Gist options
  • Save zenspider/ee3801a9cc5e554a5a8568bee2dc595b to your computer and use it in GitHub Desktop.
Save zenspider/ee3801a9cc5e554a5a8568bee2dc595b to your computer and use it in GitHub Desktop.
const std = @import("std");
pub fn build(b: *std.Build) void {
const target = b.standardTargetOptions(.{});
const optimize = b.standardOptimizeOption(.{});
// TODO: import cppunit as direct build
const flags = .{
// TODO: "-std=c++17",
"-std=c++11", // TODO: antlr requires 11, we use headers, soooo
"-g",
"-pedantic",
"-Wall",
"-W",
"-Werror",
"-Waggregate-return",
"-Wcast-align",
"-Wcast-qual",
"-Wconversion",
"-Winline",
"-Wmissing-noreturn",
"-Wmissing-prototypes",
"-Wno-deprecated",
"-Wno-missing-field-initializers",
"-Wno-self-assign-overloaded",
"-Wno-sign-conversion",
"-Wpointer-arith",
"-Wredundant-decls",
"-Wsign-compare",
"-Wstrict-prototypes",
"-Wundef",
"-Wwrite-strings",
};
const antlr_flags = .{
"-std=c++11", // TODO: antlr requires 11
"-g",
"-pedantic",
"-Wall",
"-W",
// TODO: "-Werror",
"-Waggregate-return",
"-Wcast-align",
"-Wcast-qual",
"-Wconversion",
"-Winline",
"-Wmissing-noreturn",
"-Wmissing-prototypes",
"-Wno-deprecated",
"-Wno-missing-field-initializers",
"-Wno-self-assign-overloaded",
"-Wno-sign-conversion",
"-Wpointer-arith",
"-Wredundant-decls",
"-Wsign-compare",
"-Wstrict-prototypes",
"-Wundef",
"-Wwrite-strings",
};
////////////////////////////////////////////////////////////
// cppunit (ugh!):
const cppunit = b.addStaticLibrary(.{
.name = "cppunit",
.target = target,
.optimize = optimize,
});
cppunit.addIncludePath(b.path("src/cppunit/include"));
cppunit.linkLibCpp();
const MESSY_flags = .{
"-std=c++17",
"-g",
"-pedantic",
"-Wall",
"-W",
"-Werror",
"-Waggregate-return",
"-Wcast-align",
"-Wconversion",
"-Winline",
"-Wmissing-prototypes",
"-Wno-deprecated",
"-Wno-missing-field-initializers",
"-Wno-self-assign-overloaded",
"-Wno-sign-conversion",
"-Wno-shorten-64-to-32",
"-Wpointer-arith",
"-Wredundant-decls",
"-Wsign-compare",
"-Wstrict-prototypes",
"-Wundef",
"-Wwrite-strings",
};
cppunit.addCSourceFiles(.{
.files = &.{
"src/cppunit/src/cppunit/AdditionalMessage.cpp",
"src/cppunit/src/cppunit/Asserter.cpp",
"src/cppunit/src/cppunit/BriefTestProgressListener.cpp",
"src/cppunit/src/cppunit/CompilerOutputter.cpp",
"src/cppunit/src/cppunit/DefaultProtector.cpp",
"src/cppunit/src/cppunit/DynamicLibraryManager.cpp",
"src/cppunit/src/cppunit/DynamicLibraryManagerException.cpp",
"src/cppunit/src/cppunit/Exception.cpp",
"src/cppunit/src/cppunit/Message.cpp",
"src/cppunit/src/cppunit/PlugInManager.cpp",
"src/cppunit/src/cppunit/PlugInParameters.cpp",
"src/cppunit/src/cppunit/Protector.cpp",
"src/cppunit/src/cppunit/ProtectorChain.cpp",
"src/cppunit/src/cppunit/RepeatedTest.cpp",
"src/cppunit/src/cppunit/ShlDynamicLibraryManager.cpp",
"src/cppunit/src/cppunit/SourceLine.cpp",
"src/cppunit/src/cppunit/StringTools.cpp",
"src/cppunit/src/cppunit/SynchronizedObject.cpp",
"src/cppunit/src/cppunit/Test.cpp",
"src/cppunit/src/cppunit/TestAssert.cpp",
"src/cppunit/src/cppunit/TestCase.cpp",
"src/cppunit/src/cppunit/TestCaseDecorator.cpp",
"src/cppunit/src/cppunit/TestComposite.cpp",
"src/cppunit/src/cppunit/TestDecorator.cpp",
"src/cppunit/src/cppunit/TestFactoryRegistry.cpp",
"src/cppunit/src/cppunit/TestFailure.cpp",
"src/cppunit/src/cppunit/TestLeaf.cpp",
"src/cppunit/src/cppunit/TestNamer.cpp",
"src/cppunit/src/cppunit/TestPath.cpp",
"src/cppunit/src/cppunit/TestPlugInDefaultImpl.cpp",
"src/cppunit/src/cppunit/TestResult.cpp",
"src/cppunit/src/cppunit/TestResultCollector.cpp",
"src/cppunit/src/cppunit/TestRunner.cpp",
"src/cppunit/src/cppunit/TestSetUp.cpp",
"src/cppunit/src/cppunit/TestSuccessListener.cpp",
"src/cppunit/src/cppunit/TestSuite.cpp",
"src/cppunit/src/cppunit/TestSuiteBuilderContext.cpp",
"src/cppunit/src/cppunit/TextOutputter.cpp",
"src/cppunit/src/cppunit/TextTestProgressListener.cpp",
"src/cppunit/src/cppunit/TextTestResult.cpp",
"src/cppunit/src/cppunit/TextTestRunner.cpp",
"src/cppunit/src/cppunit/TypeInfoHelper.cpp",
"src/cppunit/src/cppunit/UnixDynamicLibraryManager.cpp",
"src/cppunit/src/cppunit/XmlDocument.cpp",
"src/cppunit/src/cppunit/XmlElement.cpp",
"src/cppunit/src/cppunit/XmlOutputter.cpp",
"src/cppunit/src/cppunit/XmlOutputterHook.cpp",
},
.flags = &MESSY_flags,
});
b.installArtifact(cppunit);
////////////////////////////////////////////////////////////
// Low:
const low = b.addStaticLibrary(.{
.name = "low",
.target = target,
.optimize = optimize,
});
low.addIncludePath(b.path("src"));
low.linkLibCpp();
low.addCSourceFiles(.{
.files = &.{
"src/low/boolean.cc",
"src/low/debug.cc",
"src/low/flt.cc",
"src/low/sinteger.cc",
"src/low/str.cc",
"src/low/tracer.cc",
"src/low/uinteger.cc",
},
.flags = &flags,
});
b.installArtifact(low);
const low_tests = b.addExecutable(.{
.name = "test-low",
.root_source_file = b.path("src/low/main.zig"),
.target = target,
.optimize = optimize,
});
low_tests.addIncludePath(b.path("src"));
low_tests.addIncludePath(b.path("src/cppunit/include"));
low_tests.linkLibCpp();
low_tests.linkLibrary(cppunit);
low_tests.linkLibrary(low);
low_tests.addCSourceFiles(.{
.files = &.{
"src/low/block_test.cc",
"src/low/boolean_test.cc",
"src/low/debug_test.cc",
"src/low/dynblock_test.cc",
"src/low/flt_test.cc",
"src/low/list_test.cc",
"src/low/listnode_test.cc",
"src/low/ptr_test.cc",
"src/low/queue_test.cc",
"src/low/sinteger_test.cc",
"src/low/stack_test.cc",
"src/low/str_test.cc",
"src/low/template_test.cc",
"src/low/tracer_test.cc",
"src/low/uinteger_test.cc",
"src/low/test_suite.cc",
},
.flags = &flags,
});
const run_low_tests = b.addRunArtifact(low_tests);
b.installArtifact(low_tests);
////////////////////////////////////////////////////////////
// Medium:
const med = b.addStaticLibrary(.{
.name = "med",
.target = target,
.optimize = optimize,
});
med.addIncludePath(b.path("src"));
med.addIncludePath(b.path("src/medium")); // TODO: remove
med.linkLibCpp();
med.linkLibrary(low);
med.addCSourceFiles(.{
.files = &.{
"src/medium/gc/gcable.cc",
"src/medium/gc/memory.cc",
"src/medium/objects/arrayptr.cc",
"src/medium/objects/assocptr.cc",
"src/medium/objects/charptr.cc",
"src/medium/objects/classptr.cc",
"src/medium/objects/cntxptr.cc",
"src/medium/objects/descptr.cc",
"src/medium/objects/dictptr.cc",
"src/medium/objects/floatptr.cc",
"src/medium/objects/gobjects.cc",
"src/medium/objects/intptr.cc",
"src/medium/objects/methptr.cc",
"src/medium/objects/nodeptr.cc",
"src/medium/objects/object.cc",
"src/medium/objects/objptr.cc",
"src/medium/objects/stackptr.cc",
"src/medium/objects/strptr.cc",
"src/medium/objects/symptr.cc",
"src/medium/tools/bytestor.cc",
"src/medium/tools/mbuilder.cc",
},
.flags = &flags,
});
b.installArtifact(med);
const med_tests = b.addExecutable(.{
.name = "test-med",
.root_source_file = b.path("src/medium/main.zig"),
.target = target,
.optimize = optimize,
});
med_tests.addIncludePath(b.path("src"));
med_tests.addIncludePath(b.path("src/medium")); // TODO: remove
med_tests.addIncludePath(b.path("src/cppunit/include"));
med_tests.linkLibCpp();
med_tests.linkLibrary(low);
med_tests.linkLibrary(med);
med_tests.linkLibrary(cppunit);
med_tests.addCSourceFiles(.{
.files = &.{
"src/medium/test_suite.cc",
"src/medium/gc/memory_test.cc",
"src/medium/objects/arrayptr_test.cc",
// "src/medium/objects/assocptr_test.cc",
"src/medium/objects/charptr_test.cc",
// "src/medium/objects/classptr_test.cc",
"src/medium/objects/cntxptr_test.cc",
"src/medium/objects/descptr_test.cc",
"src/medium/objects/dictptr_test.cc", // next
"src/medium/objects/floatptr_test.cc",
"src/medium/objects/intptr_test.cc",
"src/medium/objects/methptr_test.cc",
// "src/medium/objects/nodeptr_test.cc",
"src/medium/objects/objptr_test.cc",
"src/medium/objects/stackptr_test.cc",
"src/medium/objects/strptr_test.cc",
"src/medium/objects/symptr_test.cc",
},
.flags = &flags,
});
const run_med_tests = b.addRunArtifact(med_tests);
b.installArtifact(med_tests);
////////////////////////////////////////////////////////////
// Antlr: ugh
const antlr = b.addStaticLibrary(.{
.name = "antlr",
.target = target,
.optimize = optimize,
});
antlr.addIncludePath(b.path("src"));
antlr.linkLibCpp();
antlr.addCSourceFiles(.{
.files = &.{
"src/antlr/ANTLRUtil.cpp",
"src/antlr/ASTFactory.cpp",
"src/antlr/ASTNULLType.cpp",
"src/antlr/ASTRefCount.cpp",
"src/antlr/BaseAST.cpp",
"src/antlr/BitSet.cpp",
"src/antlr/CharBuffer.cpp",
"src/antlr/CharScanner.cpp",
"src/antlr/CommonAST.cpp",
"src/antlr/CommonASTWithHiddenTokens.cpp",
"src/antlr/CommonHiddenStreamToken.cpp",
"src/antlr/CommonToken.cpp",
"src/antlr/InputBuffer.cpp",
"src/antlr/LLkParser.cpp",
"src/antlr/MismatchedCharException.cpp",
"src/antlr/MismatchedTokenException.cpp",
"src/antlr/NoViableAltException.cpp",
"src/antlr/NoViableAltForCharException.cpp",
"src/antlr/Parser.cpp",
"src/antlr/RecognitionException.cpp",
"src/antlr/String.cpp",
"src/antlr/Token.cpp",
"src/antlr/TokenBuffer.cpp",
"src/antlr/TokenStreamBasicFilter.cpp",
"src/antlr/TokenStreamHiddenTokenFilter.cpp",
"src/antlr/TokenStreamSelector.cpp",
"src/antlr/TokenStreamRewriteEngine.cpp",
"src/antlr/TreeParser.cpp",
"src/antlr/TokenRefCount.cpp",
},
.flags = &antlr_flags,
});
b.installArtifact(antlr);
////////////////////////////////////////////////////////////
// High:
const high = b.addStaticLibrary(.{
.name = "high",
.target = target,
.optimize = optimize,
});
high.addIncludePath(b.path("src"));
high.addIncludePath(b.path("src/medium")); // TODO: remove
high.addIncludePath(b.path("src/high")); // TODO: remove
high.linkLibCpp();
// high.linkLibrary(low);
high.linkLibrary(med);
high.linkLibrary(antlr);
high.addCSourceFiles(.{
.files = &.{
"src/high/grammar/grammar_utils.cc",
"src/high/grammar/ST80Lexer.cpp",
"src/high/grammar/ST80Parser.cpp",
"src/high/interpre/doprim.cc",
"src/high/interpre/interpre.cc",
"src/high/interpre/primdana.cc",
"src/high/interpre/primmatt.cc",
"src/high/interpre/vcpu.cc",
"src/high/main/satori.cc",
},
.flags = &flags,
});
b.installArtifact(high);
const high_tests = b.addExecutable(.{
.name = "test-high",
.root_source_file = b.path("src/high/main.zig"),
.target = target,
.optimize = optimize,
});
high_tests.addIncludePath(b.path("src"));
high_tests.addIncludePath(b.path("src/low")); // TODO: remove
high_tests.addIncludePath(b.path("src/medium")); // TODO: remove
high_tests.addIncludePath(b.path("src/high")); // TODO: remove
high_tests.addIncludePath(b.path("src/cppunit/include"));
high_tests.linkLibCpp();
high_tests.linkLibrary(cppunit);
high_tests.linkLibrary(low);
high_tests.linkLibrary(med);
high_tests.linkLibrary(antlr);
high_tests.linkLibrary(high);
high_tests.addCSourceFiles(.{
.files = &.{
"src/high/test_suite.cc",
"src/high/grammar/grammar_test.cc",
},
.flags = &flags,
});
const run_high_tests = b.addRunArtifact(high_tests);
b.installArtifact(high_tests);
////////////////////////////////////////////////////////////
// Steps:
const test_all_step = b.step("test", "Run all tests");
test_all_step.dependOn(&run_low_tests.step);
test_all_step.dependOn(&run_med_tests.step);
test_all_step.dependOn(&run_high_tests.step);
const test_low_step = b.step("test-low", "Run low tests");
test_low_step.dependOn(&run_low_tests.step);
const test_med_step = b.step("test-med", "Run medium tests");
test_med_step.dependOn(&run_med_tests.step);
const test_high_step = b.step("test-high", "Run high tests");
test_high_step.dependOn(&run_high_tests.step);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment