Autor blogu: Sergej Chodarev

twitter · github · 500px

Skript na kompilovanie (skoro) hocičoho

Mnohé textové editory ponúkajú možnosť pomocou nejakej klávesovej skratky spustiť make v adresári s editovaným súborom. Je to pomerne pohodlné, ale nie vždy chcem na kompilovanie používať make. Preto som napísal jednoduchý shell skript, ktorý dokáže podľa typu súboru rozhodnúť ako ho skompiluje.

Tu je samotný skript build.sh:

#!/bin/bash

function run() {
    echo $@
    $@
}

function build_tex() {
    LATEX_ARGS=-halt-on-error
    FILENAME=$1

    MASTER=`grep -oP '(?<=%% master:) [-_\.\w]*' $FILENAME`
    if [ -n "$MASTER" ]
        then FILENAME=$MASTER
    fi

    if grep -Fq $'\usepackage{slovak}\n\usepackage{czech}' $FILENAME
        then run cslatex $LATEX_ARGS $FILENAME
        else run latex $LATEX_ARGS $FILENAME
    fi
}

FILENAME=$1
if [ -f Makefile -o -f makefile ]
    then run make
elif [ -f SConstruct ]
    then run scons -Q
else
    EXT=${FILENAME##*.}
    case "$EXT" in
    "tex")
        build_tex $FILENAME
        ;;
    "java")
        run javac $FILENAME
        ;;
    "c")
        run gcc -Wall -o ${FILENAME%.c} $FILENAME
        ;;
    *)
        echo "I don't know how to build your file"
        ;;
    esac
fi

Zatiaľ nepodporuje veľa typov súborov. Pokiaľ je v aktuálnom adresári súbor Makefile, tak spusti make, pokiaľ je tam súbor SConstruct – spusti scons. Ak žiaden z týchto súborov nenájde, rozhoduje sa podľa názvu súboru, ktorý dostane ako argument. Vie skompilovať program v C a v Jave, alebo spracovať dokument v LaTeXe. Pridanie podpory pre ďalšie typy súborov je veľmi jednoduché, takže každý si to môže prispôsobiť podľa vlastných potrieb.

Ešte sa zastavím pri spracovávaní dokumentov v LaTeXe. Skript vie rozpoznať či sa má použiť csLaTeX alebo obyčajný LaTeX. Tiež podporuje dokumenty rozdelené do viacerých súborov: stačí do súborov dať komentár v tváre

%% master: názov_hlavného_súboru

a spracovávať sa bude hlavný súbor namiesto toho, ktorý skript dostal ako argument.

Dúfam, že tento skrípt bude pre niekoho užitočný.