OSDN Git Service

マルチプロジェクト型にレポジトリを変更するために移動した
[toppersasp4lpc/asp.git] / asp / configure
1 #! /usr/bin/perl
2 #
3 #  TOPPERS Software
4 #      Toyohashi Open Platform for Embedded Real-Time Systems/
5
6 #  Copyright (C) 2001-2003 by Embedded and Real-Time Systems Laboratory
7 #                              Toyohashi Univ. of Technology, JAPAN
8 #  Copyright (C) 2006-2009 by Embedded and Real-Time Systems Laboratory
9 #              Graduate School of Information Science, Nagoya Univ., JAPAN
10
11 #  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
12 #  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
13 #  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
14 #  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15 #      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16 #      スコード中に含まれていること.
17 #  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18 #      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19 #      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
20 #      の無保証規定を掲載すること.
21 #  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22 #      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
23 #      と.
24 #    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25 #        作権表示,この利用条件および下記の無保証規定を掲載すること.
26 #    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
27 #        報告すること.
28 #  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29 #      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
30 #      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
31 #      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
32 #      免責すること.
33
34 #  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
35 #  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
36 #  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
37 #  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
38 #  の責任を負わない.
39
40 #  @(#) $Id: configure 1733 2010-02-03 03:50:52Z ertl-hiro $
41
42
43 require "getopt.pl";
44
45 #  オプションの定義
46 #
47 #  -T <target>                  ターゲット名(必須)
48 #  -A <applname>                アプリケーションプログラム名(デフォルトはsample1)
49 #  -a <appldir>                 アプリケーションのディレクトリ名
50 #  -U <applobjs>                他のアプリケーションプログラムファイル
51 #                                               (.oファイル名で指定.複数指定可)
52 #  -L <kernel_lib>              カーネルライブラリ(libkernel.a)のディレクトリ名
53 #                                               (省略した場合,カーネルライブラリもmakeする)
54 #  -f                                   カーネルを関数単位でコンパイルするかどうかの指定
55 #  -D <srcdir>                  カーネル等のソースの置かれているディレクトリ
56 #  -l <srclang>                 プログラミング言語(現時点ではcとc++のみサポート)
57 #  -t <templatedir>             テンプレートディレクトリの指定(デフォルトはsample)
58 #  -m <makefile>                テンプレートMakefile名の指定(デフォルトはMakefile)
59 #  -d <dbgenv>                  実行環境の名称
60 #  -r                                   トレースログ記録のサンプルコードを使用するかどうか
61 #                                               の指定
62 #  -p <perl>                    perlのパス名(明示的に指定する場合)
63 #  -g <cfg>                             コンフィギュレータ(cfg)のパス名
64
65 #  使用例(1)
66 #
67 #  % ../configure -T dve68k_gcc -D GDB_STUB -A perf1 -a ../test -U histogram.o
68 #
69 #  使用例(2)
70 #
71 #  % ../configure -T macosx_gcc -L .
72 #       アプリケーションプログラムは sample1 になる.
73
74 #
75 #  オプションの処理
76 #
77 do Getopt("TAaULDltmdpg");
78
79 #
80 #  変数の初期化
81 #
82
83 $target = $opt_T;
84 $applname = $opt_A ? $opt_A : "sample1";
85 $appldir = $opt_a ? $opt_a : "";
86 $applobjs = $opt_U ? $opt_U : "";
87 $kernel_lib = $opt_L ? $opt_L : "";
88 $kernel_funcobjs = $opt_f ? "true" : "";
89 $srclang = $opt_l ? $opt_l : "c";
90 $makefile = $opt_m ? $opt_m : "Makefile";
91 $dbgenv = $opt_d ? "TOPPERS_".$opt_d : "";
92 $enable_trace = $opt_r ? "true" : "";
93
94 #
95 #  オブジェクトファイル名の拡張子を返す
96 #
97 sub get_objext {
98         local(@uname);
99
100         use POSIX;
101         @uname = do uname();
102         if ($uname[0] =~ /^cygwin/i) {
103                 return("exe");
104         }
105         else {
106                 return("");
107         }
108 }
109
110 #
111 #  プログラムの場所を検索する
112 #
113 sub get_path {
114         local($progname, @pathlist) = @_;
115         local($path);
116
117         foreach $path (@pathlist) {
118                 if (-x $path."/".$progname) {
119                         return($path."/".$progname);
120                 }
121         }
122         return("");
123 }
124
125 #
126 #  ファイルを変換する
127 #
128 sub convert {
129         local($infile, $outfile) = @_;
130         local($line, $varname, $varval);
131
132         print STDERR "configure: Generating $outfile from $infile.\n";
133         if (-f $outfile) {
134                 print STDERR "configure: $outfile exists.",
135                                                 "  Save as $outfile.bak.\n";
136                 rename($outfile, $outfile.".bak");
137         }
138         unless (open(INFILE, $infile)) {
139                 print STDERR "configure: can't open $infile\n";
140                 exit(1);
141         }
142         unless (open(OUTFILE, "> ".$outfile)) {
143                 print STDERR "configure: can't open $outfile\n";
144                 exit(1);
145         }
146
147         while ($line = <INFILE>) {
148                 chop $line;
149                 while ($line =~ /^(.*)\@\(([A-Za-z_]+)\)(.*)$/) {
150                         $line = $1.$vartable{$2}.$3;
151                 }
152                 print OUTFILE $line,"\n";
153         }
154
155         close(INFILE);
156         close(OUTFILE);
157 }
158
159 #
160 #  サンプルを見つけてファイルを生成する
161 #
162 sub generate {
163         local($file, $mandatory) = @_;
164         local($path);
165
166         if ($sys) {
167                 $path = $templatedir."/".$file.".".$cpu."-".$sys;
168                 if (-f $path) {
169                         do convert($path, $file);
170                         return;
171                 }
172
173                 $path = $templatedir."/".$file.".".$sys;
174                 if (-f $path) {
175                         do convert($path, $file);
176                         return;
177                 }
178         }       
179
180         $path = $templatedir."/".$file.".".$cpu;
181         if (-f $path) {
182                 do convert($path, $file);
183                 return;
184         }       
185
186         $path = $templatedir."/".$file;
187         if ($mandatory || -f $path) {
188                 do convert($path, $file);
189         }       
190 }
191
192 #
193 #  ソースディレクトリ名を取り出す
194 #
195 $pwd = `pwd`; chop $pwd;
196 if ($opt_D) {
197         $srcabsdir = $srcdir = $opt_D;
198 }
199 elsif ($0 =~ /(.*)\/configure/) {
200         $srcdir = $1;
201         if ($srcdir =~ /^\//) {
202                 $srcabsdir = $srcdir;
203         }
204         else {
205                 $srcabsdir = $pwd."/".$srcdir;
206         }
207 }
208 else {
209         $srcabsdir = $srcdir = $pwd;
210 }
211
212 $perl = $opt_p ? $opt_p : do get_path("perl", ("/usr/local/bin", "/usr/bin"));
213 $cfg = $opt_g ? $opt_g : "\$(SRCDIR)/cfg/cfg/cfg";
214 $cfgfile = $opt_g ? $opt_g : $srcdir."/cfg/cfg/cfg";
215 $templatedir = $opt_t ? $opt_t : $srcdir."/sample";
216
217 #
218 #  -Tオプションの確認
219 #
220 unless ($opt_T) {
221         print STDERR "configure: -T option is mandatory\n";
222         print STDERR "Installed targets are:\n";
223         foreach $targetname (<$srcdir/target/[a-zA-Z1-9]*>) {
224                 $targetname =~ s|$srcdir/target/||;
225                 print STDERR "\t$targetname\n";
226         }
227         exit(1);
228 }
229
230 #
231 #  変数テーブルの作成
232 #
233 %vartable = ();
234 $vartable{"TARGET"} = $target;
235 $vartable{"APPLNAME"} = $applname;
236 $vartable{"APPLDIR"} = $appldir;
237 $vartable{"APPLOBJS"} = $applobjs;
238 $vartable{"KERNEL_LIB"} = $kernel_lib;
239 $vartable{"KERNEL_FUNCOBJS"} = $kernel_funcobjs;
240 $vartable{"SRCDIR"} = $srcdir;
241 $vartable{"SRCABSDIR"} = $srcabsdir;
242 $vartable{"SRCLANG"} = $srclang;
243 $vartable{"DBGENV"} = $dbgenv;
244 $vartable{"ENABLE_TRACE"} = $enable_trace;
245 $vartable{"PERL"} = $perl;
246 $vartable{"CFG"} = $cfg;
247 $objext = do get_objext();
248 $vartable{"OBJEXT"} = $objext;
249
250 #
251 #  ターゲットディレクトリのチェック
252 #
253
254 if (! -d $srcdir."/target/".$target) {
255         print STDERR "configure: $srcdir/target/$target not exist\n";
256         exit(1);
257 }
258
259 #
260 #  Makefile とアプリケーションファイルの生成
261 #
262
263 do generate($makefile, 1);
264 do generate($applname.".c", 0);
265 do generate($applname.".cpp", 0);
266 do generate($applname.".h", 0);
267 do generate($applname.".cfg", 0);
268
269 #
270 #  cfg ができているかのチェック
271 #
272
273 if (!(-x ($objext == "" ? $cfgfile : $cfgfile.".".$objext))) {
274         print STDERR "Executable file of the configurator (cfg) is not found.\n";
275 }