Mon Oct 27 07:03:47 JST 2014

プロコンに向けた Makefile

10分程で今書いたものなので使い勝手は分からない。

all: main.exe input_
    ./main.exe < input | tee out

main.exe: main.cc
    g++ -o $@ -std=c++11 $^

input_:
    xsel -bo | sed -e 's/^\s*//g' | sed -e 's/\s*$$//g' > input

test: main.exe
    @for i in cases/*.in; do \
        ./main.exe < $$i > /tmp/out; \
        cmp -s /tmp/out $${i%in}out; \
        RETVAL=$$?; \
        if [  $$RETVAL -eq 1 ]; then \
        /bin/echo -e '\e[31m'$$i'\e[m'; \
        diff /tmp/out $${i%in}out; \
        exit 1; \
        fi; \
        done; \
        /bin/echo -e '\e[34mpassed!\e[m'


clean:
    -mkdir cases
    -rm -f out *.exe cases/* /tmp/out
  1. main.cc を書く
  2. 入力を一つ、コピペした状態で make
  3. ひとつずつ、cases/xxx.incases/xxx.out を用意して make test
  4. make clean は、cases/ の中身を吹き飛ばす

シェルスクリプトをMakefileの中に書くのがすごい苦手で、 行頭に @ を置く方法と、 echo を絶対パスで指定するのを知った。 素でechoするとmakeの組み込みか何かが働く?かでオプションを理解してくれない。