トップ «前の日記(2014-08-17(Sun)) 最新 次の日記(2014-08-21(Thu))» 編集

屑俺日記

僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。


2014-08-20(Wed) ひと寝入りしてから

分割コンパイルのてすと

あれこれチラ見して試す。
どうするのか、一応エラーが出ないことだけをまず確認。

$ cat hoge.c 
#include<stdio.h>
int main2();
 
int main()
{
	printf("foo\n");
	main2();
	return 0;
}
 
$ cat fuga.c 
#include<stdio.h>
int main2()
{
	printf("bar\n");
	return 0;
}
$ gcc -Wall hoge.c fuga.c -o hogefuga
 
$ ./hogefuga
foo
bar

で、お馬鹿な分割コンパイル

を実現する pythonスクリプトを書いた。
いや汚い。

$ python div.py 34
 
$ ls *.c
func_0.c  func_1.c  func_2.c  main.c

printfでfizzbuzzを15の倍数まで出力する関数func0(), func1(),... を定義し、それを一つずつ ソースファイルfunc_0.c, func_1.c ... に書き出す。
これは末尾。

$ cat func_2.c 
#include<stdio.h>
int func2()
{
	printf("31\n32\nfizz\n34\n");
	return 0;
}

で、全関数のプロトタイプ宣言を書いて、 main関数内で全部実行する main.c も。

$ cat main.c 
#include<stdio.h>
int func0();
int func1();
int func2();
int main()
{
	func0();
	func1();
	func2();
	return 0;
}

最終的なオブジェクトファイルは、やはり かなり大きくなってしまう。

$ time python div.py 2000000                       
 
real    0m8.227s
user    0m4.388s
sys     0m3.276s
 
$ time for x in func*.c main.c ; do gcc -Wall -c $x ; done
 
real    66m37.258s
user    38m31.260s
sys     16m26.678s
 
$ time gcc -Wall *.o -o 2000000
 
real    13m52.712s
user    0m25.854s
sys     0m49.535s
 
$ ls -lh 2000000 
-rwxr-xr-x 1 user group 32M  8月 20 16:34 2000000

200万行は、一応ビルド、実行できた(SWAPかなり)。
ちなみに こないだの200万行は14MBだった。 あと、stripさせると、こないだの方はあまり変らなかったが こっちは32MBが23MBになった。

Makefileは、考える気になったら考えよう。

結局考えて実装してしまった。

お馬鹿なfizzbuzzを吐くCソースを出力する Pythonスクリプトで Makefileも出力させるようにする。
オブジェクトのファイル名はfizzbuzzの末尾 (ただし"fizz"とかではない)。
stripするとかなり小さくなったので、 後でこれも加えた。

$ python div_make.py 83
 
$ ls
Makefile     func_0.c  func_2.c  func_4.c  main.c
div_make.py  func_1.c  func_3.c  func_5.c
$ cat Makefile 
all:
	gcc -Wall -c func_0.c
	gcc -Wall -c func_1.c
	gcc -Wall -c func_2.c
	gcc -Wall -c func_3.c
	gcc -Wall -c func_4.c
	gcc -Wall -c func_5.c
	gcc -Wall -c main.c
link:
	gcc -Wall *.o -o 83
	strip 83
clean:
	rm -rf Makefile func_*.c *.o main.c 83

さて、make(1)は巨大なMakefileを解釈できるのだろうか。


リンクはご自由にどうぞ。でもURLや内容が変った場合はあしからず。

index.htmlは ここから。