/** * Copyright (C) 2009 STMicroelectronics * * This file is part of "Mind Compiler" is free software: you can redistribute * it and/or modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * Contact: mind@ow2.org * * Authors: Matthieu Leclercq * Contributors: */ package org.ow2.mind.adl; import static org.ow2.mind.PathHelper.replaceExtension; import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import org.objectweb.fractal.adl.ADLException; import org.objectweb.fractal.adl.CompilerError; import org.objectweb.fractal.adl.error.GenericErrors; import org.ow2.mind.InputResourceLocator; import org.ow2.mind.adl.ast.ASTHelper; import org.ow2.mind.adl.ast.ImplementationContainer; import org.ow2.mind.adl.ast.Source; import org.ow2.mind.adl.compilation.CompilationCommandFactory; import org.ow2.mind.compilation.CompilationCommand; import org.ow2.mind.compilation.CompilerCommand; import org.ow2.mind.compilation.PreprocessorCommand; import org.ow2.mind.io.OutputFileLocator; import org.ow2.mind.preproc.MPPCommand; import com.google.inject.Inject; public class BasicInstanceCompiler implements InstanceCompiler { @Inject protected InstanceSourceGenerator instanceSourceGeneratorItf; @Inject protected OutputFileLocator outputFileLocatorItf; @Inject protected InputResourceLocator inputResourceLocatorItf; @Inject protected CompilationCommandFactory compilationCommandFactory; // --------------------------------------------------------------------------- // Implementation of the Visitor interface // --------------------------------------------------------------------------- public Collection<CompilationCommand> visit( final InstancesDescriptor instanceDesc, final Map<Object, Object> context) throws ADLException { instanceSourceGeneratorItf.visit(instanceDesc, context); final String instancesFileName = BasicInstanceSourceGenerator .getInstancesFileName(instanceDesc); final File srcFile = outputFileLocatorItf.getCSourceOutputFile( instancesFileName, context); if (!srcFile.exists()) { throw new CompilerError(GenericErrors.INTERNAL_ERROR, "Can't find source file \"" + instancesFileName + "\""); } Collection<File> dependencies = null; if (instanceDesc.instanceDefinition instanceof ImplementationContainer) { final Source sources[] = ((ImplementationContainer) instanceDesc.instanceDefinition) .getSources(); if (sources.length == 1) { dependencies = new ArrayList<File>(); dependencies.add(outputFileLocatorItf.getCSourceTemporaryOutputFile( ImplementationHeaderSourceGenerator .getImplHeaderFileName(instanceDesc.instanceDefinition), context)); } else if (sources.length > 1) { dependencies = new ArrayList<File>(); for (int i = 0; i < sources.length; i++) { final Source src = sources[i]; if (!ASTHelper.isPreCompiled(src) && !ASTHelper.isAssembly(src)) { dependencies.add(outputFileLocatorItf .getCSourceTemporaryOutputFile( ImplementationHeaderSourceGenerator.getImplHeaderFileName( instanceDesc.instanceDefinition, i), context)); } } } } final File cppFile = outputFileLocatorItf.getCSourceTemporaryOutputFile( replaceExtension(instancesFileName, ".i"), context); final File mppFile = outputFileLocatorItf.getCSourceTemporaryOutputFile( replaceExtension(instancesFileName, ".mpp.c"), context); final File objectFile = outputFileLocatorItf.getCCompiledOutputFile( replaceExtension(instancesFileName, ".o"), context); final File depFile = outputFileLocatorItf.getCCompiledOutputFile( replaceExtension(instancesFileName, ".d"), context); final PreprocessorCommand cppCommand = compilationCommandFactory .newPreprocessorCommand(instanceDesc.instanceDefinition, null, srcFile, dependencies, depFile, cppFile, context); final MPPCommand mppCommand = compilationCommandFactory.newMPPCommand( instanceDesc.instanceDefinition, null, cppFile, mppFile, null, context); final CompilerCommand gccCommand = compilationCommandFactory .newCompilerCommand(instanceDesc.instanceDefinition, null, mppFile, true, null, null, objectFile, context); gccCommand.addIncludeFile(outputFileLocatorItf.getCSourceOutputFile( DefinitionMacroSourceGenerator .getMacroFileName(instanceDesc.instanceDefinition), context)); gccCommand.setAllDependenciesManaged(true); final List<CompilationCommand> compilationTasks = new ArrayList<CompilationCommand>(); compilationTasks.add(cppCommand); compilationTasks.add(mppCommand); compilationTasks.add(gccCommand); return compilationTasks; } }