Page 4 sur 5

Publié : dim. 16/nov./2008 16:43
par Anonyme2
En fait la ligne de la procedure Moebius_Compile_Step2() est juste, l'erreur vient des lignes suivantes

Code : Tout sélectionner

LL_DLLFunctions()\FuncName = StringField(TrCodeField, 1, " ") 

remplaces :

Code : Tout sélectionner

TrCodeField = ReplaceString(TrCodeField, "proceduredll", "")
TrCodeField = ReplaceString(TrCodeField, "ProcedureDLL", "")
par

Code : Tout sélectionner

TrCodeField = ReplaceString(TrCodeField, "proceduredll", "", #PB_String_NoCase)
Le desc semble être Ok au moins pour les 2 fonctions

Code : Tout sélectionner

ASM
1
KERNEL32
LIB
0
Sample_00.chm
FunctionTest, Long (Param1.l)
Long | StdCall
FunctionTest2, Long (Param1.l)
Long | StdCall
Samples00Windows_Init
InitFunction | StdCall

Publié : dim. 16/nov./2008 17:12
par Anonyme2
Encore une erreur car PB ne trouve pas le fiichier lib avec le linker.

Je crois me rappeler que le fichier .desc doit être dans le même dossier que le fichier lib et je me demande si le reste ne doit pas y être aussi (les obj et le .txt des fonctions)

Publié : dim. 16/nov./2008 17:46
par Progi1984
Je pense la même chose sous Linux :) pour l'erreur du fichier lib.

En mettant le fichier DESC dans le dossier LIB, je n'ai plus l'erreur.

Publié : dim. 16/nov./2008 19:27
par Anonyme2
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

Code : Tout sélectionner

format MS COFF

public PB_FunctionTest



RET    4
PB_FunctionTest:
même chose pour la deuxième fonction

Publié : lun. 17/nov./2008 14:01
par Progi1984
Modifications effectuées et bug corrigé pour la création de fichier ASM et history.txt (to do list & roadmap) modifiés.

http://code.google.com/p/moebius-pb/source/detail?r=18

Récupère la dernière version du code en direction du serveur :)

Publié : mar. 18/nov./2008 14:47
par Progi1984
J'ai enfin réussi à compiler une userlib :) sous WinXP / PB 4.30b4.

http://code.google.com/p/moebius-pb/downloads/list

La r21 :)

Publié : mar. 18/nov./2008 15:59
par Anonyme2
Pfffffffffffff


J'ai plein d'erreurs, tu as changé les dossiers des sources sur C... et faut que je recommence....

Dans le cas des tests qui plantent car c'est pas verrouillé, j'ai un plantage ici, procedure Moebius_Compile_Step1()

Voici une correction, il faut retourner une erreur si Compilateur = 0 sinon ça plante .

Code : Tout sélectionner

     If Compilateur
          While ProgramRunning(Compilateur)
               Sortie + ReadProgramString(Compilateur) + Chr(13)
          Wend
     Else
          ProcedureReturn -4
     EndIf

