- enhancement: add the option "Set Encoding for the Executable" to project's compiler options

- fix: can't correctly compile when link params are seperated by line breaks
This commit is contained in:
Roy Qu 2022-06-22 17:08:35 +08:00
parent 85c18d1f66
commit 20690b7e51
12 changed files with 766 additions and 600 deletions

View File

@ -1,6 +1,8 @@
Red Panda C++ Version 1.1.2
- enhancement: use different color to differenciate folder and headers in completion popup window
- enhancement: auto add "/" to folder when completing #include headers
- enhancement: add the option "Set Encoding for the Executable" to project's compiler options
- fix: can't correctly compile when link params are seperated by line breaks
Red Panda C++ Version 1.1.1
- enhancement: adjust the appearance of problem case's input/output/expected control

View File

@ -4882,7 +4882,15 @@
<translation type="unfinished"></translation>
</message>
<message>
<source>Add encoding options to compiler</source>
<source>ANSI</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UTF-8</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Set Encoding for the executable:</source>
<translation type="unfinished"></translation>
</message>
</context>

File diff suppressed because it is too large Load Diff

View File

@ -4882,7 +4882,15 @@
<translation type="unfinished"></translation>
</message>
<message>
<source>Add encoding options to compiler</source>
<source>ANSI</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UTF-8</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Set Encoding for the executable:</source>
<translation type="unfinished"></translation>
</message>
</context>

View File

@ -359,14 +359,18 @@ QString Compiler::getCCompileArguments(bool checkSyntax)
}
if (compilerSet()->useCustomCompileParams() && !compilerSet()->customCompileParams().isEmpty()) {
result += " "+ parseMacros(compilerSet()->customCompileParams());
QStringList params = textToLines(compilerSet()->customCompileParams());
foreach(const QString& param, params)
result += " "+ parseMacros(param);
}
if (mProject) {
QString s = mProject->options().compilerCmd;
if (!s.isEmpty()) {
s.replace("_@@_", " ");
result += " "+parseMacros(s);
QStringList params = textToLines(s);
foreach(const QString& param, params)
result += " "+ parseMacros(param);
}
}
return result;
@ -396,13 +400,17 @@ QString Compiler::getCppCompileArguments(bool checkSyntax)
}
}
if (compilerSet()->useCustomCompileParams() && !compilerSet()->customCompileParams().isEmpty()) {
result += " "+ parseMacros(compilerSet()->customCompileParams());
QStringList params = textToLines(compilerSet()->customCompileParams());
foreach(const QString& param, params)
result += " "+ parseMacros(param);
}
if (mProject) {
QString s = mProject->options().cppCompilerCmd;
if (!s.isEmpty()) {
s.replace("_@@_", " ");
result += " "+parseMacros(s);
QStringList params = textToLines(s);
foreach(const QString& param, params)
result += " "+ parseMacros(param);
}
}
return result;
@ -507,7 +515,11 @@ QString Compiler::getLibraryArguments(FileType fileType)
// Add global compiler linker extras
if (compilerSet()->useCustomLinkParams() && !compilerSet()->customLinkParams().isEmpty()) {
result += " "+compilerSet()->customLinkParams();
QStringList params = textToLines(compilerSet()->customLinkParams());
if (!params.isEmpty()) {
foreach(const QString& param, params)
result += " " + param;
}
}
if (mProject) {
@ -519,7 +531,11 @@ QString Compiler::getLibraryArguments(FileType fileType)
QString s = mProject->options().linkerCmd;
if (!s.isEmpty()) {
s.replace("_@@_", " ");
result += " "+s;
QStringList params = textToLines(s);
if (!params.isEmpty()) {
foreach(const QString& param, params)
result += " " + param;
}
}
}
if (mProject->options().staticLink)

View File

