Remplacer une ligne interprétée d'un fichier binaire batch/perl

Résolu/Fermé
sylv_brl Messages postés 21 Date d'inscription lundi 24 juin 2013 Statut Membre Dernière intervention 16 septembre 2013 - Modifié par sylv_brl le 2/09/2013 à 14:17
sylv_brl Messages postés 21 Date d'inscription lundi 24 juin 2013 Statut Membre Dernière intervention 16 septembre 2013 - 11 sept. 2013 à 13:13
Bonjour,

Ce topic fait suite à celui-ci : https://forums.commentcamarche.net/forum/affich-28603624-reecrire-une-ligne-comportant-une-variable-path-avec-sed#p28636723

Mon problème actuel étant que je suis novice en programmation et que je dois remplacer une ligne dans un fichier par une autre ligne, avec un fichier de sortie temporaire donc MakeFile > MakefileTemp, voir les détails sur l'autre post. La solution actuelle au problème donnée au précédent topic fonctionne avec des fichiers .txt, mais je n'arrive pas à l'employer avec des fichiers "binaires" (fichiers sans extension sous windows 7, je présume que c'est bien ça). J'ai rechercher et je suis tombé sur ça https://forum.zebulon.fr/topic/144261-r%C3%A9solu-bacth-dos-et-fichier-binaire/ où il mentionne d'utiliser les fonctionnalités
'perl'
que mon script utilise déjà pour des processus de compilation (mais ce n'est pas moi qui a fait le script). Donc je cherches en solution en cmd windows et/ou perl du coup (mais pas forcément perl, c'est juste une idée, d'où le fait que ce post soit dans programmation générale).


Le but étant de passer de ce fichier MakeFile :

CXX      = g++
CFLAGS   = -Wall
CPPFLAGS = $(CFLAGS) -I/usr/local/include -L/usr/local/lib -Iinclude/

LIBRARIES= rabbitmq
LIBS     = $(addprefix -l,$(LIBRARIES))

LIBNAME  = amqpcpp
LIBFILE  = lib$(LIBNAME).a
...


A ce fichier-çi MakefileTemp avec réecriture de la 3ieme ligne par une autre comprenant une variable d'environnement %DEPS% interpétée donc lors de la réecriture :

CXX      = g++
CFLAGS   = -Wall
CPPFLAGS = $(CFLAGS) -IC:\Users\Sylvain\naali-3dlive\deps-vs2010-x64/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/include/ -Iinclude/ -LC:\Users\Sylvain\naali-3dlive\deps-vs2010-x64/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/lib/ -Llib/

LIB...


(**)

Donc dernière solution de Dal avec exécution d'un .bat :

C:\>type filter.bat

@echo off
setlocal disableDelayedExpansion

set InputFile=Makefile
set OutputFile=MakefileTemp
set "_strFind=CPPFLAGS = $(CFLAGS) -I/usr/local/include -L/usr/local/lib -Iinclude/"

>"%OutputFile%" (
  for /f "usebackq delims=" %%A in ("%InputFile%") do (
    if "%%A" equ "%_strFind%" (echo CPPFLAGS = $(CFLAGS^) -I%DEPS%/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/include/ -Iinclude/ -L%DEPS%/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/lib/ -Llib/) else (echo %%A)
  )
)


Actuellement j'essayes donc d'implémenter ça donc mon script, mais il ne modifie pas MakefileTemp, il ne fait que l'afficher dans la console à la place :

@echo off
    setlocal disableDelayedExpansion
    set "_strFind=CPPFLAGS = $(CFLAGS) -I/usr/local/include -L/usr/local/lib -Iinclude/"
    cp -f Makefile MakefileTemp
    for /f "usebackq delims=" %%A in (MakefileTemp) do ( 
      if "%%A" equ "%_strFind%" (echo CPPFLAGS = $(CFLAGS^) -I%DEPS%/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/include/ -Iinclude/ -L%DEPS%/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/lib/ -Llib/) else (echo %%A)
      )  
    ) 