Publié : mar. 18/nov./2008 16:10
par Anonyme2
Modifies les 2 procedures comme ceci car le deletedirectory échouait (je n'avais pas le dossier) et il ne se passait rien, j'ai mis un debug dans la 1ere procedure pour voir la valeur de retour en cas d'erreur.

Code : Tout sélectionner

ProcedureDLL Moebius_MainThread(Param.l)
     Debug "Moebius_Compile_Step0()"
     Protected retour.l
     retour = Moebius_Compile_Step0()
     If retour = #True
          Debug "Moebius_Compile_Step1()"
          Moebius_Compile_Step1()
          Debug "Moebius_Compile_Step2()"
          Moebius_Compile_Step2()
          Debug "Moebius_Compile_Step3()"
          Moebius_Compile_Step3()
          Debug "Moebius_Compile_Step4()"
          Moebius_Compile_Step4()
          Debug "Moebius_Compile_Step5()"
          Moebius_Compile_Step5()
          Debug "Moebius_Compile_Step6()"
          Moebius_Compile_Step6()
     Else
          Debug retour
     EndIf
EndProcedure

ProcedureDLL Moebius_Compile_Step0()
     ; 0. Cleaning & Preparing
     ;Cleans the old userlib
     If FileSize(#PB_Compiler_Home + "pureLibraries" + #System_Separator + "UserLibraries" + #System_Separator + gProject\LibName)>0
          DeleteFile(#PB_Compiler_Home + "pureLibraries" + #System_Separator + "UserLibraries" + #System_Separator + gProject\LibName)
     EndIf
     ;Prepares the location For Moebius
     Debug gConf_ProjectDir
     DeleteDirectory(gConf_ProjectDir, "*.*", #PB_FileSystem_Force | #PB_FileSystem_Recursive)
     If CreateDirectory(gConf_ProjectDir)
          If CreateDirectory(gConf_ProjectDir + "ASM" + #System_Separator)
               If CreateDirectory(gConf_ProjectDir + "DESC" + #System_Separator)
                    If CreateDirectory(gConf_ProjectDir + "LIB" + #System_Separator)
                         If CreateDirectory(gConf_ProjectDir + "OBJ" + #System_Separator)
                              ProcedureReturn #True
                         Else
                              ProcedureReturn #False-5
                         EndIf
                    Else
                         ProcedureReturn #False-4
                    EndIf
               Else
                    ProcedureReturn #False-3
               EndIf
          Else
               ProcedureReturn #False-2
          EndIf
     Else
          ProcedureReturn #False-1
     EndIf
     
EndProcedure

Publié : mar. 18/nov./2008 16:25
par Anonyme2
Tu devrais trouver sur le forum anglais (gnozal je crois) une procedure qui donne le chemin ou est installé PB en fonction des versions de windows et celles de PB.

Il faut écrire une telle procedure pour s'affranchir des problèmes liés au chemin d'installation de PB. Si on trouve plusieurs version de PB, il faut demander (messagerequester) laquelle utiliser pour compiler

Il faut que tu inclues aussi une procedure pour redémarrer le compilateur de PB, qui sera lancée si la compilation a réussie (librairie créée).

Afficher aussi lorsque la compilation est terminée et si la librairie est créée.

A+

Publié : mar. 18/nov./2008 17:34
par Progi1984
Premier post

Argh dsl ! J'aurais du te prévenir ! :( (Pas l'habitude de travailler avec quelqu'un)

J'ai remplacé tout les variables en dur des chemins par un stockage en fichier ini.
Comme ca, d'un poste à l'autre (le tien, le mien, mon poste au taf), on stocke nos propres chemins purebasic.

J'ai ajouté juste avant les fonctions une balise ;@return value qui indique quel valeur est retournée et à quoi correspond le message d'erreur.

Second post
J'ai encore amélioré la suppression des fichiers du répertoire en vérifiant si le répertoire existe.

Troisième post
Voici la feuille de route prévue (avec tes idées ajoutés)
http://code.google.com/p/moebius-pb/sou ... istory.txt

Publié : mar. 18/nov./2008 17:56
par Backup
bon courage les gars !! :)

dites moi , "moebius" va me permettre de faire mes librairies comme avec Tailbite c'est ça ??

sauf qu'en plus ce serai multi-plateforme ??!!! 8O

en tout ça bon courage , je regarde d'un oeil distrait votre boulot, parce que j'aurai bien du mal a y comprendre quelque chose :lol:

Publié : mar. 18/nov./2008 18:43
par Progi1984
Dobro a écrit :bon courage les gars !! :)

dites moi , "moebius" va me permettre de faire mes librairies comme avec Tailbite c'est ça ??

sauf qu'en plus ce serai multi-plateforme ??!!! 8O

en tout ça bon courage , je regarde d'un oeil distrait votre boulot, parce que j'aurai bien du mal a y comprendre quelque chose :lol:
Merci,

Moebius va permettre de créer des userlibs comme Tailbite mais sur Windows & Linux (ptet MacOs quand du monde se présentera) à partir de code purebasic. MultiPlateforme sans compter l'API bien sur.

Denis fait du super bon taf et me reprend pas mal de code avecmes erreurs à la pelle :)

Publié : mar. 18/nov./2008 20:36
par Backup
Progi1984 a écrit : Denis fait du super bon taf et me reprend pas mal de code avecmes erreurs à la pelle :)
oui mais lui ça surprends meme plus :lol:

toi par contre , que tu ai pu pondre ça , .... ça m'épate :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol:

Publié : mar. 18/nov./2008 20:48
par Progi1984
Dobro a écrit :
Progi1984 a écrit : Denis fait du super bon taf et me reprend pas mal de code avecmes erreurs à la pelle :)
oui mais lui ça surprends meme plus :lol:

toi par contre , que tu ai pu pondre ça , .... ça m'épate :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol:
LOL (MDR devant le PC) Merci

Disons que c'est un projet que j'ai en tête depuis maintenant six mois attenant à un big project (un an et demi de préparation) et j'ai étudié les codes de tailbite et tailbite pour linux depuis le début de l'été. Donc Merci du "compliment" et merci à Denis de m'aider.

Publié : mer. 19/nov./2008 14:02
par Progi1984
Voilà, je reviens avec mes problèmes d'ASM :

Voici le fichier FunctionTrisQuad.asm pour la fonction FunctionTrisQuad :

Code : Tout sélectionner

format MS COFF

public PB_FunctionTrisQuad

extrn _Procedure4

_Procedure8:
PB_FunctionTrisQuad:

PUSH   ebx
PS8=12
XOR    eax,eax
PUSH   eax
; Protected Val.l = FunctionTestPriv(MyParam) * 2
PUSH   dword [esp+PS8+0]
CALL  _Procedure4
MOV    ebx,eax
ADD    ebx,ebx
MOV    dword [esp],ebx
; ProcedureReturn Val
MOV    eax,dword [esp]
JMP   _EndProcedure9
; EndProcedure
XOR    eax,eax
_EndProcedure9:
ADD    esp,4
POP    ebx
RET    4
et son code PB :

Code : Tout sélectionner

ProcedureDLL FunctionTrisQuad(MyParam.l)
  Protected Val.l = FunctionTestPriv(MyParam) * 2
	ProcedureReturn Val
EndProcedure
Et j'ai une erreur Polink :

Code : Tout sélectionner

POLINK: error: Unresolved external symbol '_Procedure4'.
POLINK: fatal error: 1 unresolved external(s). 
Je me doute que c'est parceque ma fonction FunctionTrisQuad appelle une autre fonction privé (FunctionTestPriv). Mais comment puis je régler le problème ASMment parlant ? en renommant le procedure4 en PB_FunctionTestPriv ?