Skip to content

Instantly share code, notes, and snippets.

@nyaocat
Last active January 14, 2016 22:53
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nyaocat/e2171b3dc6c1493f4edf to your computer and use it in GitHub Desktop.
Save nyaocat/e2171b3dc6c1493f4edf to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
#
# インストール:
# このファイル自体を PATH のある場所に保存して chmod +x すれば OK
# 例:
# sudo sh -c "curl http://nyaocat.jp/misc/qcc > /usr/local/bin/qcc"
# sudo chmod +x /usr/local/bin/qcc
# qcc -h
#
# 動作環境:
# FreeBSD 8.4-RELEASE-p24
# CentOS 6.6
# Ubuntu MATE 15.04
# で確認
#
# サンプル C++ コード:
#
# #pragma cflags (-W -Wall -Wextra -DHOGE=7890)
# #pragma args (--color -x -e)
# #include <iostream>
#
# int main(int argc, char** argv) {
# using std::cout;
# using std::endl;
#
# cout << "hoge = " << HOGE << endl;
#
# cout << "argv = " << endl;
# for (int i = 1; i < argc; ++i) {
# cout << " '" << argv[i] << "'" << endl;
# }
# }
#
# LICENSE:
# zlib/libpng license
#
# Copyright:
# qcc 1.0.1
# 2015 (c) nyaocat
if test "${1:--h}" = "-h"
then
cat <<- EOF
使用方法
$ $0 'C++ファイル' [実行ファイルへと渡す引数]...
または、C++ファイルの一番上に
#!$(readlink -f $0)
と記述し、C++ファイル自体を実行(要 chmod +x)
説明
与えられたC++ファイルのコンパイルと実行を行います。
この時、 #pragma cflags (〜〜〜) と #pragma ldflags (〜〜〜)
の カッコ内の文字列がコンパイラに、 #pragma args (〜〜〜)
の文字列が実行時の引数に渡されます。
#pragma args が指定された場合は、コマンドラインから渡された引数は無視されます。
作成された実行ファイルがソースよりも新しい場合、コンパイルは省略され実行のみ行なわれます。
環境変数
CXX
使用するコンパイラコマンドです。
デフォルト : c++
QCC_DIR
コンパイル済ファイルの保存場所です。
デフォルト : /tmp/qcc_tmp
EOF
exit
fi
set -eu
QCC_DIR=${QCC_DIR:-/tmp/qcc_tmp}
TARGET=${QCC_DIR}/$(echo $(pwd)_${1}.exe | tr '/' '_' | tr '.' '_')
SOURCE=${QCC_DIR}/$(echo $(pwd)_${1} | tr '/' '_' | tr '.' '_').cpp
CXX=${CXX:-c++}
mkdir -p "$QCC_DIR"
if grep -q -E '^#pragma *args' "$1"
then
ARGS=$(cat $1 | grep -E '^#pragma *args' | sed -e 's/^.*(//' -e 's/).*$//' | tr -d '\r' | tr '\n' ' ')
fi
if test "$1" -nt "$TARGET"
then
CFLAGS=$(cat $1 | grep -E '^#pragma *cflags' | sed -e 's/^.*(//' -e 's/).*$//' | tr -d '\r' | tr '\n' ' ')
LDFLAGS=$(cat $1 | grep -E '^#pragma *ldflags' | sed -e 's/^.*(//' -e 's/).*$//' | tr -d '\r' | tr '\n' ' ')
echo "#line 1 \"$1\"" > $SOURCE
cat $1 | \
sed -e 's/^#!.*$//' \
-e 's/^#pragma *cflags.*$//' \
-e 's/^#pragma *ldflags.*$//' \
-e 's/^#pragma *args.*$//' \
>> $SOURCE
$CXX -o $TARGET $CFLAGS $SOURCE $LDFLAGS
fi
shift
exec $TARGET ${ARGS:-$@}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment