3951c1731f9f53b367b998007b8c13610d90200c
[gnuk/gnuk.git] / src / configure
1 #! /bin/bash
2
3 #
4 # This file is *NOT* generated by GNU Autoconf, but written by NIIBE Yutaka
5 #
6 # Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015
7 #               Free Software Initiative of Japan
8 #
9 # This file is a part of Gnuk, a GnuPG USB Token implementation.
10 # Gnuk is free software: you can redistribute it and/or modify it
11 # under the terms of the GNU General Public License as published by
12 # the Free Software Foundation, either version 3 of the License, or
13 # (at your option) any later version.
14 #
15 # Gnuk is distributed in the hope that it will be useful, but WITHOUT
16 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
17 # or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
18 # License for more details.
19 #
20 # You should have received a copy of the GNU General Public License
21 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
22
23 # Default settings
24 help=no
25 vidpid=none
26 target=FST_01
27 verbose=no
28 with_dfu=default
29 debug=no
30 sys1_compat=yes
31 pinpad=no
32 certdo=no
33 keygen=no
34 hid_card_change=no
35
36 # Revision number
37 if test -d ../.git; then
38   REVISION=`git describe --dirty="-modified"` 
39 else
40   REVISION=`cat ../VERSION`
41 fi
42
43 # Process each option
44 for option; do
45   case $option in
46   *=*)  optarg=`expr "X$option" : '[^=]*=\(.*\)'` ;;
47   *)    optarg=yes ;;
48   esac
49
50   case $option in
51   -h | --help)
52     help=yes ;;
53   -v | --verbose)
54     verbose=yes ;;
55   --vidpid=*)
56     vidpid=$optarg ;;
57   --target=*)
58     target=$optarg ;;
59   --enable-debug)
60     debug=yes ;;
61   --disable-debug)
62     debug=no ;;
63   --enable-pinpad=*)
64     pinpad=$optarg ;;
65   --disable-pinpad)
66     pinpad=no ;;
67   --enable-certdo)
68     certdo=yes ;;
69   --disable-certdo)
70     certdo=no ;;
71   --enable-keygen)
72     keygen=yes ;;
73   --disable-keygen)
74     keygen=no ;;
75   --enable-hid-card-change)
76     hid_card_change=yes ;;
77   --disable-hid-card-change)
78     hid_card_change=no ;;
79   --enable-sys1-compat)
80     sys1_compat=yes ;;
81   --disable-sys1-compat)
82     sys1_compat=no ;;
83   --with-dfu)
84     with_dfu=yes ;;
85   --without-dfu)
86     with_dfu=no ;;
87   *)
88     echo "Unrecognized option \`$option'" >&2
89     echo "Try \`$0 --help' for more information." >&2
90     exit 1
91     ;;
92   esac
93 done
94
95 if test "$help" = "yes"; then
96   cat <<EOF
97 Usage: $0 [OPTION]...
98
99 Defaults for the options are specified in brackets.
100
101 Configuration:
102   -h, --help            display this help and exit      [no]
103   --vidpid=VID:PID      specify vendor/product ID       [<NONE>]
104   --target=TARGET       specify target                  [FST_01]
105                         supported targets are:
106                            FST_01
107                            OLIMEX_STM32_H103
108                            STM32_PRIMER2
109                            STBEE
110                            STBEE_MINI
111                            MAPLE_MINI
112                            CQ_STARM
113                            FST_01_00 (unreleased version with 8MHz XTAL)
114   --enable-debug        debug with virtual COM port     [no]
115   --enable-pinpad=cir
116                         PIN entry support               [no]
117   --enable-certdo       support CERT.3 data object      [no]
118   --enable-keygen       support key generation          [no]
119   --enable-sys1-compat  enable SYS 1.0 compatibility    [yes]
120                            executable is target dependent
121   --disable-sys1-compat disable SYS 1.0 compatibility   [no]
122                            executable is target independent
123                            but requires SYS 2.0 or newer
124   --with-dfu            build image for DFU             [<target specific>]
125 EOF
126   exit 0
127 fi
128
129 if test "$vidpid" = "none"; then
130   echo "Please specify Vendor ID and Product ID by --vidpid option." 
131   exit 1
132 fi
133
134 BOARD_HEADER_FILE=board-`echo $target | tr '_[:upper:]' '-[:lower:]'`.h
135 echo Header file is: $BOARD_HEADER_FILE
136 ln -sf ../chopstx/board/$BOARD_HEADER_FILE board.h
137
138 # Flash page size in byte
139 FLASH_PAGE_SIZE=1024
140 # Flash memory size in KiB
141 FLASH_SIZE=128
142 # Memory size in KiB
143 MEMORY_SIZE=20
144
145 # Settings for TARGET
146 case $target in
147 CQ_STARM|STBEE_MINI)
148   if test "$with_dfu" = "default"; then
149     with_dfu=yes;
150   fi  ;;
151 STM32_PRIMER2)
152   FLASH_PAGE_SIZE=2048
153   FLASH_SIZE=512
154   MEMORY_SIZE=64
155   ;;
156 STBEE)
157   FLASH_PAGE_SIZE=2048
158   FLASH_SIZE=512
159   MEMORY_SIZE=64
160   if test "$with_dfu" = "default"; then
161     with_dfu=yes;
162   fi  ;;
163 STM8S_DISCOVERY)
164   FLASH_SIZE=64
165   ;;
166 *)
167   ;;
168 esac
169
170 # --enable-debug option
171 if test "$debug" = "yes"; then
172   DEBUG_MAKE_OPTION="ENABLE_DEBUG=1"
173   DEBUG_DEFINE="#define DEBUG 1"
174   echo "Debug option enabled"
175 else
176   DEBUG_MAKE_OPTION="# ENABLE_DEBUG=1"
177   DEBUG_DEFINE="#undef DEBUG"
178   echo "Debug option disabled"
179 fi
180
181 # --with-dfu option
182 if test "$with_dfu" = "yes"; then
183   if test "$target" = "FST_01" -o "$target" = "FST_01_00"; then
184       echo "FST-01 doesn't have DFU loader, you should not use --with-dfu."
185       exit 1
186   fi
187   echo "Configured for DFU"
188   ORIGIN=0x08003000
189   FLASH_SIZE=`expr $FLASH_SIZE - 12`
190   DFU_DEFINE="#define DFU_SUPPORT 1"
191   HEXOUTPUT_MAKE_OPTION="ENABLE_OUTPUT_HEX=yes"
192 else
193   with_dfu=no
194   echo "Configured for bare system (no-DFU)"
195   ORIGIN=0x08000000
196   DFU_DEFINE="#undef DFU_SUPPORT"
197   HEXOUTPUT_MAKE_OPTION=""
198 fi
199
200 # --enable-pinpad option
201 MSC_SIZE="0"
202 TIM_SIZE="0"
203 EXT_SIZE="0"
204 if test "$pinpad" = "no"; then
205   PINPAD_MAKE_OPTION="# ENABLE_PINPAD="
206   PINPAD_DEFINE="#undef PINPAD_SUPPORT"
207   PINPAD_MORE_DEFINE=""
208   echo "PIN pad option disabled"
209 else
210   PINPAD_MAKE_OPTION="ENABLE_PINPAD=$pinpad"
211   PINPAD_DEFINE="#define PINPAD_SUPPORT 1"
212   PINPAD_MORE_DEFINE="#define PINPAD_${pinpad^^[a-z]}_SUPPORT 1"
213   echo "PIN pad option enabled ($pinpad)"
214   if test "$pinpad" = "dnd"; then
215      MSC_SIZE="0x0200"
216   elif test "$pinpad" = "cir"; then
217      TIM_SIZE="0x00c0"
218      EXT_SIZE="0x00c0"
219   fi
220 fi
221
222 # --enable-certdo option
223 if test "$certdo" = "yes"; then
224   CERTDO_DEFINE="#define CERTDO_SUPPORT 1"
225   echo "CERT.3 Data Object is supported"
226 else
227   CERTDO_DEFINE="#undef CERTDO_SUPPORT"
228   echo "CERT.3 Data Object is NOT supported"
229 fi
230
231 # --enable-keygen option
232 if test "$keygen" = "yes"; then
233   KEYGEN_SUPPORT="-DKEYGEN_SUPPORT"
234   echo "Key generation on device is supported"
235 else
236   KEYGEN_SUPPORT=""
237   echo "Key generation on device is NOT supported"
238 fi
239
240 # --enable-hid-card-change option
241 if test "$hid_card_change" = "yes"; then
242   HID_CARD_CHANGE_DEFINE="#define HID_CARD_CHANGE_SUPPORT 1"
243   echo "Card insert/removal by HID device is supported"
244 else
245   HID_CARD_CHANGE_DEFINE="#undef HID_CARD_CHANGE_SUPPORT"
246   echo "Card insert/removal by HID device is NOT supported"
247 fi
248
249 ### !!! Replace following string of "FSIJ" to yours !!! ####
250 SERIALNO="FSIJ-`cat ../VERSION | sed -e 's%^[^/]*/%%'`-"
251
252 SERIALNO_STR_LEN_DEFINE="#define SERIALNO_STR_LEN ${#SERIALNO}"
253
254
255 if test "$sys1_compat" = "yes"; then
256   CONFIG="$target:dfu=$with_dfu:debug=$debug:pinpad=$pinpad:certdo=$certdo:keygen=$keygen"
257 else
258   if test "$with_dfu" = "yes"; then
259     echo "Common binary can't support DFU loader, don't use --with-dfu."
260     exit 1
261   fi
262   # Override settings for common binary.  Safer side.
263   FLASH_PAGE_SIZE=2048
264   FLASH_SIZE=128
265   MEMORY_SIZE=20
266   CONFIG="common:debug=$debug:pinpad=$pinpad:certdo=$certdo:keygen=$keygen"
267 fi
268
269 output_vid_pid_version () {
270   echo $VIDPID | sed -n -e "s%^\([0-9a-f][0-9a-f]\)\([0-9a-f][0-9a-f]\):\([0-9a-f][0-9a-f]\)\([0-9a-f][0-9a-f]\)$%  0x\2, 0x\1, /* idVendor  */\n  0x\4, 0x\3, /* idProduct */%p"
271   echo $VERSION | sed -n -e "s%^\([0-9a-f][0-9a-f]\)\([0-9a-f][0-9a-f]\)$%  0x\2, 0x\1, /* bcdDevice  */%p"
272 }
273
274 output_vendor_product_serial_strings () {
275   prefix=$1
276
277   echo "static const uint8_t ${prefix}string_vendor[] = {"
278   echo "  ${#VENDOR}*2+2,                       /* bLength */"
279   echo "  USB_STRING_DESCRIPTOR_TYPE,   /* bDescriptorType */"
280   echo "  /* Manufacturer: \"$VENDOR\" */"
281   echo $VENDOR | sed -n -e "s/\(........\)/\1\n/gp" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/  /" -e "s/ $//p"
282   echo '};'
283   echo
284   echo "static const uint8_t ${prefix}string_product[] = {"
285   echo "  ${#PRODUCT}*2+2,                      /* bLength */"
286   echo "  USB_STRING_DESCRIPTOR_TYPE,   /* bDescriptorType */"
287   echo "  /* Product name: \"$PRODUCT\" */"
288   echo $PRODUCT | sed -n -e "s/\(........\)/\1\n/gp" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/  /" -e "s/ $//p"
289   echo '};'
290
291   if test -n "$prefix"; then
292   echo
293   echo "uint8_t ${prefix}string_serial[] = {"
294   echo "  ${#SERIALNO}*2+2+16,                  /* bLength */"
295   echo "  USB_STRING_DESCRIPTOR_TYPE,   /* bDescriptorType */"
296   echo "  /* Serial number: \"$SERIALNO\" */"
297   echo $SERIALNO | sed -n -e "s/\(........\)/\1\n/gp" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/  /" -e "s/ $//p"
298   echo "  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,"
299   echo "  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,"
300   echo '};'
301   echo
302   echo '#ifdef USB_STRINGS_FOR_GNUK'
303   echo "static const uint8_t ${prefix}revision_detail[] = {"
304   echo "  ${#REVISION}*2+2,                     /* bLength */"
305   echo "  USB_STRING_DESCRIPTOR_TYPE,   /* bDescriptorType */"
306   echo "  /* revision detail: \"$REVISION\" */"
307   echo $REVISION | sed -n -e "s/\(........\)/\1\n/gp" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/  /" -e "s/ $//p"
308   echo '};'
309   echo
310   echo "static const uint8_t ${prefix}config_options[] = {"
311   echo "  ${#CONFIG}*2+2,                       /* bLength */"
312   echo "  USB_STRING_DESCRIPTOR_TYPE,   /* bDescriptorType */"
313   echo "  /* configure options: \"$CONFIG\" */"
314   echo $CONFIG | sed -n -e "s/\(........\)/\1\n/gp" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/  /" -e "s/ $//p"
315   echo '};'
316   echo '#endif'
317   fi
318 }
319
320 if !(IFS="      "
321   while read VIDPID VERSION PRODUCT VENDOR; do
322     if test "$vidpid" = "$VIDPID"; then
323       output_vid_pid_version > usb-vid-pid-ver.c.inc
324       output_vendor_product_serial_strings gnuk_ >usb-strings.c.inc
325       exit 0
326     fi
327   done; exit 1) < ../GNUK_USB_DEVICE_ID
328 then
329   echo "Please specify valid Vendor ID and Product ID." 
330   echo "Check ../GNUK_USB_DEVICE_ID."
331   exit 1
332 fi
333
334 if test "$sys1_compat" = "no"; then
335    # Disable when you are sure that it's sys version 2.1.
336    # Note that Gnuk 1.0 and NeuG (until 0.06) uses sys version 1.0.
337    # Disabling the compatibility, executable will be target independent,
338    # assuming the clock initialization will be done by SYS (before entry).
339    have_sys_h="-DHAVE_SYS_H"
340 else
341    have_sys_h=""
342 fi
343
344
345 sed -e "s%@HAVE_SYS_H@%$have_sys_h%" \
346     -e "s%@DEBUG_MAKE_OPTION@%$DEBUG_MAKE_OPTION%" \
347     -e "s%@PINPAD_MAKE_OPTION@%$PINPAD_MAKE_OPTION%" \
348     -e "s%@KEYGEN_SUPPORT@%$KEYGEN_SUPPORT%" \
349     -e "s%@HEXOUTPUT_MAKE_OPTION@%$HEXOUTPUT_MAKE_OPTION%" \
350         < Makefile.in > Makefile
351 if test "$certdo" = "yes"; then
352   sed -e "/^@CERTDO_SUPPORT_START@$/ d" -e "/^@CERTDO_SUPPORT_END@$/ d" \
353       -e "s/@ORIGIN@/$ORIGIN/" -e "s/@FLASH_SIZE@/$FLASH_SIZE/" \
354       -e "s/@MEMORY_SIZE@/$MEMORY_SIZE/" \
355       -e "s/@FLASH_PAGE_SIZE@/$FLASH_PAGE_SIZE/" \
356       -e "s/@MSC_SIZE@/$MSC_SIZE/" \
357       -e "s/@TIM_SIZE@/$TIM_SIZE/" \
358       -e "s/@EXT_SIZE@/$EXT_SIZE/" \
359         < gnuk.ld.in > gnuk.ld
360 else
361   sed -e "/^@CERTDO_SUPPORT_START@$/,/^@CERTDO_SUPPORT_END@$/ d" \
362       -e "s/@ORIGIN@/$ORIGIN/" -e "s/@FLASH_SIZE@/$FLASH_SIZE/" \
363       -e "s/@MEMORY_SIZE@/$MEMORY_SIZE/" \
364       -e "s/@FLASH_PAGE_SIZE@/$FLASH_PAGE_SIZE/" \
365       -e "s/@MSC_SIZE@/$MSC_SIZE/" \
366       -e "s/@TIM_SIZE@/$TIM_SIZE/" \
367       -e "s/@EXT_SIZE@/$EXT_SIZE/" \
368         < gnuk.ld.in > gnuk.ld
369 fi
370 sed -e "s/@DEBUG_DEFINE@/$DEBUG_DEFINE/" \
371     -e "s/@DFU_DEFINE@/$DFU_DEFINE/" \
372     -e "s/@PINPAD_DEFINE@/$PINPAD_DEFINE/" \
373     -e "s/@PINPAD_MORE_DEFINE@/$PINPAD_MORE_DEFINE/" \
374     -e "s/@CERTDO_DEFINE@/$CERTDO_DEFINE/" \
375     -e "s/@HID_CARD_CHANGE_DEFINE@/$HID_CARD_CHANGE_DEFINE/" \
376     -e "s/@SERIALNO_STR_LEN_DEFINE@/$SERIALNO_STR_LEN_DEFINE/" \
377         < config.h.in > config.h
378 exit 0