前の日 / 次の日 / 最新

swk's log

2006-06-11 Sun

* 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 だったと思うけど.「世界一汎用性の高いプログラム」だったか何だかそんなの.

<< 2006-06 >>
SuMoTuWeThFrSa
123
45678910
11121314151617
18192021222324
252627282930

2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12
2002 : 01 02 03 04 05 06 07 08 09 10 11 12
2001 : 01 02 03 04 05 06 07 08 09 10 11 12
2000 : 01 02 03 04 05 06 07 08 09 10 11 12
1999 : 01 02 03 04 05 06 07 08 09 10 11 12
1998 : 01 02 03 04 05 06 07 08 09 10 11 12
1997 : 01 02 03 04 05 06 07 08 09 10 11 12
1996 : 01 02 03 04 05 06 07 08 09 10 11 12

最終更新時間: 2012-02-13 02:02


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