@ -388,22 +388,36 @@ void ProjectCompiler::writeMakeObjFilesRules(QFile &file)
QString encodingStr;
if (compilerSet()->compilerType() != COMPILER_CLANG && mProject->options().addCharset) {
QByteArray defaultSystemEncoding=pCharsetInfoManager->getDefaultSystemEncoding();
QByteArray encoding = mProject->options().execEncoding;
QByteArray targetEncoding;
QByteArray sourceEncoding;
if ( encoding == ENCODING_SYSTEM_DEFAULT || encoding.isEmpty()) {
targetEncoding = defaultSystemEncoding;
} else if (encoding == ENCODING_UTF8_BOM) {
targetEncoding = "UTF-8";
} else {
targetEncoding = encoding;
}
if (unit->encoding() == ENCODING_AUTO_DETECT) {
Editor* editor = mProject->unitEditor(unit);
if (editor && editor->fileEncoding()!=ENCODING_ASCII
&& editor->fileEncoding()!=defaultSystemEncoding)
encodingStr = QString(" -finput-charset=%1 -fexec-charset=%2")
.arg(QString(editor->fileEncoding()),
QString(defaultSystemEncoding));
&& editor->fileEncoding()!=targetEncoding) {
sourceEncoding = editor->fileEncoding();
} else {
sourceEncoding = targetEncoding;
}
} else if (unit->encoding()==ENCODING_SYSTEM_DEFAULT) {
// encodingStr = QString(" -finput-charset=%1 -fexec-charset=%2")
// .arg(QString(defaultSystemEncoding),
// QString(defaultSystemEncoding));
sourceEncoding = defaultSystemEncoding;
} else if (unit->encoding()!=ENCODING_ASCII && !unit->encoding().isEmpty()
&& unit->encoding()!=defaultSystemEncoding) {
&& unit->encoding()!=targetEncoding) {
sourceEncoding = unit->encoding();
}
if (sourceEncoding!=targetEncoding) {
encodingStr = QString(" -finput-charset=%1 -fexec-charset=%2")
.arg(QString(unit->encoding()),
QString(defaultSystemEncoding));
.arg(QString(sourceEncoding),
QString(targetEncoding));
}
}

View File

@ -911,6 +911,7 @@ void Project::saveOptions()
}
ini.SetLongValue("Project","StaticLink", mOptions.staticLink);
ini.SetLongValue("Project","AddCharset", mOptions.addCharset);
ini.SetValue("Project","ExecEncoding", mOptions.execEncoding);
ini.SetValue("Project","Encoding",toByteArray(mOptions.encoding));
ini.SetLongValue("Project","ModelType", (int)mOptions.modelType);
//for Red Panda Dev C++ 6 compatibility
@ -1666,6 +1667,7 @@ void Project::loadOptions(SimpleIni& ini)
}
mOptions.staticLink = ini.GetBoolValue("Project", "StaticLink", true);
mOptions.execEncoding = ini.GetValue("Project","ExecEncoding", ENCODING_SYSTEM_DEFAULT);
mOptions.addCharset = ini.GetBoolValue("Project", "AddCharset", true);
if (mOptions.compilerSetType<0) {

View File

@ -15,6 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include "projectoptions.h"
#include "utils.h"
ProjectVersionInfo::ProjectVersionInfo()
{
@ -53,4 +54,5 @@ ProjectOptions::ProjectOptions()
staticLink = true;
addCharset = true;
modelType = ProjectModelType::FileSystem;
execEncoding = ENCODING_SYSTEM_DEFAULT;
}

View File

@ -89,6 +89,7 @@ struct ProjectOptions{
QString cmdLineArgs;
bool staticLink;
bool addCharset;
QByteArray execEncoding;
QString encoding;
ProjectModelType modelType;
};

View File

@ -19,6 +19,7 @@
#include "../settings.h"
#include "../project.h"
#include "../mainwindow.h"
#include "../platform.h"
ProjectCompilerWidget::ProjectCompilerWidget(const QString &name, const QString &group, QWidget *parent) :
SettingsWidget(name,group,parent),
@ -37,8 +38,8 @@ void ProjectCompilerWidget::refreshOptions()
Settings::PCompilerSet pSet = pSettings->compilerSets().getSet(ui->cbCompilerSet->currentIndex());
if (!pSet)
return;
ui->chkAddCharset->setVisible(pSet->compilerType()!=COMPILER_CLANG);
ui->chkAddCharset->setEnabled(pSet->compilerType()!=COMPILER_CLANG);
ui->panelAddCharset->setVisible(pSet->compilerType()!=COMPILER_CLANG);
//ui->chkAddCharset->setEnabled(pSet->compilerType()!=COMPILER_CLANG);
mOptions = pMainWindow->project()->options().compilerOptions;
if (mOptions.isEmpty())
mOptions = pSet->compileOptions();
@ -46,6 +47,27 @@ void ProjectCompilerWidget::refreshOptions()
ui->tabOptions->resetUI(pSet,mOptions);
ui->chkStaticLink->setChecked(pSet->staticLink());
QByteArray execEncoding = pMainWindow->project()->options().execEncoding;
if (execEncoding == ENCODING_AUTO_DETECT
|| execEncoding == ENCODING_SYSTEM_DEFAULT
|| execEncoding == ENCODING_UTF8) {
int index =ui->cbEncoding->findData(execEncoding);
ui->cbEncoding->setCurrentIndex(index);
ui->cbEncodingDetails->clear();
ui->cbEncodingDetails->setVisible(false);
} else {
QString encoding = execEncoding;
QString language = pCharsetInfoManager->findLanguageByCharsetName(encoding);
ui->cbEncoding->setCurrentText(language);
ui->cbEncodingDetails->setVisible(true);
ui->cbEncodingDetails->clear();
QList<PCharsetInfo> infos = pCharsetInfoManager->findCharsetsByLanguageName(language);
foreach (const PCharsetInfo& info, infos) {
ui->cbEncodingDetails->addItem(info->name);
}
ui->cbEncodingDetails->setCurrentText(encoding);
}
}
void ProjectCompilerWidget::doLoad()
@ -68,6 +90,12 @@ void ProjectCompilerWidget::doSave()
if (pSet->compilerType()!=COMPILER_CLANG)
pMainWindow->project()->options().addCharset = ui->chkAddCharset->isChecked();
pMainWindow->project()->options().staticLink = ui->chkStaticLink->isChecked();
if (ui->cbEncodingDetails->isVisible()) {
pMainWindow->project()->options().execEncoding = ui->cbEncodingDetails->currentText().toLocal8Bit();
} else {
pMainWindow->project()->options().execEncoding = ui->cbEncoding->currentData().toString().toLocal8Bit();
}
pMainWindow->project()->saveOptions();
}
@ -77,6 +105,13 @@ void ProjectCompilerWidget::init()
for (size_t i=0;i<pSettings->compilerSets().size();i++) {
ui->cbCompilerSet->addItem(pSettings->compilerSets().getSet(i)->name());
}
ui->cbEncodingDetails->setVisible(false);
ui->cbEncoding->clear();
ui->cbEncoding->addItem(tr("ANSI"),ENCODING_SYSTEM_DEFAULT);
ui->cbEncoding->addItem(tr("UTF-8"),ENCODING_UTF8);
foreach (const QString& langName, pCharsetInfoManager->languageNames()) {
ui->cbEncoding->addItem(langName,langName);
}
SettingsWidget::init();
}
@ -85,3 +120,27 @@ void ProjectCompilerWidget::on_cbCompilerSet_currentIndexChanged(int)
refreshOptions();
}
void ProjectCompilerWidget::on_cbEncoding_currentTextChanged(const QString &arg1)
{
QString userData = ui->cbEncoding->currentData().toString();
if (userData == ENCODING_AUTO_DETECT
|| userData == ENCODING_SYSTEM_DEFAULT
|| userData == ENCODING_UTF8) {
ui->cbEncodingDetails->setVisible(false);
ui->cbEncodingDetails->clear();
} else {
ui->cbEncodingDetails->setVisible(true);
ui->cbEncodingDetails->clear();
QList<PCharsetInfo> infos = pCharsetInfoManager->findCharsetsByLanguageName(userData);
foreach (const PCharsetInfo& info, infos) {
ui->cbEncodingDetails->addItem(info->name);
}
}
}
void ProjectCompilerWidget::on_cbEncodingDetails_currentTextChanged(const QString &arg1)
{
}

