package com.siberika.idea.pascal.jps.compiler;
import com.intellij.execution.process.ProcessAdapter;
import com.intellij.openapi.util.text.StringUtil;
import com.siberika.idea.pascal.jps.builder.FPCCompilerProcessAdapter;
import com.siberika.idea.pascal.jps.sdk.PascalSdkData;
import com.siberika.idea.pascal.jps.sdk.PascalSdkUtil;
import com.siberika.idea.pascal.jps.util.FileUtil;
import com.siberika.idea.pascal.jps.util.ParamMap;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Author: George Bakhtadze
* Date: 1/6/13
*/
public class FPCBackendCompiler extends PascalBackendCompiler {
private static final String COMPILER_SETTING_OPATH_EXE = "-FE";
private static final String COMPILER_SETTING_OPATH_UNIT = "-FU";
private static final String COMPILER_SETTING_COMMON = "-viewnb";
private static final String COMPILER_SETTING_SRCPATH = "-Fu";
private static final String COMPILER_SETTING_INCPATH = "-Fi";
private static final String COMPILER_SETTING_BUILDALL = "-B";
private static final String NAME = "FPC";
public FPCBackendCompiler(CompilerMessager compilerMessager) {
super(compilerMessager);
}
@NotNull
public String getId() {
return NAME;
}
@Override
public ProcessAdapter getCompilerProcessAdapter(CompilerMessager messager) {
return new FPCCompilerProcessAdapter(messager);
}
@Override
public String getCompiledUnitExt() {
return ".ppu";
}
@Override
protected boolean createStartupCommandImpl(String sdkHomePath, String moduleName, String outputDirExe, String outputDirUnit,
List<File> sdkFiles, List<File> moduleLibFiles, boolean isRebuild,
@Nullable ParamMap pascalSdkData, ArrayList<String> commandLine) {
String compilerCommand = pascalSdkData != null ? pascalSdkData.get(PascalSdkData.Keys.COMPILER_COMMAND.getKey()) : null;
File executable = checkCompilerExe(sdkHomePath, moduleName, compilerMessager, PascalSdkUtil.getFPCExecutable(sdkHomePath), compilerCommand);
if (null == executable) return false;
commandLine.add(executable.getPath());
commandLine.add(COMPILER_SETTING_COMMON);
if (isRebuild) {
commandLine.add(COMPILER_SETTING_BUILDALL);
}
if (StringUtil.isEmpty(outputDirExe)) {
commandLine.add(COMPILER_SETTING_OPATH_EXE + outputDirUnit);
} else {
commandLine.add(COMPILER_SETTING_OPATH_EXE + outputDirExe);
commandLine.add(COMPILER_SETTING_OPATH_UNIT + outputDirUnit);
}
for (File sourceRoot : FileUtil.retrievePaths(moduleLibFiles)) {
addLibPathToCmdLine(commandLine, sourceRoot, COMPILER_SETTING_SRCPATH, COMPILER_SETTING_INCPATH);
}
for (File sdkPath : FileUtil.retrievePaths(sdkFiles)) {
addLibPathToCmdLine(commandLine, sdkPath, COMPILER_SETTING_SRCPATH, COMPILER_SETTING_INCPATH);
}
if (pascalSdkData != null) {
String[] compilerOptions = pascalSdkData.get(PascalSdkData.Keys.COMPILER_OPTIONS.getKey()).split("\\s+");
Collections.addAll(commandLine, compilerOptions);
}
return true;
}
}