/**
* Copyright (C) 2010 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: Julien Tous
*/
package org.ow2.mind.cli;
import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.ow2.mind.compilation.CompilerContextHelper;
import org.ow2.mind.compilation.DirectiveHelper;
import org.ow2.mind.plugin.util.Assert;
/**
* Handles "cpp-flags", "c-flags", "inc-path", "as-flags", "ld-flags", "ld-path"
* and "linker-script" options.
*
* @see CompilerContextHelper
*/
public class FlagsOptionHandler implements CommandOptionHandler {
/** The ID of the "cpp-flags" option. */
public static final String CPPFLAGS_ID = "org.ow2.mind.mindc.CPPFlags";
/** The ID of the "c-flags" option. */
public static final String CFLAGS_ID = "org.ow2.mind.mindc.CFlags";
/** The ID of the "inc-path" option. */
public static final String INC_PATH_ID = "org.ow2.mind.mindc.IncPath";
/** The ID of the "as-flags" option. */
public static final String ASFLAGS_ID = "org.ow2.mind.mindc.ASFlags";
/** The ID of the "ld-flags" option. */
public static final String LDFLAGS_ID = "org.ow2.mind.mindc.LDFlags";
/** The ID of the "ld-path" option. */
public static final String LD_PATH_ID = "org.ow2.mind.mindc.LDPath";
/** The ID of the "linker-script" option. */
public static final String LINKER_SCRIPT_ID = "org.ow2.mind.mindc.LinkerScript";
public void processCommandOption(final CmdOption cmdOption,
final CommandLine cmdLine, final Map<Object, Object> context)
throws InvalidCommandLineException {
if (CPPFLAGS_ID.equals(cmdOption.getId())) {
// process CFlags
final CmdAppendOption cppFlagsOpt = Assert.assertInstanceof(cmdOption,
CmdAppendOption.class);
final List<String> cppFlagsList = new ArrayList<String>(
CompilerContextHelper.getCPPFlags(context));
final String value = cppFlagsOpt.getValue(cmdLine);
if (value != null && value.length() > 0) {
cppFlagsList.addAll(DirectiveHelper.splitOptionString(value));
}
CompilerContextHelper.setCPPFlags(context, cppFlagsList);
} else if (CFLAGS_ID.equals(cmdOption.getId())) {
// process CFlags
final CmdAppendOption cFlagsOpt = Assert.assertInstanceof(cmdOption,
CmdAppendOption.class);
final List<String> cFlagsList = new ArrayList<String>(
CompilerContextHelper.getCFlags(context));
final String value = cFlagsOpt.getValue(cmdLine);
if (value != null && value.length() > 0) {
cFlagsList.addAll(DirectiveHelper.splitOptionString(value));
}
CompilerContextHelper.setCFlags(context, cFlagsList);
} else if (ASFLAGS_ID.equals(cmdOption.getId())) {
// process ASFlags
final CmdAppendOption asFlagsOpt = Assert.assertInstanceof(cmdOption,
CmdAppendOption.class);
final List<String> asFlagsList = new ArrayList<String>(
CompilerContextHelper.getASFlags(context));
final String value = asFlagsOpt.getValue(cmdLine);
if (value != null && value.length() > 0) {
asFlagsList.addAll(DirectiveHelper.splitOptionString(value));
}
CompilerContextHelper.setASFlags(context, asFlagsList);
} else if (INC_PATH_ID.equals(cmdOption.getId())) {
// process inc-path
final CmdPathOption includePathOpt = Assert.assertInstanceof(cmdOption,
CmdPathOption.class);
final List<String> incPaths = new ArrayList<String>(
CompilerContextHelper.getIncPath(context));
// "src-path" is added as "inc-path"
final CmdPathOption srcPathOpt = (CmdPathOption) cmdLine.getOptions()
.getById(SrcPathOptionHandler.SRC_PATH_ID);
if (srcPathOpt.getPathValue(cmdLine) != null) {
incPaths.addAll(srcPathOpt.getPathValue(cmdLine));
}
if (includePathOpt.getValue(cmdLine) != null) {
incPaths.addAll(includePathOpt.getPathValue(cmdLine));
}
// "out-path is added as "inc-path"
incPaths.add(OutPathOptionHandler.getOutPath(context).getAbsolutePath());
CompilerContextHelper.setIncPath(context, incPaths);
} else if (LDFLAGS_ID.equals(cmdOption.getId())) {
// process LDFlags
final CmdAppendOption ldFlagsOpt = Assert.assertInstanceof(cmdOption,
CmdAppendOption.class);
final List<String> ldFlagsList = new ArrayList<String>(
CompilerContextHelper.getLDFlags(context));
final String value = ldFlagsOpt.getValue(cmdLine);
if (value != null && value.length() > 0) {
ldFlagsList.addAll(DirectiveHelper.splitOptionString(value));
}
CompilerContextHelper.setLDFlags(context, ldFlagsList);
} else if (LD_PATH_ID.equals(cmdOption.getId())) {
// process ld-path
final CmdPathOption ldPathOpt = Assert.assertInstanceof(cmdOption,
CmdPathOption.class);
final List<String> ldPaths = ldPathOpt.getPathValue(cmdLine);
final List<String> ldFlagsList = new ArrayList<String>(
CompilerContextHelper.getLDFlags(context));
if (ldPaths != null) {
for (final String ld : ldPaths) {
final File ldDir = new File(ld);
ldFlagsList.add("-L");
ldFlagsList.add(ldDir.getAbsolutePath());
}
}
CompilerContextHelper.setLDFlags(context, ldFlagsList);
} else if (LINKER_SCRIPT_ID.equals(cmdOption.getId())) {
final CmdArgument linkerScriptOpt = Assert.assertInstanceof(cmdOption,
CmdArgument.class);
final String linkerScript = linkerScriptOpt.getValue(cmdLine);
if (linkerScript != null) {
final URL linkerScriptURL = SrcPathOptionHandler.getSourceClassLoader(
context).getResource(linkerScript);
if (linkerScriptURL == null) {
throw new InvalidCommandLineException("Invalid linker script: '"
+ linkerScript + "'. Cannot find file in the source path", 1);
}
CompilerContextHelper.setLinkerScript(context,
linkerScriptURL.getPath());
}
} else {
Assert.fail("Unknown id '" + cmdOption.getId() + "'");
}
}
}