unit refreshexecutableunit; {$mode objfpc}{$H+} interface uses Classes, SysUtils; procedure refreshExecutable(myDir: string); implementation uses baseunix, systemunit, process, lowLevelUnit; procedure refreshExecutable(myDir: string); var tmpDir,output,summeEins: string; args: array of string; begin output:=''; tmpDir:=mkTemp('-d /tmp/fpc.XXXXXX'); mkdir(tmpDir+'/lib'); setlength(args,15); args[0]:='-MObjFPC'; args[1]:='-Scghi'; args[2]:='-Cg'; args[3]:='-CirotR'; args[4]:='-O3'; args[5]:='-g'; args[6]:='-gl'; args[7]:='-l'; args[8]:='-vewnhibq'; args[9]:='-Fi'+tmpDir+'/lib'; args[10]:='-Fu../units'; args[11]:='-Fu.'; args[12]:='-FU'+tmpDir+'/lib'; args[13]:=myDir+extractFileName(paramstr(0)); if fileexists(args[13]+'.lpr') then args[13]:=args[13]+'.lpr' else args[13]:=args[13]+'.pas'; args[14]:='-o'+tmpDir+'/output'; if runCommandInDir(myDir,'fpc',args,output) then begin setlength(args,2); args[0]:=tmpDir+'/output'; args[1]:=paramstr(0); if runCommand('sha512sum',args,output) then begin summeEins:=erstesArgument(output,#10); if erstesArgument(summeEins)<>erstesArgument(output) then begin deletefile(paramstr(0)); if runCommand('mv',args,output) then begin setlength(args,2); args[0]:='-rf'; args[1]:=tmpDir; if runCommand('rm',args,output) then begin fpExecVe(paramstr(0),argv,envp); raise exception.create('Fehler beim Ersetzen der Executable!'); end; end; end; end; end; if (tmpDir<>'') and directoryexists(tmpDir) then begin setlength(args,2); args[0]:='-rf'; args[1]:=tmpDir; runCommand('rm',args,output); end; setlength(args,0); end; end.