Forum Flightgear France

Une communauté prend son envol

Vous n'êtes pas identifié(e).

Annonce

Futur nouvel inscrit, tu dois au préalable lire l'intégralité des 10 articles des règles, s'il te plaît. Tout nouveau compte qui ne respecte pas les règles sera supprimé par l'administration.

#1 15/04/2020 18:50:00

zakharov
Membre historique du forum.
Inscription : 11/09/2005
Messages : 958

un 'tit script pour jouer avec la ligne de commande

salut,

bon comme je suis résolument orienté progrès, et rejette les injonctions à passer pour soit-disant «moderne» en faisant croire que les régressions sont des avancées, et qu'en plus je suis une feignasse, j'ai écrit une petite fonction pour mon shell favori, à savoir zsh. Bon en vrai il devrait être tout à fait possible de l'utiliser avec bash, il suffirait de faire un wrapper, mais j'ai pas essayé.

Bon j'espère que j'ai pas trop réduit mon public smile

Il s'agit d'avoir dans une commande fgfs (ça s'invente pas), de quoi mettre à jour, compiler, lancer, ... le tout hyper facilement
Il s'appuie sur deux variables d'environnement qui sont des chemins absolus (ainsi la fonction peut être lancée depuis n'importe où).
$FGDIR : l'endroit où se trouve tout le fourbis (sources, binaires, data),
$FGADDON : l'endroit où que t'as mis le gros paquet d'addons

Contrairement au très connu download_and_compile.sh, rien n'est prévu pour installer des dépendances ou les compiler. Mais comme on reprend la même structure, une compilation entamée avec download_and_compile.sh devrait fonctionner tout aussi bien avec la fonction fgfs.

$FGDIR doit avoir la structure suivante au moins au début (rappel: les sources sont déjà présentes). Par exemple:

.
└── source/
    ├── fgdata/
    ├── flightgear/
    ├── OpenSceneGraph/
    ├── simgear/
    ├── flightgear.specific
    └── ordre

Le fichier $FGDIR/source/ordre contient l'ordre des trucs à compiler. ce sont les noms des répertoires contenant les soures, relatifs à $FGDIR/source

simgear
flightgear

par exemple.

Le(s) fichier(s) *.specific contiennent les options spécifiques pour la configuration avant compilation, par exmeple pour flightgear

cmake_options+=("-DFG_DATA_DIR:PATH=$FGDIR/source/fgdata")
cmake_options+=("-DTRANSLATIONS_SRC_DIR:PATH=$FGDIR/source/fgdata/Translations")

Ça compile dans $FGDIR/build, et ça va installer dans $FGDIR/install. Simple, efficace, rien à dire de plus. S'il y a des soucis de compilation c'est qu'il manque une dépendance ou que le code contient une erreur.

$ fgfs [--update|--update-source|--update-data|--update-build]

--update-data: ça met à jour ton $FGADDON
--update-source: ça met à jour tout ce qui est svn ou git dans ton $FGDIR/source
--update-build: ça contruit à partir des sources depuis $FGDIR/source (ça va créer $FGDIR/install et $FGDIR/build)
--update: ça fait tout ce qui est expliqué juste au-dessus

mais le plus gros intérêt ne réside pas là. Trop galère de taper les «moins moins aircraft égale blablabla espace moins moins...», pis ça change tout le temps, revenir dans l'historique est relou pour chercher l'option d'appareil ou de piste de départ. Bref, tout ça c'est du passé ! smile

$ fgfs cap10b lflg

ah ça c'est plus joli, mais y a mieux !

$ fgfs lflg:\?
Parkings LFLG:
GA_Ramp_1
GA_Ramp_10
GA_Ramp_11
GA_Ramp_12
GA_Ramp_13
GA_Ramp_14
GA_Ramp_15
GA_Ramp_2
GA_Ramp_3
GA_Ramp_4
GA_Ramp_5
GA_Ramp_6
GA_Ramp_7
GA_Ramp_8
GA_Ramp_9

Pas mal non ? (note qu'il faut échapper le «?» sinon le shell va mal l'interpréter, ou sinon écrit "lflg:?" (avec des quotes).
On veut démarrer depuis la position de parking GA_Ramp_12 avec l'appareil par défaut (le c172p) ? c'est ton droit:

$ fgfs lfgl:GA_Ramp_12

Si la position de parking n'est pas trouvée c'est comme si t'avais rien dit.
Bon, en fait tu préfères commencer sur un bout de piste à LFPG (mais tu sais pas comment elle s'appelle). Soyons fous (même motif, même punition pour le «?»):

$ fgfs lfpg+\?
Runways LFPG:
08L
26R
08R
26L
09L
27R
09R
27L

Il ne te reste qu'à montrer tes talents au monde entier sur un serveur multijoueur, avec ton avion favori:

$ fgfs lfpg+09L 767-300ER mp01

comme il fait jour et que c'est moins rigolo que de nuit en pleine tempête, tu peux utiliser toutes les options qui vont bien et qui sont listées par l'option --help

$ fgfs --help
Utilisation : fgfs [ option ... ]

Options générales:
   --help, -h                   Affiche les principales options de ligne de
                                commande
   --verbose, -v                Affiche toutes les options de ligne de commande
...
   --trace-read=property        Trace les accès en lecture pour une
                                propriété
   --trace-write=property       Trace les accès en écriture pour une
                                propriété

le tout présenté dans ton pager favori. Pareil pour la liste des appareils:

$ fgfs --show-aircraft
Available aircraft:
   14bis                        14bis Santos DUMONT (YASim)
   21                           Santos Dumont N 21 Demoiselle (YASim)
   212                          Bell 212 "TwinHuey"
   412                          Bell 412 "Griffon"
...
   ZF_Navy_free_balloon         US Navy ZF free gas balloon
   ZivkoEdge540                 Zivko EDGE 540
   ZLT-NT                       Zeppelin NT07 airship
   ZLT-NT-copilot               Zeppelin NT07 multiplayer copilot

Enfin toute dernière nouveauté, tu est l'heureux utilisateur de TerraFS, et pour un coin particulier tu as envie de passer par TerraFS plutôt que par TerraSync (oui ça peut arriver, discutable, mais ça peut), encore une solution pour toi (note le «-» devant le nom de l'aéroport):

$ fgfs cap10b -lflg

bien sûr les possibilités de lister ou choisir les pistes ou les places de parking restent les mêmes.

Voilà, je crois que j'ai fait le tour, ah, non j'oubliais, évidemment y a pas d'ordre défini pour les options, tu fais comme tu veux. Je colle ici le bout de code kivabien, si ça peut être utile à quelqu'un:

#attention c'est pas du BASHung, c'est du nietZScHe :)
FGDIR=$HOME/scripts/flightgear
FGADDON=$HOME/.fgfs/flightgear-fgaddon
function fgfs () {
    local fgfs_source=$FGDIR/source
    local fgfs_build=$FGDIR/build
    local fgfs_install=$FGDIR/install
    function update_fg () {
        case $1 in
            data)
                svn up $FGADDON
                ;;
            source)
                typeset -A control_system_data=(
                    git pull
                    svn up
                )
                for control_system update_command in ${(kv)control_system_data}; do
                    find $fgfs_source \
                        -maxdepth 2 \
                        -mindepth 1 \
                        -type d \
                        -name .${control_system} \
                        -printf "\n[ %h ]\n" \
                        -execdir ${control_system} ${update_command} \;
                done
                unset control_system_data control_system update_command
                ;;
            build)
                local simultaneous=$(nproc)
                local previously_installed=()
                mkdir -p $fgfs_install

                for component in $(<$fgfs_source/ordre); do
# TODO: prendre en compte les cas sans cmake
                    title="*** $component:u ***"
                    printf "\n%s\n%s\n%s\n" "${(l:${#title}::*:)}" "$title" "${(l:${#title}::*:)}"

                    local cmake_options=("-DCMAKE_BUILD_TYPE=Release" "-DCMAKE_INSTALL_PREFIX=$fgfs_install/$component")
                    [[ ${#previously_installed[@]} -gt 0 ]] \
                        && cmake_options+=(${(j. .)${:--DCMAKE_PREFIX_PATH=$fgfs_install/${^previously_installed}}})
                    cmake_options+=("-j$simultaneous")
                    test -e $fgfs_source/${component}.specific && source $fgfs_source/${component}.specific

                    mkdir -p $fgfs_build/$component
                    cd $fgfs_build/$component

                    echo cmake ${cmake_options[@]} $fgfs_source/$component
                    
                    cmake ${cmake_options[@]} $fgfs_source/$component \
                    && make -j$simultaneous \
                    && make install \
                    || {
                        echo "erreur construction $component"
                        return
                    }

                    previously_installed+=($component)
                    cd -
                done
                unset component
                ;;
        esac
    }
    function ld_library_path () {
# TODO: prendre en compte les éventuels caractères gênants comme "espace" ou ":" dans $FGDIR
# TODO: ne pas surajouter si déjà présent dans LD_LIBRARY_PATH
        print ${(j,:,):-$(ls -d $FGDIR/install/*/lib)}${LD_LIBRARY_PATH:+:}${LD_LIBRARY_PATH}
    }
    local aircrafts="$FGADDON/Aircraft"
    local fgfs_args=("--fg-root=$FGDIR/source/fgdata")
    local aircraft=
    local airport=
    if [[ -o BASH_REMATCH ]]; then
        local bash_rematch_set=1
    fi

    for fgfs_arg in $@; do
        if test ${fgfs_arg#--} = ${fgfs_arg}; then
############ APPAREIL DANS FGADDON ?
            if test -n "$(find $aircrafts -maxdepth 2 -type f -name ${fgfs_arg}-set.xml -print -quit)"; then
                fgfs_args+=("--aircraft=$fgfs_arg")
                fgfs_args+=("--fg-aircraft=$FGADDON/Aircraft")

############ APPAREIL DANS FGDIR/source/fgdata ?
            elif official_aircraft=$(find "$fgfs_source/fgdata/Aircraft" -maxdepth 2 -type f -name ${fgfs_arg}-set.xml -printf "%h" -quit) && test -n "$official_aircraft"; then
                fgfs_args+=("--aircraft=$fgfs_arg")
                fgfs_args+=("--aircraft-dir=$official_aircraft")
                unset official_aircraft

############ SERVEUR MULTIPLAY ?
            elif set -o BASH_REMATCH && [[ $fgfs_arg =~ "^mp([0-9]+)$" ]]; then
                fgfs_args+=("--multiplay=out,10,mpserver${BASH_REMATCH[2]}.flightgear.org,5000")
                test -z "$bash_rematch_set" && set +o BASH_REMATCH

############ AEROPORT ?
            else 
                local candidate_airport=${fgfs_arg%:*}; [[ $candidate_airport == $fgfs_arg ]] && candidate_airport=${fgfs_arg%+*}
                local candidate_parking=${fgfs_arg#*:}; [[ $candidate_parking == $fgfs_arg ]] && unset candidate_parking
                local candidate_runway=${fgfs_arg#*+};  [[ $candidate_runway  == $fgfs_arg ]] && unset candidate_runway
                local terrafs=${candidate_airport#-}

                if [[ $terrafs != $candidate_airport && -x $HOME/.fgfs/terrafs && -d $HOME/.fgfs/terrafs.d ]]; then
                    candidate_airport=$terrafs
                    $HOME/.fgfs/terrafs $HOME/.fgfs/terrafs.d
                    fgfs_args+=(--fg-scenery=$HOME/.fgfs/terrafs.d)
                    fgfs_args+=(--disable-terrasync)
                    local scenes_dir=$HOME/.fgfs/terrafs.d
                else
                    fgfs_args+=(--terrasync-dir=$HOME/.fgfs/TerraSync)
                    fgfs_args+=(--enable-terrasync)
                    local scenes_dir=$HOME/.fgfs/TerraSync
                fi

                local airport_data="$scenes_dir/Airports/$candidate_airport[1]:u/$candidate_airport[2]:u/$candidate_airport[3]:u/${candidate_airport:u}"
                if [[ -a "${airport_data}.threshold.xml" ]]; then
                    fgfs_args+=(--airport=$candidate_airport)
                    if [[ -a "${airport_data}.groundnet.xml" && -n "$candidate_parking" ]]; then
                        if test $candidate_parking = '?'; then
                          echo "Parkings ${candidate_airport:u}:"
                          sed -rn "/<parkingList/,/parkingList>/s/^.* name=\"([^\"]+).*$/\1/p" ${airport_data}.groundnet.xml
                          return
                        elif sed -rn "/<parkingList/,/parkingList>/p" ${airport_data}.groundnet.xml | grep -q "name=\"${candidate_parking}\""; then
                            fgfs_args+=("--parking-id='$candidate_parking'")
                        fi
                    elif test -n "$candidate_runway"; then
                        if test $candidate_runway = '?'; then
                            echo "Runways ${candidate_airport:u}:"
                            sed -rn 's|^.*<rwy>(.+)</rwy>.*$|\1|p' ${airport_data}.threshold.xml
                            return
                        elif grep -q "<rwy>${candidate_runway}</rwy>" ${airport_data}.threshold.xml; then
                            fgfs_args+=("--runway=$candidate_runway")
                        fi
                    fi
                fi
            fi

######## AUTRE OPTION
        else
            case $fgfs_arg in
                --update(-data|-source|-build|))
                    for up in ${${=${fgfs_arg#--update}:-data source build}#-}; do
                        update_fg $up
                    done
                    unset up
                    return
                    ;;
                --(show-aircraft|help))
                    typeset -A complement=(
                        --show-aircraft --fg-aircraft=$FGADDON/Aircraft
                        --help          --verbose
                    )
                    export LD_LIBRARY_PATH=$(ld_library_path)
                    $FGDIR/install/flightgear/bin/fgfs $fgfs_arg ${complement[$fgfs_arg]} 2>/dev/null | pager
                    unset complement
                    return
                    ;;
                *)
                    fgfs_args+=($fgfs_arg);;
            esac
        fi
    done
    unset fgfs_arg
#    test -z "$aircraft" && echo "avion non trouvé" && return
#    test -z "$airport"  && echo "aéroport inconnu" && return
    export LD_LIBRARY_PATH=$(ld_library_path)

    echo ${fgfs_args[@]}
# TODO: ne lancer avec primusrun que si c'est nécesaire, d'autres solution existent ?
    primusrun $FGDIR/install/flightgear/bin/fgfs ${fgfs_args[@]}
    
    if grep -q $HOME/.fgfs/terrafs.d /proc/mounts; then
        fusermount -u $HOME/.fgfs/terrafs.d
    fi
    unset fgfs_args
}

bien sûr il faut sourcer pour que ce soit utilisable

[edit]cette fonction a désormais toute sa place sur mon git[/edit]

Bon vols confinés smile
@+
zakh

Dernière modification par zakharov (16/04/2020 15:25:11)


le zkv1000
Debian Bookworm sur i7-9750H, 16G, NV GeForce GTX 1660 Ti MaxQ 6Go
FG next compilé à la mano
Joystick TM T. Stick X avec fichier de conf perso

Hors ligne

#2 16/04/2020 8:42:45

ctesc356
Membre
Inscription : 18/05/2010
Messages : 3 483

Re : un 'tit script pour jouer avec la ligne de commande

Bonjour,
jusque là je me suis contenté de "download_and_compile" en essayant de suivre ses évolutions. Et en fait il fait bien le job, et en bidouillant un peu on peut même lui faire faire quelques exravagances smile
Mais pourquoi pas tester une autre voie, je m'y mettrais un prochain jour de pluie...

Pour lancer fg, ma foi le lanceur intégré fait finalement, après une longue gestation, bien l'affaire. Mais il peut être intéressant d'avoir une alternative sous la main.

A suivre donc... et merci pour le partage.


Intel i5-9400F, 16Go Ram, Nvidia GTX1660Ti, Linux Mint

Hors ligne

#3 16/04/2020 8:56:55

f-toro
Administrateur
Lieu : LFLA
Inscription : 16/12/2007
Messages : 3 015

Re : un 'tit script pour jouer avec la ligne de commande

Il y a déjà fort longtemps, du temps où d&c.sh n'existait pas encore, ou bien existait déjà, mais n'était utilisé par pratiquement personne, et n'était pas encore supporté par FG, mais, seulement par son créateur, Angelo Brisa, zakh avait déjà une spécialité, les scripts, avec un lien, et une véritable bibliothèque.
On pouvait s'attendre à ce qu'il récidive ! big_smile

Moi aussi je me pencherai sur la question un peu plus tard pour avoir un peu mieux compris.
En attendant je vais continuer à prendre de la hauteur.
Pas en décollant avec FG.
En remontant pour finir de démousser mes toitures... roll


André. anciennement taureau89_9
Debian Testing Amd64. CM Sabertooth 990FX, FX8350, 32 Go Ram DDR3 1866 Mhz, GTX 1060 6Go, DD 2To Sata 3, THRUSTMASTER T.Flight StickX, FG 2020.4.0 Git.

Hors ligne

#4 16/04/2020 14:47:42

zakharov
Membre historique du forum.
Inscription : 11/09/2005
Messages : 958

Re : un 'tit script pour jouer avec la ligne de commande

j'avoue c'est une marotte smile

f-toro a écrit :

avec un lien, et une véritable bibliothèque

y en a qui se souviennent de ./compile ! il était chouette, me suis bien éclaté dessus

[edit]en cherchant sur le forum j'ai remarqué qu'il était encore là ! je laisse lien on sait jamais smile[/edit]

@+
zakh

Dernière modification par zakharov (16/04/2020 14:52:56)


le zkv1000
Debian Bookworm sur i7-9750H, 16G, NV GeForce GTX 1660 Ti MaxQ 6Go
FG next compilé à la mano
Joystick TM T. Stick X avec fichier de conf perso

Hors ligne

Pied de page des forums