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