J'ai modifié les chemins pour avoir dans le dossier OBJ, les fichiers obj, le fichier lib, le fichier txt, le fichier desc, maintenant ça compile et la lib est créée (mais le code asm est à revoir). Pour la modif des chemins, je n'ai pas mis les modifs, tu peux le faire dans le projet pour qu'on puisse repartir du même projet pour la suite.
Lorsqu'on aura un truc qui tourne à peu près, on compilera sous linux si on peux faire un fichier .a avec le shell de linux.
J'ai amélioré la procédure de création asm avec affichage de l'erreur de compilation
Voici les procedures modifiées, il faudra mettre dans la Todo list de changer toutes les occurences de
#PB_Compiler_Home par le chemin récupéré dynamiquement.
Code : Tout sélectionner
ProcedureDLL Moebius_Compile_Step1()
; 1. PBCOMPILER creates the EXE (using POLINK) that we don't need, but also the ASM file (/COMMENTED)
If CreateAsmFile(gConf_SourceDir + "Sample_00.pb")<0
End
EndIf
EndProcedure
ProcedureDLL Moebius_Compile_Step5()
; 5. LibraryMaker creates userlibrary from the LIB file
; mémorise le nom et le chemin de la libraire PB (userlibrairie)
Protected FichierUserLibrary$ = #PB_Compiler_Home + "PureLibraries\UserLibraries\" + gProject\LibName
RunProgram(gConf_Path_PBLIBMAKER, Chr(34) + gProject\FileDesc + Chr(34) + " /To " + Chr(34) + gConf_PureBasic_Path + "purelibraries" + #System_Separator + "userlibraries" + #System_Separator + Chr(34) + " /COMPRESSED", gConf_ProjectDir, #PB_Program_Wait | #PB_Program_Hide)
Debug FileSize(FichierUserLibrary$)
If FileSize(FichierUserLibrary$)>0
MessageRequester("Infos", "La librairie" + Chr(10) + FichierUserLibrary$ + Chr(10) + "a été créé avec succès", #PB_MessageRequester_Ok | #MB_ICONINFORMATION)
Else
MessageRequester("Infos", "La librairie" + Chr(10) + FichierUserLibrary$ + Chr(10) + "n'a pas été créé", #PB_MessageRequester_Ok | #MB_ICONERROR)
EndIf
EndProcedure
Procedure.l CreateAsmFile(FichierPureBasic$)
; Retourne #true si le fichier asm a correctement été créé sinon retourne une valeur négative
; qui dépend du lieu de l'erreur, permet de trouver rapidement ou se situe l'erreur
; supprime la librairie si elle existait dans le dossier PureLibraries sinon erreur de
; compilation avec 4.30 beta 4 et 4.20
Protected extension$ = LCase(GetExtensionPart(FichierPureBasic$))
; mémorise le nom du fichier asm avec le chemein complet
Protected FichierAsm$ = ""
; mémorise le nom du fichier exe, mais en fait la variable est vide
Protected FichierExe$ = ""
; mémorise le chemin et le nom du fichier asm initial créé par PB
Protected FichierInitialAsm$ = ""
; mémorise le nom et le chemin de la libraire PB (userlibrairie)
Protected FichierUserLibrary$ = ""
; mémorise la chaine retournée par le compilateur lors de la création du fichier asm
Protected Sortie$ = ""
; mémorise le résultat de la fonction Runprogram
Protected Compilateur
; compteurs de boucle pour éliminer les 0 de fin de chaine d'erreur qui ne s'affiche pas
; correctement dans un messagerequester
Protected i, len_chaine
; on teste si le fichier se fini par "pb ou pbi"
; si oui on continue sinon on retourrne #False
Select extension$
Case "pb"
FichierAsm$ + Mid(GetFilePart(FichierPureBasic$), 1, Len(GetFilePart(FichierPureBasic$))-2) + "asm"
; on fixe le nom du fiche executable
FichierExe$ + Mid(GetFilePart(FichierPureBasic$), 1, Len(GetFilePart(FichierPureBasic$))-2) + "exe"
Case "pbi"
FichierAsm$ + Mid(GetFilePart(FichierPureBasic$), 1, Len(GetFilePart(FichierPureBasic$))-3) + "asm"
; on fixe le nom du fiche executable
FichierExe$ + Mid(GetFilePart(FichierPureBasic$), 1, Len(GetFilePart(FichierPureBasic$))-3) + "exe"
Default
; ce n'est pas un fichier PB, on quitte
ProcedureReturn -1
EndSelect
; effacement de la librairie du dossier UserLibraries
FichierUserLibrary$ = #PB_Compiler_Home + "PureLibraries\UserLibraries\" + gProject\LibName
DeleteFile(FichierUserLibrary$)
; donne le bon chemin au fichier asm
FichierAsm$ = GetPathPart(FichierPureBasic$) + gProject\Name + "\" + FichierAsm$
; le fichier asm Prebasic.asm est créé dans le dossier de l'éxécutable qui le crée
FichierInitialAsm$ = GetCurrentDirectory() + "PureBasic.asm"
; on efface le fichier asm qui existerait éventuellement sous le même nom et sous le nom PureBasic.asm
; on efface éventuellement le fichier asm plus ancien
SetFileAttributes(FichierAsm$, #PB_FileSystem_Normal)
DeleteFile(FichierAsm$)
; on efface éventuellement le fichier Pb asm
SetFileAttributes(FichierAsm$, #PB_FileSystem_Normal)
DeleteFile(FichierInitialAsm$)
Compilateur = RunProgram(#PB_Compiler_Home + "\Compilers\pbcompiler", Chr(34) + FichierPureBasic$ + Chr(34) + " /INLINEASM /COMMENTED /EXE " + Chr(34) + FichierExe$ + Chr(34) , "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)
If Compilateur
While ProgramRunning(Compilateur)
Sortie$ + ReadProgramString(Compilateur) + Chr(10)
Wend
EndIf
; on supprime les Chr(10) en partant de la fin de la chaine
len_chaine = Len(Sortie$)
For i = 1 To len_chaine
If Right(Sortie$, 1) = Chr(10)
; on supprime
Sortie$ = Left(Sortie$, Len(Sortie$)-1)
Else
Break
EndIf
Next
If ProgramExitCode(Compilateur) = 0
; on teste si le résultat est Ok
; la dernière ligne retournée vaut
; "- Feel the ..PuRe.. Power -"
; If FindString(Sortie$, "- Feel the ..PuRe.. Power -", Len(Sortie$)-28)
If FindString(Sortie$, "- Feel the ..PuRe.. Power -", 0)
; on efface le fichier executable créé
DeleteFile(FichierExe$)
; on renomme le fichier asm PureBasic.asm avec le nouveau nom
If RenameFile(FichierInitialAsm$, FichierAsm$)
ProcedureReturn #True
Else
ProcedureReturn -1
EndIf
Else
MessageRequester("Erreur de compilation", "Le compilateur a retourné l'erreur suivante :" + Chr(10) + Sortie$, 16)
; on efface le fichier executable créé
DeleteFile(FichierExe$)
ProcedureReturn -2
EndIf
Else
MessageRequester("Erreur de compilation", "Le compilateur a retourné l'erreur suivante :" + Chr(10) + Sortie$, 16)
; on efface le fichier executable créé
DeleteFile(FichierExe$)
ProcedureReturn -3
EndIf
EndProcedure
Pour le code asm, il faut regarder car avec l'exemple suivant de code PB
Code : Tout sélectionner
ProcedureDLL FunctionTest(Param1.l)
ProcedureReturn Param1 + 10
EndProcedure
ProcedureDLL FunctionTest2(Param1.l)
ProcedureReturn Param1 + 20
EndProcedure
MessageRequester("", Str(FunctionTest(11)), 16)
les fichiers asm sont pratiquement vides et l'étiquette de déclaration est après le RET 4 ce qui fait planter lorsque je lance depuis PB
même chose pour la deuxième fonction