J'ai donc essayes juste ça, en une seule ligne, avec File = MakeFile ou MakefileTemp.txt déjà avec le même contenu (interprété) :

for /f "usebackq delims=" %%A in (File) do ( if "%%A" equ "%_strFind%" (echo CPPFLAGS = $(CFLAGS^) -I%DEPS%/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/include/ -Iinclude/ -L%DEPS%/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/lib/ -Llib/) else (echo %%A))


Mais il me répond par :

%%A était inattendu.


Je suis donc en train de comprendre la syntaxe de 'for' sur http://www.hotline-pc.org/batch.htm à 'Décomposer une variable' mais je ne vois pas encore ce qui ne va pas...

(**) : Pour l'histoire de slashs/backslashs, 'include' semblant ne pas accepter ça, j'essayes de contourner aussi ce problème en même temps, mais ce n'est pas prioritaire et j'ai quelques idées.

A voir également:

4 réponses

sylv_brl Messages postés 21 Date d'inscription lundi 24 juin 2013 Statut Membre Dernière intervention 16 septembre 2013
2 sept. 2013 à 14:50
En fait je penses que c'est bon, j'ai juste perdu des lignes vides de présentation ^^ :

@echo off
setlocal disableDelayedExpansion
set "_strFind=CPPFLAGS = $(CFLAGS) -I/usr/local/include -L/usr/local/lib -Iinclude/"
cp -f Makefile MakefileTemp
(for /f "usebackq delims=" %a in (MakefileTemp) do ( if "%a" equ "%_strFind%" (echo CPPFLAGS = $(CFLAGS^) -I%DEPS%/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/include/ -I
include/ -L%DEPS%/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/lib/ -Llib/) else (echo %a))) > MakefileTemp


Plus qu'à tester dans le script...
0
sylv_brl Messages postés 21 Date d'inscription lundi 24 juin 2013 Statut Membre Dernière intervention 16 septembre 2013
2 sept. 2013 à 15:43
Reste encore un problème d'interprétation de '%' de '%a' que j'exécute ce code dans mon script, donc j'utilise bien '%%a' comme donnée initialement dans la solution. MakeFile n'a plus de lignes vides mais n'a pas réécrit la troisième ligne...
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
2 sept. 2013 à 16:37
hello
dans un bat, uiliser %%a
for /f "usebackq delims=" %%a in ...
0
sylv_brl Messages postés 21 Date d'inscription lundi 24 juin 2013 Statut Membre Dernière intervention 16 septembre 2013
11 sept. 2013 à 13:13
Ok donc finalement je reste avec ce code implémenté dans le .bat de construction des dépendances du projet global (Realxtend). Ici %DEPS% est la variable contenant le chemin de construction des ces dépendances (dont Rabbitmq-c et amqpcpp) :

...
cd "%DEPS%\amqp\amqpcpp"
cecho {0D}Compiling AMQPCpp.{# #}{\n}
sed -i "35i #define bzero(b,len) (memset((b), '\0', (len)), (void) 0)" include\AMQPcpp.h

@echo off
setlocal disableDelayedExpansion
(for /f "usebackq delims=" %%a in (Makefile) do ( if "%%a" equ "CPPFLAGS = $(CFLAGS) -I/usr/local/include -L/usr/local/lib -Iinclude/" (echo CPPFLAGS = $(CFLAGS^) -I%DEPS:\=/%/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/librabbitmq/ -I%DEPS:\=/%/amqp/amqpcpp/include -L%DEPS:\=/%/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/build/librabbitmq/RelWithDebInfo/
) else (echo %%a))) >MakefileTemp


rm Makefile
mv MakefileTemp Makefile

make -j%NUMBER_OF_PROCESSORS%
...

Donc j'évite finalement d'utiliser des variables intermédiaires en plus d'utiliser '%%a' comme l'a spécifié dubcek, et là je n'ai plus de problème en traitant tout d'un coup, même si c'est un peu laid pour reconfigurer les chemins si besoin ensuite. Maintenant je dois comprendre des problèmes d'utilisation de .lib redirigeant vers une .dll avec préfixe '_imp_' mais c'est une autre histoire...
0