OSDN Git Service

adds README
[qcad/qcad.git] / compiler / qcc
1 #!/bin/sh\r
2 \r
3 ###############################################################################\r
4 #                                                                             #\r
5 #   qcc - Quantum Circuit Compiler for Unix                                   #\r
6 #   J. Yamazaki, M. Suzuki and H. Watanabe                                    #\r
7 #   Copyright (C) 2003 QCAD project, all rights reserved.                     #\r
8 #                                                                             #\r
9 ###############################################################################\r
10 \r
11 \r
12 ###############################################################################\r
13 # Global valuables\r
14 ###############################################################################\r
15 # ocppfile\r
16 # ofile\r
17 # ifile\r
18 # qcpp_args\r
19 # gcc_args\r
20 \r
21 er_str0="Try 'qcc --help' for more information."\r
22 er_str1="No output file."\r
23 er_str2=" is unexpected option."\r
24 er_str3="'-o' option can be used only once."\r
25 er_str4="Too many input files."\r
26 er_str5="No input file."\r
27 er_str6="File not found."\r
28 er_str7="'-C' option can be used only once."\r
29 \r
30 version_str1="qcc version 0.2"\r
31 version_str2="Copyright (C) 2003 QCAD project."\r
32 \r
33 opt_stop=0\r
34 opt_create=0\r
35 opt_input=0\r
36 opt_output=0\r
37 opt_verbose=0\r
38 \r
39 inst_dir=../calcunits\r
40 \r
41 ###############################################################################\r
42 print_usage()\r
43 {\r
44         echo "Usage: qcc [options] file"\r
45         echo "Options:"\r
46         echo "  --help, -h ... Display this information"\r
47         echo "  -c         ... Compile into c++, but do not link"\r
48         echo "  -C \e[36mfile\e[00m    ... Create intermediate c++ file as \e[36mfile\e[00m"\r
49         echo "                 (is effective only when '-c' is not selected)"\r
50         echo "  -o \e[36mfile\e[00m    ... Place the output into \e[36mfile\e[00m"\r
51         echo "                 (is effective for both c++ file and executables)"\r
52         echo "  -v         ... Display the programs invoked by the compiler"\r
53         echo "  -V         ... Display qcc version number"\r
54         echo "Examples:"\r
55         echo "  qcc -c sample.mcd -o sample.cpp           OK"\r
56         echo "  qcc sample.mcd -o a.out                   OK"\r
57         echo "  qcc sample.mcd -C sample.cpp -o a.out     OK"\r
58         echo "  qcc -c sample.mcd -C sample.cpp -o a.out  \e[31;01mERROR!\e[00m"\r
59         echo "  \e[33mIn the last one, '-C' conflicts with '-o',"\r
60         echo "  then create a.out as c++ file.\e[00m"\r
61 }\r
62 \r
63 ###############################################################################\r
64 option_create()\r
65 {\r
66         if [ $opt_create -eq 0 ]; then\r
67                 if [ $1 ]; then\r
68                         ocppfile=$1\r
69                         opt_create=1\r
70                 else\r
71                         echo $er_str1\r
72                         exit 1\r
73                 fi\r
74         else\r
75                 echo $er_str7\r
76                 exit 1\r
77         fi\r
78 }\r
79 \r
80 ###############################################################################\r
81 option_o()\r
82 {\r
83         if [ $opt_output -eq 0 ]; then\r
84                 if [ $1 ]; then\r
85                         ofile=$1\r
86                         opt_output=1\r
87                 else\r
88                         echo $er_str1\r
89                         exit 1\r
90                 fi\r
91         else\r
92                 echo $er_str3\r
93                 exit 1\r
94         fi\r
95 }\r
96 \r
97 ###############################################################################\r
98 ###############################################################################\r
99 ###############################################################################\r
100 ###############################################################################\r
101 # Analyze arguments...\r
102 \r
103 if [ $1 ]; then\r
104         :\r
105 else\r
106         echo\r
107         echo $version_str2\r
108         echo $version_str1\r
109         echo\r
110         print_usage\r
111         echo\r
112         exit 0\r
113 fi\r
114 \r
115 while [ $1 ]\r
116 do\r
117         case $1 in\r
118         --help | -h)\r
119                 echo\r
120                 print_usage\r
121                 echo\r
122                 exit 0\r
123                 ;;\r
124         -c)\r
125                 opt_stop=1\r
126                 ;;\r
127         -C)\r
128                 shift\r
129                 option_create $1\r
130                 opt_create=1\r
131                 ;;\r
132         -o)\r
133                 shift\r
134                 option_o $1\r
135                 ;;\r
136         -v)\r
137                 opt_verbose=1\r
138                 ;;\r
139         -V)\r
140                 echo\r
141                 echo $version_str2\r
142                 echo $version_str1\r
143                 echo\r
144                 exit 0\r
145                 ;;\r
146         *)\r
147                 if [ $opt_input -eq 0 ]; then\r
148                         ifile=$1\r
149                         opt_input=1\r
150                 else\r
151                         echo "$er_str4   '$1'"\r
152                         exit 1\r
153                 fi\r
154                 ;;\r
155         esac\r
156 \r
157         if [ $1 ]; then\r
158                 shift\r
159         fi\r
160 done\r
161 \r
162 ###############################################################################\r
163 # Check arguments...\r
164 \r
165 if [ $opt_input -eq 0 ]; then\r
166         echo $er_str5\r
167         exit 1\r
168 fi\r
169 \r
170 if !([ -r $ifile ]); then\r
171         echo $er_str6\r
172         exit 1\r
173 fi\r
174 \r
175 ###############################################################################\r
176 # Create qcpp args\r
177 \r
178 qcpp_args=""\r
179 gcc_args="-I../qclib -I$inst_dir"\r
180 \r
181 #if [ $opt_verbose -eq 1 ]; then\r
182 #       qcpp_args="-v"\r
183 #fi\r
184 \r
185 qcpp_args="$qcpp_args $ifile"\r
186 \r
187 if [ $opt_stop -eq 1 ]; then\r
188         if [ $opt_output -eq 1 ]; then\r
189                 qcpp_args="$qcpp_args -o $ofile"\r
190         fi\r
191 else\r
192         if [ $opt_create -eq 0 ]; then\r
193                 ocppfile="qcctmp.cpp"\r
194         fi\r
195         qcpp_args="$qcpp_args -o $ocppfile"\r
196 #TODO:\r
197         gcc_args="$ocppfile $gcc_args ../qclib/qclib.a -lm"\r
198         if [ $opt_output -eq 1 ]; then\r
199                 gcc_args="$gcc_args -o $ofile"\r
200         fi\r
201 fi\r
202 \r
203 ###############################################################################\r
204 # For debug\r
205 #echo "qcpp_args   = $qcpp_args"\r
206 #echo "gcc_args    = $gcc_args"\r
207 #echo "opt_stop    = $opt_stop"\r
208 #echo "opt_create  = $opt_create"\r
209 #echo "opt_verbose = $opt_verbose"\r
210 #echo "opt_input   = $opt_input"\r
211 #echo "opt_output  = $opt_output"\r
212 #echo "ocppfile    = $ocppfile"\r
213 #echo "ofile       = $ofile"\r
214 #echo "ifile       = $ifile"\r
215 \r
216 ###############################################################################\r
217 # Compile phase...\r
218 \r
219 if [ $opt_verbose -eq 1 ]; then\r
220         echo "qcpp $qcpp_args"\r
221 fi\r
222 if !(qcpp $qcpp_args); then\r
223         exit 1\r
224 fi\r
225 \r
226 if [ $opt_stop -eq 1 ]; then\r
227         exit 0\r
228 fi\r
229 \r
230 ###############################################################################\r
231 \r
232 if [ $opt_verbose -eq 1 ]; then\r
233         echo g++ $gcc_args\r
234 fi\r
235 \r
236 g++ $gcc_args\r
237 \r
238 if [ $opt_create -eq 0 ] && [ -e $ocppfile ]; then\r
239         rm -f $ocppfile\r
240 fi\r
241 \r
242 exit 0\r