Search in sources :

Example 1 with ISpoofaxBuildOutput

use of org.metaborg.spoofax.core.build.ISpoofaxBuildOutput in project spoofax by metaborg.

the class LanguageSpecBuilder method compile.

public void compile(LanguageSpecBuildInput input) throws MetaborgException {
    logger.debug("Running pre-Java build for {}", input.languageSpec().location());
    initPluto();
    try {
        final String path = path(input);
        plutoBuild(GenerateSourcesBuilder.request(generateSourcesBuilderInput(input)), path);
    } catch (RequiredBuilderFailed e) {
        if (e.getMessage().contains("no rebuild of failing builder")) {
            throw new MetaborgException(failingRebuildMessage, e);
        } else {
            throw new MetaborgException();
        }
    } catch (RuntimeException e) {
        throw e;
    } catch (Throwable e) {
        throw new MetaborgException(e);
    }
    final SpoofaxCommonPaths paths = new SpoofaxLangSpecCommonPaths(input.languageSpec().location());
    // HACK: compile the main ESV file to make sure that packed.esv file is always available.
    final Iterable<FileObject> esvRoots = languagePathService.sourcePaths(input.project(), SpoofaxConstants.LANG_ESV_NAME);
    final FileObject mainEsvFile = paths.findEsvMainFile(esvRoots);
    try {
        if (mainEsvFile != null && mainEsvFile.exists()) {
            logger.info("Compiling Main ESV file {}", mainEsvFile);
            // @formatter:off
            final BuildInput buildInput = new BuildInputBuilder(input.languageSpec()).addSource(mainEsvFile).addTransformGoal(new CompileGoal()).withMessagePrinter(new StreamMessagePrinter(sourceTextService, false, true, logger)).build(dependencyService, languagePathService);
            // @formatter:on
            final ISpoofaxBuildOutput result = runner.build(buildInput, null, null).schedule().block().result();
            if (!result.success()) {
                throw new MetaborgException("Compiling Main ESV file failed");
            }
        }
    } catch (FileSystemException e) {
        final String message = logger.format("Could not compile ESV file {}", mainEsvFile);
        throw new MetaborgException(message, e);
    } catch (InterruptedException e) {
    // Ignore
    }
    // HACK: compile the main DS file if available, after generating sources (because ds can depend on Stratego
    // strategies), to generate an interpreter.
    final Iterable<FileObject> dsRoots = languagePathService.sourcePaths(input.project(), SpoofaxConstants.LANG_DYNSEM_NAME);
    final FileObject mainDsFile = paths.findDsMainFile(dsRoots, input.languageSpec().config().strategoName());
    try {
        if (mainDsFile != null && mainDsFile.exists()) {
            if (languageIdentifierService.identify(mainDsFile, input.project()) == null) {
                logger.error("Could not identify DynSem main file {}, please add DynSem as a compile dependency", mainDsFile);
            }
            logger.info("Compiling main DynSem file {}", mainDsFile);
            // @formatter:off
            final BuildInput buildInput = new BuildInputBuilder(input.languageSpec()).addSource(mainDsFile).addTransformGoal(new EndNamedGoal("Generate interpreter")).withMessagePrinter(new StreamMessagePrinter(sourceTextService, false, true, logger)).build(dependencyService, languagePathService);
            // @formatter:on
            final ISpoofaxBuildOutput result = runner.build(buildInput, null, null).schedule().block().result();
            if (!result.success()) {
                logger.error("Compiling main DynSem file {} failed", mainDsFile);
            }
        }
    } catch (FileSystemException e) {
        final String message = logger.format("Could not compile DynSem file {}", mainDsFile);
        throw new MetaborgException(message, e);
    } catch (InterruptedException e) {
    // Ignore
    }
    for (IBuildStep buildStep : buildSteps) {
        buildStep.execute(LanguageSpecBuildPhase.compile, input);
    }
}
Also used : StreamMessagePrinter(org.metaborg.core.messages.StreamMessagePrinter) CompileGoal(org.metaborg.core.action.CompileGoal) ISpoofaxBuildOutput(org.metaborg.spoofax.core.build.ISpoofaxBuildOutput) MetaborgException(org.metaborg.core.MetaborgException) BuildInputBuilder(org.metaborg.core.build.BuildInputBuilder) FileSystemException(org.apache.commons.vfs2.FileSystemException) BuildInput(org.metaborg.core.build.BuildInput) EndNamedGoal(org.metaborg.core.action.EndNamedGoal) RequiredBuilderFailed(build.pluto.builder.RequiredBuilderFailed) FileObject(org.apache.commons.vfs2.FileObject) SpoofaxCommonPaths(org.metaborg.spoofax.core.build.SpoofaxCommonPaths)

Aggregations

RequiredBuilderFailed (build.pluto.builder.RequiredBuilderFailed)1 FileObject (org.apache.commons.vfs2.FileObject)1 FileSystemException (org.apache.commons.vfs2.FileSystemException)1 MetaborgException (org.metaborg.core.MetaborgException)1 CompileGoal (org.metaborg.core.action.CompileGoal)1 EndNamedGoal (org.metaborg.core.action.EndNamedGoal)1 BuildInput (org.metaborg.core.build.BuildInput)1 BuildInputBuilder (org.metaborg.core.build.BuildInputBuilder)1 StreamMessagePrinter (org.metaborg.core.messages.StreamMessagePrinter)1 ISpoofaxBuildOutput (org.metaborg.spoofax.core.build.ISpoofaxBuildOutput)1 SpoofaxCommonPaths (org.metaborg.spoofax.core.build.SpoofaxCommonPaths)1