Le sujet
Compilation de GSQLParser, obtenir les DCU pour les inclure aux autres projets et éviter ainsi presque une minute de compilation (on fonctionne déjà ainsi avec les DCU fournies par l'auteur, lui n'a fourni que les BAT DCC32)
Mon Objectif
Double-Clic sur un BAT et tout est fait automatiquement ... j'y suis presque
L'erreur
Code DCC64 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 ...\GSQLParser64\src\gsp_vcl\parse\mssql\lzyaccmssqlsql.pas(291348) Conseil: H2443 La fonction inline 'TObjectList.Extract' n'a pas été étendue car l'unité 'System.Types' n'est pas spécifiée dans la liste USES ...\GSQLParser64\src\gsp_vcl\parse\mssql\lzyaccmssqlsql.pas(1653) Conseil: H2164 La variable 'lctmpj' est déclarée mais jamais utilisée dans 'TLzParserMssqlSql.yyparse' ...\GSQLParser64\src\gsp_vcl\parse\mssql\lzyaccmssqlsql.pas(292028) Fatale: F2046 Mémoire insuffisante
F2046 Mémoire insuffisante (Delphi)
- virtual memory à 8Go - Sans Effet, cela bloque vers 970Mo ( EDIT moins d'une seconde cela monte de 1300 à 2600Mo pour BDS mais DCC64 plante à 1800Mo)
- MS Build ou dcc64 sont utilisé hors EDI donc "Utiliser MSBuild de façon externe pour compiler" n'est pas valable
- "Construisez votre groupe de projets sur la ligne de commande." ... dommage c'est ça qui fonctionne pas
- "Refactorez les applications et les bibliothèques" ... euh non, fichier généré par un LEX soit 292055 lignes pour 7888 Ko ... cela implique de modifier le projet LEX\YACC, on verra ça lorsque je serais obligé de gérer MS SQL 2021 (Version 16 même pas encore sortie) donc pas avant 2030
Ne se produit QUE hors DELPHI
Je l'ai eu une seule fois via l'IDE alors que c'est systématique en ligne de Commande
Le coupable (plutôt, les coupables)
ou
Code BAT : Sélectionner tout - Visualiser dans une fenêtre à part "C:\Program Files (x86)\Embarcadero\Studio\17.0\bin\dcc64.exe" -B -Q -DRELEASE -$D0 -$L- -$Y- -H -W -B -R"C:\Program Files (x86)\Embarcadero\Studio\17.0\lib\Win64\release" -NSSystem.Win;System;Winapi;Vcl; -E..\bin\ -NU..\dcu\RELEASE\ -K00400000 getDCU.dpr
Code BAT : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 CALL "C:\Program Files (x86)\Embarcadero\Studio\17.0\bin\rsvars.bat" msbuild.exe ...\GSQLParser64\src\gsp_vcl\ /t:Rebuild /p:Configuration=RELEASE
qui me sort pareil
Code msbuild : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 Microsoft (R) Build Engine, Version 3.5.30729.9135 [Microsoft .NET Framework, Version 2.0.50727.9151] Copyright (C) Microsoft Corporation*2007. Tous droits réservés. Build started 09/03/2021 15:35:41. Project "...\GSQLParser64\src\make\getDCU.dproj" on node 0 (Rebuild target(s)). CodeGear Resource Compiler/Binder Version 1.2.2 Copyright (c) 2008-2012 Embarcadero Technologies Inc. Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0 Copyright (C) Microsoft Corporation. All rights reserved. Suppression du fichier "getDCU.vrc". PreBuildEvent: 1 fichier(s) copié(s). _PasCoreCompile: Embarcadero Delphi for Win64 compiler version 30.0 Copyright (c) 1983,2015 Embarcadero Technologies, Inc. ... quelques 700 warnings ...\GSQLParser64\src\gsp_vcl\parse\mssql\lzyaccmssqlsql.pas(1653): Conseil warning H2164: La variable 'lctmpj' est déclarée mais jamais utilisée dans 'TLzParserMssqlSql.yyparse' "...\GSQLParser64\src\make\getDCU.dproj" (Rebuild target) (1) -> (_PasCoreCompile target) -> ...\GSQLParser64\src\gsp_vcl\parse\mssql\lzyaccmssqlsql.pas(292028): error F2046: Mémoire insuffisante 733 Warning(s) 1 Error(s) Time Elapsed 00:00:50.49
ou encore un petit programme Delphi contenant un CreateProcess encapsulé (j'ai même du coup découvert un erreur de Zéro Terminal manquant PipeToRead + 1 pour le SetLength et ZeroMemory)
J'ai même repris la ligne dcc64 s'affichant dans la sortie de Delphi lorsqu'il compile, erreur F2046 aussi
Le mode Administrateur, pas mieux
En dehors de cette veille QC [dcc64] Compiler fail with OutOfMemory qui plantait sur un fichier RDBOSQLParser qui est un fichier autogénéré surement aussi par un LEX d'un dictionnaire SQL pour aussi un autre SQLParser, alors le diviser en plus morceaux n'est pas un solution car le jour où il faudra le régénérer, pas trop envie de le splitter ça dans quelques années, le code est incompréhensible, c'est presque une seule fonction sur 99% du fichier contenant plein de sous-fonctions, de case et des longuuuuueees constantes tableaux.
Voilà comme Delphi arrive à la lancer MSBuild et indirectement dcc64 pour ce projet sans que cela pose un problème mémoire ?
Il lui passe quoi ?
Ah la cerise sur le gâteau
Code BAT : Sélectionner tout - Visualiser dans une fenêtre à part "C:\Program Files (x86)\Embarcadero\Studio\17.0\bin\dcc64.exe" -B -Q -DRELEASE -$D0 -$L- -$Y- -$O- -H -W -B -R"C:\Program Files (x86)\Embarcadero\Studio\17.0\lib\Win64\release" -NSSystem.Win;System;Winapi;Vcl; -E..\bin\ -NU..\dcu\RELEASE\ -K00400000 getDCU.dpr
Ceci fonctionne, car en DEBUG avec les options associés cela fonctionne, et en fait, suffit de retirer les optimisations pour que cela compile aussi en RELEASE !
C'est au moment d'optimiser la monstrueuse fonction de L'analyseur syntaxique soit yyparse() qu'il se vautre.
Du coup, en laissant les optimisations pour DCC64 pour le projet mais en ajoutant juste {$O-} dans l'unité coupable, cela compile aussi, c'est le moins pire pour le moment.
C'était clair ?
![]()
Partager