View File

@ -48,6 +48,8 @@ public:
void init() override;
private slots:
void on_cbCompilerSet_currentIndexChanged(int index);
void on_cbEncoding_currentTextChanged(const QString &arg1);
void on_cbEncodingDetails_currentTextChanged(const QString &arg1);
};
#endif // PROJECTCOMPILERWIDGET_H

View File

@ -14,6 +14,16 @@
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="6" column="0" colspan="3">
<widget class="QWidget" name="widget" native="true"/>
</item>
<item row="2" column="0" colspan="3">
<widget class="QCheckBox" name="chkStaticLink">
<property name="text">
<string>Statically link libraries</string>
</property>
</widget>
</item>
<item row="0" column="2">
<spacer name="horizontalSpacer">
<property name="orientation">
@ -27,19 +37,9 @@
</property>
</spacer>
</item>
<item row="6" column="0" colspan="3">
<widget class="QWidget" name="widget" native="true"/>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="cbCompilerSet"/>
</item>
<item row="2" column="0" colspan="3">
<widget class="QCheckBox" name="chkStaticLink">
<property name="text">
<string>Statically link libraries</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
@ -47,13 +47,6 @@
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="chkAddCharset">
<property name="text">
<string>Add encoding options to compiler</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
@ -68,6 +61,50 @@
</property>
</widget>
</item>
<item row="3" column="0" colspan="3">
<widget class="QWidget" name="panelAddCharset" native="true">
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QCheckBox" name="chkAddCharset">
<property name="text">
<string>Set Encoding for the executable:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="cbEncoding"/>
</item>
<item>
<widget class="QComboBox" name="cbEncodingDetails"/>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<customwidgets>