-
-
Save nyaocat/e2171b3dc6c1493f4edf to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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