提案/クロスコンパイル/20060725


クロスコンパイル提案 by ひらっちさん

提案

さて、LinuxでもMonaOSをコンパイルできることがわかったので、その過程をもとに ビルド方式について提案していきましょうか。

とりあえず、configure書いてみた。

#ref(): File not found: "configure" at page "提案/クロスコンパイル/20060725"

Cygwinからは $ sh configure、Linuxからは --mingw-prefix オプションを指定する することで Makefile.inc を生成します。現在はMonaOSのソースが無くても実行でき ます。

C# コンパイラは、.NET Framework のものか、Monoのものを、自動で発見します。

移植性のあるシェルスクリプトを書くための良いドキュメントが見つからなかったの で、BSD系や、他のマイナーなUNIXで実行できるかは不明。

by ひげぽん

configure確認しました。良いと思います。
ぜひこれをベースに進めましょう。
ちなみに手元のcygwin での結果は

	HOSTDEF=-DHOST_CYGWIN
	MONADIR=/cygdrive/c/Documents and Settings/higepon/デスクトップ
		
	CFLAGS=-nostdlib -undef -Wall -fno-builtin -O3 -DMONA -DDEBUG_BUILD $(HOSTDEF)
	CXXFLAGS=$(CFLAGS) -fno-exceptions -fno-rtti
	NFLAGS=-I$(MONADIR)/include -f win32
		
	CC=/usr/bin/gcc
	CXX=/usr/bin/g++
	LD=/usr/bin/ld
	CSC=/cygdrive/c/WINDOWS/Microsoft.NET/Framework/v1.1.4322/csc.exe
	MONORT=

by Yume

Mac OS X 10.3.9で"sh configure --mingw-prefix=i386-mingw32-"と実行してできました。 結果を下に書きます。

	HOSTDEF=-DHOST_MINGW
	MONADIR=/Users/Yume/tmp/mona3/mona
	
	CFLAGS=-nostdlib -undef -Wall -fno-builtin -O3 -DMONA -DDEBUG_BUILD $(HOSTDEF)
	CXXFLAGS=$(CFLAGS) -fno-exceptions -fno-rtti
	NFLAGS=-I$(MONADIR)/include -f win32
	
	CC=/usr/local/bin/i386-mingw32-gcc
	CXX=/usr/local/bin/i386-mingw32-g++
	LD=/usr/local/bin/i386-mingw32-ld
	CSC=/usr/bin/mcs
	MONORT=/usr/bin/mono

旧confiugreの挙動

元のconfigureスクリプトとMakefileの挙動をまとめておく。

MONA/ ディレクトリで make すると、各ディレクトリに cd して make を実行する。 最初に移動するディレクトリが MONA/config だ。

MONA/config では configure スクリプトを実行し、make、make install の順に実行する。 configure スクリプトはまとめると、

という動作をする。

MONA/config で make をしても何も起こらない。

make install した場合、

という動作をする。

現状、MONADIRは環境変数からmakeに渡している。しかし、GNU make のマニュアルには、

環境からの変数には別の使い方もありますがお薦めしません。制御外でセットアップさ れる環境変数に動作が依存してしまうと、同じmakefileでも異なるユーザーが使えば違 った結果になってしまうため、これはmakefileを記述する上で賢い方法とはいえません 。これは大部分のmakefileの根本的な目的に反するものだからです。

とある。ひらっちもこれに同意する。makeはディレクトリの上で $ make と入力 することで必要なものが全てビルドされるというところに利点があるからです。

方針として、MONA/Makefile.inc を作成し、各 Makefile はそれを相対パスで include するという方向でいこう。ただ、いきなり全ての Makefile を変更して commit するの もなんなので、最初は簡単に元に戻せるよう工夫したい。

$(SRCTOP)/Makefile.inc を include するように変更

ブランチ作成しました。monaos/branches/new-build-system からどーぞ。

現在の設計では、MONADIR環境変数を指定しないと各ディレクトリのMakefileは動きません。しかし、これでは部分的にコンパイルしたいときなどに不便ですね。

そこで、ソースのトップに Makefile.inc を作成し、これを include することによって MONADIR を始めとする変数の設定を行うように変更した。

一応ビルドはできるようになったが、実行してみると、

interrupt timeout IDEDriver.cpp:557

というメッセージが出るばかりで先に進まなくなる。

最後までビルドが通ってしまうので原因がつかみにくくなってきた。 誰か見当がつく人はいませんか?

どうやら、現在のツリーで、古い方法でビルドしても同じ問題が発生する様子。 そういや、割込み関係でいろいろやってましたっけ。

qemu での動作確認してる人は他にいるでしょうか?

解決しました。

fat_write

fat_write は、コマンドを作成するだけでなく、いくつかのヘッダファイルと、fat.cpp をカーネル向けに提供する。 これはmake時にコピーされるんだけれど、これをなくしたい。

というのも、コピーされる毎にファイルのタイムスタンプが更新されるので、 毎回コンパイルが走ってしまうのだ。 また、オリジナルのソースがどこにあるのかわからなくなるというのも、何度も言って るように問題だ。

現在のビルドのしかた

new-build-system を branches から取ってきて、./configure、makeするだけ。

configure には --mingw-prefix と --bim2bin-cc のオプションが指定できます。

--mingw-prefixは、UNIX環境などでmingw32を使ってコンパイルするときに、例えば /usr/bin/i586-mingw32msvc-gcc の "gcc" より前の部分を指定します。 アセンブラやリンカなど他のツールも同じprefixを持っていると仮定しています。

--bim2bin-cc は、bim2binが4.x系列のgccでコンパイルできない問題を回避するため のオプションです。gccの名前を指定します。

MENU

now: 2

リンク


最新の20件
2018-05-03 2017-09-29 2017-04-25 2017-01-10 2016-12-11 2016-10-04 2016-08-14 2016-06-05 2016-05-29 2016-04-15 2015-12-28 2013-02-25 2013-02-21 2013-02-20 2013-02-12 2013-02-11 2013-02-10
最新の20件
2010-02-01 2010-01-31 2010-01-30 2010-01-29 2010-01-16

Counter: 4432, today: 2, yesterday: 1

リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS

Last-modified: 2008-03-28 (金) 15:48:03 (3711d);  Modified by mona
PukiWiki 1.4.6 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-ji
Powered by PHP 5.2.17
HTML convert time to 0.077 sec.