Mehrere Dateien mit dem Kommandozeilen-Compiler kompilieren

Anfängerfragen zum Programmieren mit PureBasic.
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Mehrere Dateien mit dem Kommandozeilen-Compiler kompilieren

Beitrag von Andesdaf »

Hallo,

ich möchte abhängig vom Tag bestimmte Codes automatisch von PB kompilieren lassen. Dazu
erstelle ich eine Batch-Datei, die dann auf den Kommandozeilen-Compiler zugreifen soll.

Code: Alles auswählen

@rem auto-created batch file
cd "D:\Programme\PureBasic\PureBasic 5.21 (x86)\Compilers\"
pbcompiler "D:\GitHub\...\datei1.pb" /XP
pbcompiler "D:\GitHub\...\datei2.pb" /XP
ich kenn mich damit nicht besonders aus, jedenfalls funktioniert immer nur der erste Aufruf
und bei den folgenden gibt es einen Linker-Fehler, wohl weil immer gleich zurückgekehrt wird.
mit start /wait hab ich auch schon herumprobiert, hat aber nicht geholfen.

Hat jemand einen Lösungsweg parat, wie ich den Compiler sonst dazu bringen kann,
nacheinander mehrere Codes zu kompilieren und auszuführen?
Win11 x64 | PB 6.20
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Mehrere Dateien mit dem Kommandozeilen-Compiler kompilie

Beitrag von Bisonte »

Bastel dir ein PB Programm, das den Compiler aufruft.
Per RunProgram() kannst du ja die Abarbeitung abwarten bis der erste Aufruf fertig ist, dann den nächsten usw...

Evt. eine Textdatei einlesen wo dann halt drinsteht, was da compiliert werden soll.... dann kann man das ganze variabel halten.

So würde ich das jetzt machen... ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Mehrere Dateien mit dem Kommandozeilen-Compiler kompilie

Beitrag von ts-soft »

Versuch es mal mit absoluten Pfaden, der Compiler setzt das aktuelle Verzeichnis ja mehrmals neu.
(Nur eine Vermutung)

Code: Alles auswählen

@rem auto-created batch file
SET PBCOMPILER="D:\Programme\PureBasic\PureBasic 5.21 (x86)\Compilers\pbcompiler"
%PBCOMPILER% "D:\GitHub\...\datei1.pb" /XP
%PBCOMPILER% "D:\GitHub\...\datei2.pb" /XP
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: Mehrere Dateien mit dem Kommandozeilen-Compiler kompilie

Beitrag von Andesdaf »

@Bisonte: Das ist mein letzter Stand gewesen. Auch das hat nicht funktioniert.

Ich hatte mehrere Batch-Dateien gespeichert und dann versucht, sie
nacheinander mit RunProgram() und #PB_Program_Wait aufzurufen.
#PB_Program_Wait hatte keinen Effekt, er ist immer gleich zurückgekehrt
und hat die nächste Batch-Datei noch im selben Konsolenfenster angezeigt.

Ich dachte ok, vielleicht liegt's an der Batch-Datei, und hab das ganze mit direktem
Compiler-Aufruf auf Grundlage des Beispiels aus der PB-Hilfe zu RunProgram gemacht:
(hier nicht angepasst)

Code: Alles auswählen

  Compiler = RunProgram(#PB_Compiler_Home+"\Compilers\pbcompiler", "/?", "", #PB_Program_Open | #PB_Program_Read)
  Output$ = ""
  If Compiler  
    While ProgramRunning(Compiler)
      If AvailableProgramOutput(Compiler)
        Output$ + ReadProgramString(Compiler) + Chr(13)
      EndIf
    Wend
    Output$ + Chr(13) + Chr(13)
    Output$ + "Exitcode: " + Str(ProgramExitCode(Compiler))     
    
    CloseProgram(Compiler)
  EndIf
Resultat: gleiches Ergebnis wie vorher mit den einzelnen Batch-Dateien. Ich hab versucht, auf die
Ausgabe zu verzichten und wieder #PB_Program_Wait eingebaut, hier bekomme ich jetzt jedes Mal
den Fehler, dass iProgram nicht gültig sei. Ohne CloseProgram selber Effekt wie vorher.

Code: Alles auswählen

ForEach llCodes()
    iProgram = RunProgram(#PB_Compiler_Home + "\Compilers\pbcompiler", Chr(34) + llCodes() + Chr(34) + " /XP", "", #PB_Program_Wait)
    If iProgram
      CloseProgram(iProgram)
    Endif
Next
// EDIT: @ts-soft: Ich probiers mal.

// EDIT2: nein, hat nichts gebracht. Ich könnte jetzt zwar hinter jede Batch-Datei ein PAUSE setzen,
dann funktionierts, aber eigentlich möchte ich ja nichts weiter tun müssen.
Win11 x64 | PB 6.20
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Mehrere Dateien mit dem Kommandozeilen-Compiler kompilie

Beitrag von ts-soft »

Dann nutze das Compilerinterface, so wie im SDK beschrieben, dann bist Du auf der sicheren Seite.
Also Compiler mit Standby starten, Source, Target setzen, Compile mit Flags und dann auf SUCCESS warten.

Hört sich kompliziert und umständlich an, ist aber gar nicht so schwör (schwöre) :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: Mehrere Dateien mit dem Kommandozeilen-Compiler kompilie

Beitrag von Andesdaf »

ich hab's mal probiert:

Code: Alles auswählen

  iProgram = RunProgram(#PB_Compiler_Home + "\Compilers\pbcompiler", "/STANDBY", "", #PB_Program_Open | #PB_Program_Read)
  If IsProgram(iProgram)
    
    sReturn = ""
    Repeat
      If AvailableProgramOutput(iProgram)
        sReturn = ReadProgramString(iProgram)
        PrintN(sReturn)
      EndIf
    Until sReturn = "READY"
    
    ForEach llCodes()
    
      WriteProgramStringN(iProgram, "SOURCE" + #TAB$ + llCodes())
      WriteProgramStringN(iProgram, "INCLUDEPATH" + #TAB$ + "D:\GitHub\blabla\")
      WriteProgramStringN(iProgram, "TARGET" + #TAB$ + "D:\Dateien\blabla\temp\" + GetFilePart(llCodes()))
      WriteProgramStringN(iProgram, "COMPILE" + #TAB$ + "XPSKIN" + #TAB$ + "PROGRESS")
      
      sReturn = ""
      Repeat
        If AvailableProgramOutput(iProgram)
          sReturn = ReadProgramString(iProgram)
          PrintN(sReturn)
        EndIf
      Until sReturn = "SUCCESS"
    Next
    
  EndIf
ist jetzt nicht lauffähig, aber ich bekomme keine Rückmeldungen, nachdem
ich WriteProgramStringN aufgerufen habe.
Win11 x64 | PB 6.20
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Mehrere Dateien mit dem Kommandozeilen-Compiler kompilie

Beitrag von ts-soft »

Was ist mit Write? Du schreibst da strings, die bei Deinem Code keiner liest :wink:

PS: Ganz am Ende nicht vergessen CloseProgram()!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: Mehrere Dateien mit dem Kommandozeilen-Compiler kompilie

Beitrag von Andesdaf »

na toll, hab ich mich wieder schön zum Obst geschoben :oops:

danke, jetzt läuft's. :allright:
Win11 x64 | PB 6.20
Antworten