class Compiler
{
private $c_cpp;
private $version;
private $mode;
private $compiler;
private $project;
private $includes;
private $library_paths;
private $libraries;
public function __construct()
{
$this->top();
if(!isset($_GET["prj"])) // se non è definito il nome del progetto da compilare
{
$this->form(); // compare il form di selezione
}
else
{
$this->init(); // inizializzazione
if(isset($_GET["clr"])) // pulisce e ricompila soluzione
{
$files = glob($this->path . "/debug/*");
foreach($files as $file)
{
if(is_file($file))
{
unlink($file);
}
}
}
$this->compileProject(); // compilazione
$this->linkProject(); // link
$this->executeProject(); // execute
}
$this->bottom();
}
private function top()
{
print"<!DOCTYPE html>\n";
print"<html>\n";
print"<head>\n";
print"<style>\n";
print"body{font-family:Arial, Helvetica, sans-serif; background-color:#111; color:#ccc;}\n";
print"table, th, td{border:1px solid #333;padding:2px;}\n";
print"div{margin:10px;}\n";
print"input[type=submit]{background-color:#05f; color:#fff; padding:5px; cursor:pointer; border:0;}\n";
print".top{position:fixed; top:0; left:0; background-color:#05f; color:#fff; margin:0; width:100%; padding-left:10px;}\n";
print".main{margin-top:150px;}\n";
print".code{font-family:Courier New, monospace;}\n";
print"</style>\n";
print"</head>\n";
print"<body>\n";
print"<div class=\"top\"><h1>MinGW C/C++</h1>\n";
print"<h6>Cosimo Saccone</h6></div>\n";
print"<div class=\"main\">\n";
}
private function form()
{
print"<h3>project</h3>\n";
print"<form action=\"index.php\" method=\"GET\">\n";
print"<input type=\"text\" name=\"prj\">\n";
print"<input type=\"submit\" value=\"open\">\n";
print"</form>\n";
}
private function bottom()
{
print"</div>\n";
print"</body>\n";
print"</html>";
}
private function getName($str)
{
$p = strrpos($str, "/");
$q = strpos($str, ".");
return substr($str, $p + 1, $q - $p - 1); // dalla stringa del file elimina il percorso e il formato
}
private function newProject()
{
$str = "";
$str .= "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
$str .= "<root>\n";
$str .= "<c_cpp>g++</c_cpp>\n";
$str .= "<version>-std=c++0x</version>\n";
$str .= "<mode>exe</mode>\n";
$str .= "<include>\n";
$str .= "<path>C:/MinGW/include</path>\n";
$str .= "<path>C:/Users/aquar/Desktop/cosimo/glm/glm</path>\n";
$str .= "<path>C:/Users/aquar/Desktop/cosimo/glfw-3.3.6.bin.WIN32/include</path>\n";
$str .= "<path>C:/Users/aquar/Desktop/cosimo/SFML-2.5.1/include</path>\n";
$str .= "<path>C:/Users/aquar/Desktop/cosimo/freeglut/include</path>\n";
$str .= "<path>C:/Users/aquar/Desktop/cosimo/freetype-2.3.5/include</path>\n";
$str .= "<path>C:/Users/aquar/Desktop/cosimo/freetype-2.3.5/include/freetype2</path>\n";
$str .= "<path>C:/Users/aquar/Desktop/cosimo/glew-2.1.0-win32/glew-2.1.0/include</path>\n";
$str .= "</include>\n";
$str .= "<library>\n";
$str .= "<path>C:/MinGW/lib</path>\n";
$str .= "<path>C:/Users/aquar/Desktop/cosimo/glfw-3.3.6.bin.WIN32/lib-mingw</path>\n";
$str .= "<path>C:/Users/aquar/Desktop/cosimo/SFML-2.5.1/lib</path>\n";
$str .= "<path>C:/Users/aquar/Desktop/cosimo/freeglut/lib</path>\n";
$str .= "<path>C:/Users/aquar/Desktop/cosimo/freetype-2.3.5/lib</path>\n";
$str .= "<path>C:/Users/aquar/Desktop/cosimo/glew-2.1.0-win32/glew-2.1.0/lib</path>\n";
$str .= "<lib>glfw3dll</lib>\n";
$str .= "<lib>sfml-graphics</lib>\n";
$str .= "<lib>sfml-window</lib>\n";
$str .= "<lib>sfml-system</lib>\n";
$str .= "<lib>freeglut</lib>\n";
$str .= "<lib>glew32</lib>\n";
$str .= "<lib>glu32</lib>\n";
$str .= "<lib>opengl32</lib>\n";
$str .= "<lib>freetype</lib>\n";
$str .= "</library>\n";
$str .= "<compDec>\n";
$str .= "-Wl,--disable-stdcall-fixup\n";
$str .= "</compDec>\n";
$str .= "<precompiled>\n";
$str .= "windres C:/xampp/htdocs/compiler/g++/SFML/resource/my.rc C:/xampp/htdocs/compiler/g++/SFML/debug/my.o\n";
$str .= "</precompiled>\n";
$str .= "</root>\n";
$file = fopen($this->path . "/make.xml", "w") or die("Unable to open file!");
fwrite($file, $str);
fclose($file);
$str = "";
$str .= "#include <gl/freeglut.h>\n";
$str .= "\n";
$str .= "void display()\n";
$str .= "{\n";
$str .= "\t// 2d\n";
$str .= "\tglClearColor(0.0f, 0.0f, 0.0f, 0.0f);\n";
$str .= "\tglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n";
$str .= "\tGLint v[4];\n";
$str .= "\tglGetIntegerv(GL_VIEWPORT, v);\n";
$str .= "\tglMatrixMode(GL_PROJECTION);\n";
$str .= "\tglLoadIdentity();\n";
$str .= "\tglOrtho(0, v[2], v[3], 0, 0, 1);\n";
$str .= "\tglMatrixMode(GL_MODELVIEW);\n";
$str .= "\tglLoadIdentity();\n";
$str .= "\t//\n";
$str .= "\tglutSwapBuffers();\n";
$str .= "}\n";
$str .= "\n";
$str .= "int main(int argc, char **argv)\n";
$str .= "{\n";
$str .= "\tglutInit(&argc, argv);\n";
$str .= "\tglutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);\n";
$str .= "\tglutInitWindowPosition(100,100);\n";
$str .= "\tglutInitWindowSize(500, 500);\n";
$str .= "\tglutCreateWindow(\"window\");\n";
$str .= "\tglutDisplayFunc(display);\n";
$str .= "\tglutMainLoop();\n";
$str .= "}";
$file = fopen($this->path . "/main.cpp", "w") or die("Unable to open file!");
fwrite($file, $str);
fclose($file);
}
private function init()
{
$this->compiler = str_replace(chr(92), chr(47), getcwd()) . "/"; // indirizzo del compiler
$this->project = $_GET["prj"];
$this->path = $this->compiler . $this->project;
if(!is_dir($this->path)) // se la cartella manca viene creato un nuovo progetto
{
mkdir($this->path . "/debug", 0777, true); // creazione della cartella di debug
mkdir($this->path . "/log", 0777, true); // creazione della cartella di log
$this->newProject();
header("Refresh:0");
}
else
{
$xml = simplexml_load_file($this->path . "/make.xml"); // xml
$include_path = @$xml->include->path; // array con tutti gli include
$library_path = @$xml->library->path; // array con tutti i percorsi per le librerie
$library = @$xml->library->lib; // array con tutte le librerie
$this->c_cpp = @$xml->c_cpp; // C o C++
$this->version = @$xml->version;
$this->mode = @$xml->mode; // exe, dll, lib
$this->preprocessing = @$xml->preprocessing->set;
$this->precompiled = @$xml->precompiled;
$this->compDec = @$xml->compDec;
$this->linkDec = @$xml->linkDec;
$this->includes = "";
$this->library_paths = "";
$this->libraries = "";
$len = @count($include_path);
for($i = 0; $i < $len; $i++)
{
if(strlen($include_path[$i]) > 0)
{
$this->includes .= "-I " . $include_path[$i] . " ";
}
}
$len = @count($library_path);
for($i = 0; $i < $len; $i++)
{
if(strlen($library_path[$i]) > 0)
{
$this->library_paths .= "-L " . $library_path[$i] . " ";
}
}
$len = @count($library);
for($i = 0; $i < $len; $i++)
{
if(strlen($library[$i]) > 0)
{
$this->libraries .= "-l" . $library[$i] . " ";
}
}
print("<h3>" . $this->project . "</h3>");
}
}
private function compileProject()
{
$count = 0;
$str = "";
foreach(glob($this->path . "/*.cpp") as $file)
{
$filename = $this->getName($file);
$file_cpp = $this->path . "/" . $filename . ".cpp";
$file_o = $this->path . "/debug/" . $filename . ".o";//print($file_cpp."<br>");
if(file_exists($file_o))
{
$date_cpp = intval(date("YmdHis", filemtime($file_cpp)));
$date_o = intval(date("YmdHis", filemtime($file_o)));
if($date_cpp > $date_o) // se la data del file cpp è superiore a quella dell'obj il file va ricompilato
{
$str .= " -c " . $file_cpp;
$count++;
}
}
else
{
$str .= " -c " . $file_cpp;
$count++;
}
}
$str = $this->c_cpp . " -g " . $this->version . " " . @$this->preprocessing . " " . $this->includes . $str . " > " . $this->path . "/log/compiling.log 2>&1";
print("<div class = \"code\">");
if($count > 0)
{
shell_exec($str);
clearstatcache();
print($str . "<br><br>");
}
print($count . " file(s) compiled...<br><br></div>");
foreach(glob($this->compiler . "*.o") as $file)
{
$filename = $this->getName($file);
rename($file, $this->path . "/debug/" . $filename . ".o"); // trasferisce tutti i file .o nella cartella debug
}
}
private function linkProject()
{
$str = "";
$name = $this->path . "/" . $this->project; // definizione del nome
if($this->mode == "exe")
{
$str .= $this->c_cpp . " " . $this->version . " -o " . $name . " "; // realizzazione di un eseguibile
}
else if($this->mode == "lib")
{
$str .= "ar -rcs " . $name . ".a "; // realizzazione di una libreria statica
}
else if($this->mode == "dll")
{
$str .= $this->c_cpp . " " . $this->version . " -shared -o " . $name . ".so "; // realizzazione di una libreria dinamica
}
else
{
print"mode ERROR<br>";
exit();
}
$str .= " " . $this->path . "/debug/*.o "; // tutti i file .o nella cartella debug
$str .= " " . $this->library_paths; // aggiunge i percorsi delle librerie
$str .= " " . $this->libraries; // aggiunge le librerie
$str .= " 2> " . $this->path . "/log/linking.log"; // scrive il log con gli errori
$str .= " " . $this->linkDec;
print("<div class=\"code\">" . $str . "<br><br>file(s) linked...<br><br></div>");
shell_exec($str);
clearstatcache();
print("<form action=\"index.php\" method=\"GET\">\n");
print("<input name=\"prj\" type=\"hidden\" value=\"" . $this->project . "\">\n");
print("<input name=\"clr\" type=\"submit\" value=\"clear solution\">\n");
print("</form>\n");
}
private function executeProject()
{
$str = $this->path . "/" . $this->project;
$str = "C:/xampp/htdocs/compiler/g++/SFML/SFML";
//system($str);
}
}
new Compiler();
Mi chiamo Cosimo Saccone e sono un programmatore napoletano di 44 anni con oltre 35 anni di esperienza nella programmazione (BASIC, Assembly). Realizzo progetti e programmi utilizzando i principali e più diffusi linguaggi (C, C++, PHP, Javascript, HTML) e software per la grafica (Photoshop, Illustrator, 3dsMax). Anche se la grafica rappresenta il mio principale settore di interesse, non disdegno il lavoro di back-end e di organizzazione dati e sono attento agli aspetti di efficienza e di risparmio delle risorse tipica della programmazione di basso livello (specie nel settore della grafica 3d). Realizzo siti internet, applicativi desktop e servizi di vario tipo. Ho una buona conoscenza della libreria OpenGL per lo sviluppo di applicazioni 3d interattive in C/C++. Cerco di adottare uno stile di programmazione fortemente ordinato e modulare. Possiedo, inoltre, una buona capacità di elaborazione della documentazione. Ho vari hobbies tra cui la pittura, la ginnastica e le lunghe passeggiate in solitudine.
Al fine di migliorare l’esperienza di navigazione sul nostro sito noi di cosimosaccone.com e i nostri partner selezionati elaboriamo i dati personali, compreso l’indirizzo IP e le pagine visitate, in relazione alla tua navigazione nei contenuti del sito, per i seguenti scopi:
Accesso alle informazioni
Dati precisi di geolocalizzazione
Misurazione del pubblico
Pubblicità e contenuti personalizzati
Ti ricordiamo che il termine cookie si riferisce a una porzione di dati inviati al tuo browser da un web server. Il cookie viene memorizzato sul tuo dispositivo e riconosciuto dal sito web che lo ha inviato in ogni navigazione successiva. Se vuoi saperne di più e compiere una scelta diversa, come il rifiuto del trattamento dei tuoi dati personali, clicca qui sulla nostra privacy policy. Potrai sempre modificare le tue scelte e impostare i singolo cookies selezionando il bottone qui sotto.
OK