From 34fa7f44fe890fb6965157b9cd22892507472c43 Mon Sep 17 00:00:00 2001 From: Sebastian Wilzbach Date: Mon, 11 Dec 2017 04:27:22 +0100 Subject: [PATCH 1/2] Cleanup DMD as a library build files - Allow them to be directly executable (via the DMD DUB package) - Add a wild rule to avoid redundant logic - Remove irrelevant link flags like `-L-lstd++` - Move example binaries to the generated directory - Start building the examples on auto-tester (Posix-only for now) - Make Phobos path in impvisitor example more robust --- posix.mak | 1 + src/examples/.gitignore | 10 +++++++ src/examples/avg.d | 4 +++ src/examples/impvisitor.d | 54 +++++++++++++++++++++++++++++++++++++- src/examples/test_parser.d | 50 ----------------------------------- src/posix.mak | 18 ++++++++----- 6 files changed, 79 insertions(+), 58 deletions(-) create mode 100644 src/examples/.gitignore mode change 100644 => 100755 src/examples/avg.d mode change 100644 => 100755 src/examples/impvisitor.d delete mode 100644 src/examples/test_parser.d diff --git a/posix.mak b/posix.mak index c7d73baa1eea..0cb1f032b1f5 100644 --- a/posix.mak +++ b/posix.mak @@ -21,6 +21,7 @@ clean: $(RM) tags test: + $(QUIET)$(MAKE) -C src -f posix.mak build-examples $(QUIET)$(MAKE) -C src -f posix.mak unittest $(QUIET)$(MAKE) -C test -f Makefile diff --git a/src/examples/.gitignore b/src/examples/.gitignore new file mode 100644 index 000000000000..fc66ac17e297 --- /dev/null +++ b/src/examples/.gitignore @@ -0,0 +1,10 @@ +# Ignore all binary files (files without an extension) +# Start: Ignore everything +* +# Include directories +!*/ +# Include all files with extensions +!*.* + +# Ignore DUB files +.dub diff --git a/src/examples/avg.d b/src/examples/avg.d old mode 100644 new mode 100755 index 4eb32f5c891f..8677a2a66a9a --- a/src/examples/avg.d +++ b/src/examples/avg.d @@ -1,3 +1,7 @@ +#!/usr/bin/env dub +/+dub.sdl: +dependency "dmd" path="../.." ++/ /* This file contains an example on how to use the transitive visitor. It implements a visitor which computes the average function length from a *.d file. diff --git a/src/examples/impvisitor.d b/src/examples/impvisitor.d old mode 100644 new mode 100755 index 4c34dbb30f84..edaf3eee9156 --- a/src/examples/impvisitor.d +++ b/src/examples/impvisitor.d @@ -1,4 +1,7 @@ -module examples.impvisitor; +#!/usr/bin/env dub +/+dub.sdl: +dependency "dmd" path="../.." ++/ import ddmd.permissivevisitor; import ddmd.transitivevisitor; @@ -67,3 +70,52 @@ extern(C++) class ImportVisitor(AST) : PermissiveVisitor!AST } } } + +void main() +{ + import std.stdio; + import std.file; + import std.path : buildPath, dirName; + + import ddmd.parse; + import ddmd.astbase; + + import ddmd.id; + import ddmd.globals; + import ddmd.identifier; + + import core.memory; + + GC.disable(); + string path = __FILE_FULL_PATH__.dirName.buildPath("../../../phobos/std/"); + string regex = "*.d"; + + auto dFiles = dirEntries(path, regex, SpanMode.depth); + foreach (f; dFiles) + { + string fn = f.name; + //writeln("Processing ", fn); + + Id.initialize(); + global._init(); + global.params.isLinux = true; + global.params.is64bit = (size_t.sizeof == 8); + global.params.useUnitTests = true; + ASTBase.Type._init(); + + auto id = Identifier.idPool(fn); + auto m = new ASTBase.Module(&(fn.dup)[0], id, false, false); + auto input = readText(fn); + + //writeln("Started parsing..."); + scope p = new Parser!ASTBase(m, input, false); + p.nextToken(); + m.members = p.parseModule(); + //writeln("Finished parsing. Starting transitive visitor"); + + scope vis = new ImportVisitor2!ASTBase(); + m.accept(vis); + + //writeln("Finished!"); + } +} diff --git a/src/examples/test_parser.d b/src/examples/test_parser.d deleted file mode 100644 index 02a291c754b5..000000000000 --- a/src/examples/test_parser.d +++ /dev/null @@ -1,50 +0,0 @@ -import std.stdio; -import std.file; - -import ddmd.parse; -import ddmd.astbase; - -import examples.impvisitor; - -import ddmd.id; -import ddmd.globals; -import ddmd.identifier; - -import core.memory; - -void main() -{ - - GC.disable(); - string path = "../../phobos/std/"; - string regex = "*.d"; - - auto dFiles = dirEntries(path, regex, SpanMode.depth); - foreach (f; dFiles) - { - string fn = f.name; - //writeln("Processing ", fn); - - Id.initialize(); - global._init(); - global.params.isLinux = true; - global.params.is64bit = (size_t.sizeof == 8); - global.params.useUnitTests = true; - ASTBase.Type._init(); - - auto id = Identifier.idPool(fn); - auto m = new ASTBase.Module(&(fn.dup)[0], id, false, false); - auto input = readText(fn); - - //writeln("Started parsing..."); - scope p = new Parser!ASTBase(m, input, false); - p.nextToken(); - m.members = p.parseModule(); - //writeln("Finished parsing. Starting transitive visitor"); - - scope vis = new ImportVisitor2!ASTBase(); - m.accept(vis); - - //writeln("Finished!"); - } -} diff --git a/src/posix.mak b/src/posix.mak index 1ce77a87b784..91718d20a521 100644 --- a/src/posix.mak +++ b/src/posix.mak @@ -441,12 +441,6 @@ $G/lexer.a: $(LEXER_SRCS) $(LEXER_ROOT) $(HOST_DMD_PATH) $(SRC_MAKE) $G/parser.a: $(PARSER_SRCS) $G/lexer.a $(ROOT_SRCS) $(HOST_DMD_PATH) $(SRC_MAKE) CC="$(HOST_CXX)" $(HOST_DMD_RUN) -lib -of$@ $(MODEL_FLAG) -L-lstdc++ $(DFLAGS) $(PARSER_SRCS) $G/lexer.a $(ROOT_SRCS) -parser_test: $G/parser.a $(EX)/test_parser.d $(HOST_DMD_PATH) - CC="$(HOST_CXX)" $(HOST_DMD_RUN) -of$@ $(MODEL_FLAG) -L-lstdc++ $(DFLAGS) $G/parser.a $(EX)/test_parser.d $(EX)/impvisitor.d - -example_avg: $G/parser.a $(EX)/avg.d $(HOST_DMD_PATH) - CC="$(HOST_CXX)" $(HOST_DMD_RUN) -of$@ $(MODEL_FLAG) -L-lstdc++ $(DFLAGS) $G/parser.a $(EX)/avg.d - $G/dmd_frontend: $(FRONT_SRCS) $D/gluelayer.d $(ROOT_SRCS) $G/newdelete.o $G/lexer.a $(STRING_IMPORT_FILES) $(HOST_DMD_PATH) CC="$(HOST_CXX)" $(HOST_DMD_RUN) -of$@ $(MODEL_FLAG) -vtls -J$G -J../res -L-lstdc++ $(DFLAGS) $(filter-out $(STRING_IMPORT_FILES) $(HOST_DMD_PATH),$^) -version=NoBackend @@ -467,9 +461,19 @@ $G/dmd-unittest: $(DMD_SRCS) $(ROOT_SRCS) $G/newdelete.o $G/lexer.a $(G_GLUE_OBJ unittest: $G/dmd-unittest $< +######## DMD as a library examples + +EXAMPLES=$(addprefix $G/examples/, avg impvisitor) + +$G/examples/%: $(EX)/%.d $G/parser.a $(HOST_DMD_PATH) + CC="$(HOST_CXX)" $(HOST_DMD_RUN) -of$@ $(MODEL_FLAG) $(DFLAGS) $G/parser.a $< + +build-examples: $(EXAMPLES) + +######## Manual cleanup + clean: rm -R $(GENERATED) - rm -f parser_test parser_test.o example_avg example_avg.o rm -f dmd rm -f $(addprefix $D/backend/, $(optabgen_output)) @[ ! -d ${PGO_DIR} ] || echo You should issue manually: rm -rf ${PGO_DIR} From 47e6b5faaadac6f7873910956e0994e67d3bacf4 Mon Sep 17 00:00:00 2001 From: Sebastian Wilzbach Date: Mon, 11 Dec 2017 04:42:11 +0100 Subject: [PATCH 2/2] Build the examples with the current, generated DMD binary --- src/posix.mak | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/posix.mak b/src/posix.mak index 91718d20a521..dffd5c49fa5e 100644 --- a/src/posix.mak +++ b/src/posix.mak @@ -309,8 +309,6 @@ ROOT_SRCS = $(addsuffix .d,$(addprefix $(ROOT)/,aav array ctfloat file \ filename man outbuffer port response rmem rootobject speller \ stringtable hash)) -PARSER_SRCS=$(addsuffix .d, $(addprefix $D/,parse astbase parsetimevisitor transitivevisitor permissivevisitor strictvisitor)) - GLUE_OBJS = ifeq (osx,$(OS)) @@ -438,9 +436,6 @@ $G/backend.a: $(G_OBJS) $(SRC_MAKE) $G/lexer.a: $(LEXER_SRCS) $(LEXER_ROOT) $(HOST_DMD_PATH) $(SRC_MAKE) CC="$(HOST_CXX)" $(HOST_DMD_RUN) -lib -of$@ $(MODEL_FLAG) -J$G -L-lstdc++ $(DFLAGS) $(LEXER_SRCS) $(LEXER_ROOT) -$G/parser.a: $(PARSER_SRCS) $G/lexer.a $(ROOT_SRCS) $(HOST_DMD_PATH) $(SRC_MAKE) - CC="$(HOST_CXX)" $(HOST_DMD_RUN) -lib -of$@ $(MODEL_FLAG) -L-lstdc++ $(DFLAGS) $(PARSER_SRCS) $G/lexer.a $(ROOT_SRCS) - $G/dmd_frontend: $(FRONT_SRCS) $D/gluelayer.d $(ROOT_SRCS) $G/newdelete.o $G/lexer.a $(STRING_IMPORT_FILES) $(HOST_DMD_PATH) CC="$(HOST_CXX)" $(HOST_DMD_RUN) -of$@ $(MODEL_FLAG) -vtls -J$G -J../res -L-lstdc++ $(DFLAGS) $(filter-out $(STRING_IMPORT_FILES) $(HOST_DMD_PATH),$^) -version=NoBackend @@ -464,9 +459,13 @@ unittest: $G/dmd-unittest ######## DMD as a library examples EXAMPLES=$(addprefix $G/examples/, avg impvisitor) +PARSER_SRCS=$(addsuffix .d, $(addprefix $D/,parse astbase parsetimevisitor transitivevisitor permissivevisitor strictvisitor)) + +$G/parser.a: $(PARSER_SRCS) $(LEXER_SRCS) $(ROOT_SRCS) $G/dmd $G/dmd.conf $(SRC_MAKE) + CC="$(HOST_CXX)" $G/dmd -lib -of$@ $(MODEL_FLAG) -L-lstdc++ -J$G $(DFLAGS) $(PARSER_SRCS) $(LEXER_SRCS) $(ROOT_SRCS) -$G/examples/%: $(EX)/%.d $G/parser.a $(HOST_DMD_PATH) - CC="$(HOST_CXX)" $(HOST_DMD_RUN) -of$@ $(MODEL_FLAG) $(DFLAGS) $G/parser.a $< +$G/examples/%: $(EX)/%.d $G/parser.a $G/dmd + CC="$(HOST_CXX)" $G/dmd -of$@ $(MODEL_FLAG) $(DFLAGS) $G/parser.a $< build-examples: $(EXAMPLES)