Assuming I understand the idea being discussed, the following would be the core of the necessary changes (I think):
Index: src/plugins/compilergcc/compilergcc.cpp
===================================================================
--- src/plugins/compilergcc/compilergcc.cpp	(revision 8684)
+++ src/plugins/compilergcc/compilergcc.cpp	(working copy)
@@ -1880,9 +1880,15 @@
     else
     {
         // commands-only target?
-        cbMessageBox(_("You can't \"run\" a commands-only target..."));
-        m_pProject->SetCurrentlyCompilingTarget(0);
-        return -1;
+        if (target->GetHostApplication().IsEmpty())
+        {
+            cbMessageBox(_("You must select a host application to \"run\" a commands-only target..."));
+            m_pProject->SetCurrentlyCompilingTarget(0);
+            return -1;
+        }
+        Manager::Get()->GetMacrosManager()->ReplaceEnvVars(hostapStr);
+        command << hostapStr << strSPACE;
+        command << target->GetExecutionParameters();
     }
 
     wxString script = command;
@@ -1903,7 +1909,7 @@
         cmd << command;
 
     Manager::Get()->GetLogManager()->Log(_("Checking for existence: ") + f.GetFullPath(), m_PageIndex);
-    if (!wxFileExists(f.GetFullPath()))
+    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?"),
(Note: this code was very quickly stuck together; do 
not commit without changing/fixing/polishing.)