/ / 最新

swk's log - gcc で標準入力をコンパイル

2006-06-11

* gcc で標準入力をコンパイル [tech] 1 user

ファイル名の代わりに - を使う,だけではうまくいかなくて,一緒に -xc をつけるのがミソ.知らずに -xc をつけずに実行すると

gcc: -E required when input is from standard input

なんていう不親切なエラーメッセージが出て来て,正解にはたどり着けない.ひどい.


どうしてこんなことを調べたのかというと,この間書いた tcc [2006-06-08-3] みたいなことを普通の gcc でやってみたくなったのだった.

とりあえずこんな感じで.

/usr/local/bin/gccx:

#!/bin/sh

tmpf=/tmp/gccx.$$

cleantmp () {
  /bin/rm -f $tmpf
  exit
}
trap cleantmp INT QUIT TERM PIPE HUP

script=$1
shift
sed 's/^#!.*$//' $script | gcc -xc -o $tmpf - && $tmpf "$@"
cleantmp

テンポラリファイルがいまいちなのだが.まいいか.

で,スクリプトはこう書く.

test.c:

#!/usr/local/bin/gccx
#include <stdio.h>
int main() { printf("hello world\n"); return 0; }

で,実行.

% ./test.c
Badly placed (.

あれ? できない.test.c が csh で実行されているっぽい.なんだこれ.ごそごそ.

Tips.3
シェバング行に記述するコマンドは、必ずバイナリでなくてはならい。

http://x68000.q-e-d.net/~68user/unix/pickup?%A5%B7%A5%A7%A5%D0%A5%F3%A5%B0

…そうか,再帰的にスクリプトを実行をしてくれたりはしないのか.逃げ道もわかったのでやってみる.

#!/usr/bin/env gccx
#include <stdio.h>
int main() { printf("hello world\n"); return 0; }

な感じ.むー,微妙.もちろん gccx をバイナリ化すればいいんだけど,所詮お遊びなのでそこまでする気なし.


ちなみに,gcc -xc - な技を知るまでは,

#include "/dev/stdin"

なファイルを別に用意してました.これの元ネタはたしか エキスパートCプログラミング だったはず.ただし,/dev/stdin じゃなくて /dev/tty だったと思うけど.「世界一汎用性の高いプログラム」だったか何だかそんなの.

最終更新時間: 2009-01-04 15:31


Shingo W. Kagami - swk(at)kagami.org