Partage
  • Partager sur Facebook
  • Partager sur Twitter

Compilation g++ avec fichier Batch

validation du script

    12 avril 2021 à 10:32:32

    Bonjour à tous, je code en C++ et j'ai quelquefois besoin de programmer sur un autre ordinateur (au CDI de mon lycée) qui bien sûr ne dispose de rien pour cela.

    J'ai donc mis le compilateur MinGW GCC sur une clé USB (je n'utilises pas les compilos en ligne godbolt wandbox et onlinegdb car j'ai des projets avec plusieurs fichiers) et ai donc codé un "petit" (tout est relatif :lol:) script en batch (je reste toujours sous Windows) pour la compilation / exécution (le script est fonctionnel).

    :askEchoOff
    set /p echoOff="Echo off (y/n) ?    "
    if %echoOff% neq y (if %echoOff% neq n (goto askEchoOff))
    if %echoOff% equ y (@echo off)
    
    :main
    set cppfiles=Source.cpp
    setlocal EnableDelayedExpansion
    for %%f in (*.cpp) do (if %%f neq Source.cpp (set cppfiles=!cppfiles! %%f))
    set disk=%cd:~0,1%
    
    :askMode
    set /p mode="Debug (d) / Release (r) ?   "
    if %mode% neq d (if %mode% neq r (goto askMode))
    if %mode%A equ A (goto askMode)
    rem mode is empty
    
    :warningsAsError
    set /p werror="Treat warnings as errors (y/n) ?    "
    if %werror% neq y (if %werror% neq n (goto warningsAsError))
    if %werror%A equ A (goto warningsAsError)
    rem werror is empty
    set flags=-g -pedantic -Wall -Wextra -std=c++20 -Wold-style-cast -Woverloaded-virtual -Wwrite-strings -Wpointer-arith -Wcast-qual -Wconversion -Wdouble-promotion -Wlogical-op -Wuninitialized -Wsuggest-final-types -Wsuggest-final-methods -fexceptions -fchar8_t -fcoroutines -fno-operator-names -fno-pretty-templates -Wcomma-subscript -Wctor-dtor-privacy  -Wdelete-non-virtual-dtor -Wnoexcept -Wregister -Wredundant-tags -Weffc++ -Wstrict-null-sentinel -Wsign-promo -Wmismatched-tags -Wzero-as-null-pointer-constant -Wcatch-value -Wextra-semi -Wsuggest-override -Wuseless-cast
    if %mode% equ r (set flags=%flags% -02)
    rem enables optimizations
    if %werror% equ y (set flags=%flags% -Werror)
    
    :askBoost
    set /p boost="Use Boost (y/n) ?    "
    if %boost% neq y (if %boost% neq n (goto askBoost))
    if %boost%A equ A (goto askBoost)
    rem boost is empty
    set boostDir=
    set boostLib=
    if %boost% equ y (if %mode% equ d (set boostDir=-I"%disk%:/C++/Projets/boost-1.72/boost_1_72_0" -L"%disk%:\C++\Projets\Boost DLL\Debug" & set boostLib=-llibboost_chrono-mgw92-mt-d-x32-1_72 -llibboost_date_time-mgw92-mt-d-x32-1_72 -llibboost_thread-mgw92-mt-d-x32-1_72))
    if %boost% equ y (if %mode% equ r (set boostDir=-I"%disk%:/C++/Projets/boost-1.72/boost_1_72_0" -L"%disk%:\C++\Projets\Boost DLL\Release" & set boostLib=-llibboost_chrono-mgw92-mt-x32-1_72 -llibboost_date_time-mgw92-mt-x32-1_72 -llibboost_thread-mgw92-mt-x32-1_72))
    
    :askSFML
    set /p sfml="Use SFML (y/n) ?    "
    if %sfml% neq y (if %sfml% neq n (goto askSFML))
    if %sfml%A equ A (goto askSFML)
    rem sfml is empty
    set SFMLdir=
    set SFMLlib=
    if %sfml% equ y (if %mode% equ d (set SFMLdir=-I"%disk%:/C++/Projets/SFML src/include" -L"%disk%:/C++/Projets/build SFML/Debug/lib" & set SFMLlib=-lOpenAL32 -lsfml-audio-d-2 -lsfml-network-d-2 -lsfml-graphics-d-2 -lsfml-window-d-2 -lsfml-system-d-2))
    if %sfml% equ y (if %mode% equ r (set SFMLdir=-I"%disk%:/C++/Projets/SFML src/include" -L"%disk%:/C++/Projets/build SFML/Release/lib" & set SFMLlib=-lOpenAL32 -lsfml-audio-2 -lsfml-network-2 -lsfml-graphics-2 -lsfml-window-2 -lsfml-system-2))
    
    :askStoreCompilationResultsInFile
    set /p openFile="Store compilation results into compilation.log (y/n) ?    "
    if %openFile% neq y (if %openFile% neq n (goto askStoreCompilationResultsInFile))
    if %openFile%A equ A (goto askStoreCompilationResultsInFile)
    rem openFile is empty
    
    :compileProg
    set includeAndLibsDir=-I\"%disk%:/C++/mingw32/include/c++/10.2.0\" -I\"%disk%:/C++/mingw32/include\" -I\"%disk%:/C++/mingw32/i686-w64-mingw32/include\" -I\"%disk%:/C++/mingw32/lib/gcc/i686-w64-mingw32/10.2.0/include\" -L\"%disk%:/C++/mingw32/lib\" -L\"%disk%:/C++/mingw32/i686-w64-mingw32/lib\"
    set command=
    if %mode% equ d (set command=%disk%:/C++/mingw32/bin/g++.exe %flags% !cppfiles! -o Source_DEBUG %includeAndLibsDir% %boostDir% %boostLib% %SFMLdir% %SFMLlib%)
    if %mode% equ r (set command=%disk%:/C++/mingw32/bin/g++.exe %flags% !cppfiles! -o Source_RELEASE %includeAndLibsDir% %boostDir% %boostLib% %SFMLdir% %SFMLlib%)
    echo Compilation : %command%
    if %openFile% equ y (set command=%command% 2> compilation.log) else (%command%)
    rem 2> redirects all messages from console to the file
    set isFileEmpty=
    call :getFileSize compilation.log
    if %errorlevel% neq 0 (if %openFile% equ y (compilation.log) & goto end)
    rem compilation errors
    if %errorlevel% equ 0 (if %isFileEmpty% equ false (if %openFile% equ y (compilation.log) & goto executeProg))
    rem only warnings
    
    :executeProg
    if %errorlevel% equ 0 (if %mode% equ d (Source_DEBUG))
    if %errorlevel% equ 0 (if %mode% equ r (Source_RELEASE))
    
    :getFileSize
    set fileSize=%~z1
    if %fileSize%O equ O (set isFileEmpty=true)
    if %fileSize%O neq O (set isFileEmpty=false)
    
    :end
    endlocal
    pause

    Pourriez-vous me conseiller quant à ce code, s'il y a (et il y en aura :D) des choses à améliorer ?

    Merci d'avance.

    -
    Edité par Chi_Iroh 28 avril 2021 à 9:17:37

    • Partager sur Facebook
    • Partager sur Twitter
      25 avril 2021 à 18:50:23

      Pourquoi ne pas installer la commande make, et s'en servir ?

      • Partager sur Facebook
      • Partager sur Twitter
        25 avril 2021 à 20:41:17

        Vous parlez de CMake et des Makefile ?

        Je ne connais que le nom et à quoi ça ressemble, mais je voudrais bien apprendre, puisqu'apparemment ça a l'air plus simple et portable.

        Comme vous connaissez le sujet, est-ce que le tuto de dvpz est bien à suivre (est-il obsolète car il date de 2004 et updaté en 2012) ?

        J'ai aussi trouvé ce topic sur stack qui explique les bases, validez-vous la qualité ?

        C'est vrai que cette solution semble pratique, car elle n'implique que de copier make sur ma clé et évite les bêtises avec batch.

        (Pour le côté portable, je n'ai pas (encore) de problèmes liés à la portabilité, je n'utilise que des ordinateurs sous Windows, je n'ai jamais touché à autre chose)

        • Partager sur Facebook
        • Partager sur Twitter

        Compilation g++ avec fichier Batch

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown