Code::Blocks Forums

Developer forums (C::B DEVELOPMENT STRICTLY!) => Plugins development => Topic started by: LETARTARE on May 20, 2023, 04:00:55 pm

Title: Plugin 'compilergcc'
Post by: LETARTARE on May 20, 2023, 04:00:55 pm
With the 'compilergcc' plugin in 'int CompilerGCC::Run(ProjectBuildTarget* target)' we find
Code
 Manager::Get()->GetLogManager()->Log(_("Checking for existence: ") + f.GetFullPath(), m_PageIndex);
    if ( (target->GetTargetType() != ttCommandsOnly) && !wxFileExists(f.GetFullPath()) )
    {
        int ret = cbMessageBox(_("It seems that this project has not been built yet.\n"
                                 "Do you want to build it now?"),
                               _("Information"),
                               wxYES_NO | wxCANCEL | wxICON_QUESTION);
        switch (ret)
        {
            case wxID_YES:
            {
                m_pProject->SetCurrentlyCompilingTarget(0);
                m_RunAfterCompile = true;
                Build(target);
                return -1;
            }
            case wxID_NO:
                break;
            default:
                m_pProject->SetCurrentlyCompilingTarget(0);
                return -1;
        }
    }
This verifies that the executable exists, because '&Run' has been activated.

Instead, '&Run' should be invalidated if the executable does not exist. This could be done automatically in
'void CompilerGCC::OnUpdateUI(wxUpdateUIEvent& event)' by :
Code
    ...
    cbProject* prj = projectManager->GetActiveProject();
    cbEditor* ed = Manager::Get()->GetEditorManager()->GetBuiltinActiveEditor();
/// new
    if (id == idMenuRun)
    {
        event.Enable(exeExists(prj));
    }
    else
    ...
with 'exeExists(prj)' which would indicate whether the executable exists for example :
Code
bool CompilerGCC::exeExists(cbProject* prj)
{
    bool valid = false;
    if (prj)
    {
        ProjectBuildTarget* pTarget = prj->GetBuildTarget(prj->GetActiveBuildTarget());
        if (pTarget)
        {
            wxString out = UnixFilename(pTarget->GetOutputFilename());
            Manager::Get()->GetMacrosManager()->ReplaceEnvVars(out);
            wxFileName file(out);
            file.MakeAbsolute(prj->GetBasePath());
            valid = ::wxFileExists(file.GetFullPath());
            valid = valid || (pTarget->GetTargetType() == ttCommandsOnly) ;
        }
    }

    return valid;
}
This approach seems to me to be more correct than checking afterwards whether the action taken is correct.
Because in the options allowed to the user: the option 'wxID_NO' leads to run anyway with an error !!

What do you think about this?
Title: Re: Plugin 'compilergcc'
Post by: killerbot on May 20, 2023, 04:46:57 pm
I agree, providing the user to click on something while we (the system) knows this is not possible, is not user friendly.

Would there still be added value in checking afterwards ... ?
Title: Re: Plugin 'compilergcc'
Post by: LETARTARE on May 20, 2023, 05:23:54 pm
I don't think so. But this needs to be checked by other people.
It would then be necessary to delete the code presented first, which is no longer useful.

There is the same kind of code for 'int CompilerGCC::RunSingleFile(const wxString& filename)'.
Title: Re: Plugin 'compilergcc'
Post by: LETARTARE on May 22, 2023, 09:20:15 am
Can I submit a ticket for a patch request ?
Title: Re: Plugin 'compilergcc'
Post by: killerbot on May 22, 2023, 10:21:04 am
sure
Title: Re: Plugin 'compilergcc'
Post by: LETARTARE on May 23, 2023, 05:37:48 pm
I created a ticket with a patch  https://sourceforge.net/p/codeblocks/tickets/1395/ (https://sourceforge.net/p/codeblocks/tickets/1395/)
Title: Re: Plugin 'compilergcc'
Post by: LETARTARE on May 30, 2023, 03:10:27 pm
Fixed in 'r13278'.