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.DelphiCompilerProcessAdapter;
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 DelphiBackendCompiler extends PascalBackendCompiler {
public static final String DELPHI_STARTER_RESPONSE = "This version of the product does not support command line compiling";
private static final String COMPILER_SETTING_OPATH_EXE = "-E";
private static final String COMPILER_SETTING_OPATH_UNIT = "-N";
private static final String COMPILER_SETTING_OPATH_UNIT_D2007 = "-N0";
private static final String COMPILER_SETTING_COMMON = "";
private static final String COMPILER_SETTING_SRCPATH = "-U";
private static final String COMPILER_SETTING_INCPATH = "-I";
private static final String COMPILER_SETTING_BUILDALL = "-B";
private static final String COMPILER_SETTING_BUILDMODIFIED = "-M";
private static final String NAME = "Delphi";
public DelphiBackendCompiler(CompilerMessager compilerMessager) {
super(compilerMessager);
}
@NotNull
public String getId() {
return NAME;
}
@Override
public ProcessAdapter getCompilerProcessAdapter(CompilerMessager messager) {
return new DelphiCompilerProcessAdapter(messager);
}
@Override
public String getCompiledUnitExt() {
return ".dcu";
}
@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.getDCC32Executable(sdkHomePath), compilerCommand);
if (null == executable) return false;
commandLine.add(executable.getPath());
if (pascalSdkData != null) {
String[] compilerOptions = pascalSdkData.get(PascalSdkData.Keys.COMPILER_OPTIONS.getKey()).split("\\s+");
Collections.addAll(commandLine, compilerOptions);
}
commandLine.add(COMPILER_SETTING_COMMON);
if (isRebuild) {
commandLine.add(COMPILER_SETTING_BUILDALL);
} else {
commandLine.add(COMPILER_SETTING_BUILDMODIFIED);
}
commandLine.add(COMPILER_SETTING_OPATH_UNIT + outputDirUnit);
commandLine.add(COMPILER_SETTING_OPATH_UNIT_D2007 + outputDirUnit);
if (StringUtil.isEmpty(outputDirExe)) {
commandLine.add(COMPILER_SETTING_OPATH_EXE + outputDirUnit);
} else {
commandLine.add(COMPILER_SETTING_OPATH_EXE + outputDirExe);
}
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);
}
return true;
}
}