Support Nitrokey Start
[gnuk/neug.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, 2015
10 #               Free Software Initiative of Japan
11 #
12 # This file is a part of NeuG, a Random Number Generator implementation.
13 #
14 # NeuG is free software: you can redistribute it and/or modify it
15 # under the terms of the GNU General Public License as published by
16 # the Free Software Foundation, either version 3 of the License, or
17 # (at your option) any later version.
18 #
19 # NeuG is distributed in the hope that it will be useful, but WITHOUT
20 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
21 # or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
22 # License for more details.
23 #
24 # You should have received a copy of the GNU General Public License
25 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
26
27 # Default settings
28 help=no
29 vidpid=none
30 target=FST_01
31 verbose=no
32 with_dfu=default
33 debug=no
34 sys1_compat=yes
35 with_fraucheky=no
36 with_index=none
37
38 # Revision numbers
39 if test -d ../.git; then
40   REVISION=`git describe --dirty="-modified"`
41   REVISION_CHOPSTX=`cd ../chopstx && git describe --dirty="-modified"`
42   REVISION_FRAUCHEKY=`cd ../fraucheky &&git describe --dirty="-modified"`
43 else
44   REVISION=`cat ../VERSION`
45   REVISION_CHOPSTX=`cat ../chopstx/VERSION`
46   REVISION_FRAUCHEKY=`cat ../fraucheky/VERSION`
47 fi
48
49 # Process each option
50 for option; do
51   case $option in
52   *=*)  optarg=`expr "X$option" : '[^=]*=\(.*\)'` ;;
53   *)    optarg=yes ;;
54   esac
55
56   case $option in
57   -h | --help)
58     help=yes ;;
59   -v | --verbose)
60     verbose=yes ;;
61   --vidpid=*)
62     vidpid=$optarg ;;
63   --target=*)
64     target=$optarg ;;
65   --enable-sys1-compat)
66     sys1_compat=yes ;;
67   --disable-sys1-compat)
68     sys1_compat=no ;;
69   --with-dfu)
70     with_dfu=yes ;;
71   --without-dfu)
72     with_dfu=no ;;
73   --with-fraucheky=*)
74     with_fraucheky=$optarg ;;
75   --without-fraucheky)
76     with_fraucheky=no ;;
77   --with-index=*)
78     with_index=$optarg ;;
79   *)
80     echo "Unrecognized option \`$option'" >&2
81     echo "Try \`$0 --help' for more information." >&2
82     exit 1
83     ;;
84   esac
85 done
86
87 if test "$help" = "yes"; then
88   cat <<EOF
89 Usage: $0 [OPTION]...
90
91 Defaults for the options are specified in brackets.
92
93 Configuration:
94   -h, --help            display this help and exit      [no]
95   --vidpid=VID:PID      specify vendor/product ID       [<NONE>]
96   --target=TARGET       specify target                  [FST_01]
97                         supported targets are:
98                            FST_01
99                            STM8S_DISCOVERY
100                            OLIMEX_STM32_H103
101                            STM32_PRIMER2
102                            STBEE
103                            STBEE_MINI
104                            MAPLE_MINI
105                            ST_DONGLE
106                            ST_NUCLEO_F103
107                            NITROKEY_START
108                            CQ_STARM
109                            FST_01_00 (unreleased version with 8MHz XTAL)
110   --enable-sys1-compat  enable SYS 1.0 compatibility    [yes]
111                            executable is target dependent
112   --disable-sys1-compat disable SYS 1.0 compatibility   [no]
113                            executable is target independent
114                            but requires SYS 2.0 or newer
115   --with-dfu            build image for DFU             [<target specific>]
116
117   --with-fraucheky=VID:PID
118                         include fraucheky support       [no]
119   --with-index=INDEX    specify INDEX file              [none]
120 EOF
121   exit 0
122 fi
123
124 if test "$vidpid" = "none"; then
125   echo "Please specify Vendor ID and Product ID by --vidpid option." 
126   exit 1
127 fi
128
129 if ! test "$with_fraucheky" = "no"; then
130   ../fraucheky/configure $with_fraucheky $with_index $REVISION $REVISION_CHOPSTX $REVISION_FRAUCHEKY
131   ENABLE_FRAUCHEKY=""
132   FRAUCHEKY_DEFINE="#define FRAUCHEKY_SUPPORT 1"
133   FRAUCHEKY_MSC_DEFINE="#define MSC_INTERFACE_NO    2"
134 else
135   ENABLE_FRAUCHEKY="# "
136   FRAUCHEKY_DEFINE="#undef FRAUCHEKY_SUPPORT"
137   FRAUCHEKY_MSC_DEFINE="#undef MSC_INTERFACE_NO"
138 fi
139
140 BOARD_HEADER_FILE=board-`echo $target | tr '_[:upper:]' '-[:lower:]'`.h
141 echo Header file is: $BOARD_HEADER_FILE
142 ln -sf ../chopstx/board/$BOARD_HEADER_FILE board.h
143
144 # Flash page size in byte
145 FLASH_PAGE_SIZE=1024
146 # Flash memory size in KiB
147 FLASH_SIZE=128
148 # Memory size in KiB
149 MEMORY_SIZE=20
150
151 # Settings for TARGET
152 case $target in
153 CQ_STARM|STBEE_MINI)
154   if test "$with_dfu" = "default"; then
155     with_dfu=yes;
156   fi  ;;
157 STM32_PRIMER2)
158   FLASH_PAGE_SIZE=2048
159   FLASH_SIZE=512
160   MEMORY_SIZE=64
161   ;;
162 STBEE)
163   FLASH_PAGE_SIZE=2048
164   FLASH_SIZE=512
165   MEMORY_SIZE=64
166   if test "$with_dfu" = "default"; then
167     with_dfu=yes;
168   fi  ;;
169 STM8S_DISCOVERY)
170   FLASH_SIZE=64
171   ;;
172 *)
173   ;;
174 esac
175
176 # --with-dfu option
177 if test "$with_dfu" = "yes"; then
178   if test "$target" = "FST_01" -o "$target" = "FST_01_00"; then
179       echo "FST-01 doesn't have DFU loader, you should not use --with-dfu."
180       exit 1
181   fi
182   echo "Configured for DFU"
183   ORIGIN=0x08003000
184   FLASH_SIZE=`expr $FLASH_SIZE - 12`
185   DFU_DEFINE="#define DFU_SUPPORT 1"
186   HEXOUTPUT_MAKE_OPTION="ENABLE_OUTPUT_HEX=yes"
187 else
188   with_dfu=no
189   echo "Configured for bare system (no-DFU)"
190   ORIGIN=0x08000000
191   DFU_DEFINE="#undef DFU_SUPPORT"
192   HEXOUTPUT_MAKE_OPTION=""
193 fi
194
195 ### !!! Replace following string of "FSIJ" to yours !!! ####
196 SERIALNO="FSIJ-`cat ../VERSION | sed -e 's%^[^/]*/%%'`-"
197
198 SERIALNO_STR_LEN_DEFINE="#define SERIALNO_STR_LEN ${#SERIALNO}"
199
200
201 if test "$sys1_compat" = "yes"; then
202   CONFIG="$target:dfu=$with_dfu"
203 else
204   if test "$with_dfu" = "yes"; then
205     echo "Common binary can't support DFU loader, don't use --with-dfu."
206     exit 1
207   fi
208   # Override settings for common binary.  Safer side.
209   FLASH_PAGE_SIZE=2048
210   FLASH_SIZE=128
211   MEMORY_SIZE=20
212   CONFIG="common"
213 fi
214
215 output_vid_pid_version () {
216   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"
217   echo $VERSION | sed -n -e "s%^\([0-9a-f][0-9a-f]\)\([0-9a-f][0-9a-f]\)$%  0x\2, 0x\1, /* bcdDevice */%p"
218 }
219
220 output_vendor_product_serial_strings () {
221   prefix=$1
222
223   echo "static const uint8_t ${prefix}string_vendor[] = {"
224   echo "  ${#VENDOR}*2+2,                       /* bLength */"
225   echo "  USB_STRING_DESCRIPTOR_TYPE,   /* bDescriptorType */"
226   echo "  /* Manufacturer: \"$VENDOR\" */"
227   echo $VENDOR | sed -e "s/\(........\)/\1\\${nl}/g" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/  /" -e "/^  ./s/ $//p"
228   echo '};'
229   echo
230   echo "static const uint8_t ${prefix}string_product[] = {"
231   echo "  ${#PRODUCT}*2+2,                      /* bLength */"
232   echo "  USB_STRING_DESCRIPTOR_TYPE,   /* bDescriptorType */"
233   echo "  /* Product name: \"$PRODUCT\" */"
234   echo $PRODUCT | sed -e "s/\(........\)/\1\\${nl}/g" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/  /" -e "/^  ./s/ $//p"
235   echo '};'
236
237   if test -n "$prefix"; then
238   echo
239   echo "static uint8_t ${prefix}string_serial[] = {"
240   echo "  ${#SERIALNO}*2+2+16,                  /* bLength */"
241   echo "  USB_STRING_DESCRIPTOR_TYPE,   /* bDescriptorType */"
242   echo "  /* Serial number: \"$SERIALNO\" */"
243   echo $SERIALNO | sed -e "s/\(........\)/\1\\${nl}/g" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/  /" -e "/^  ./s/ $//p"
244   echo "  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,"
245   echo "  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,"
246   echo '};'
247   echo
248   echo "static const uint8_t ${prefix}revision_detail[] = {"
249   echo "  ${#REVISION}*2+2,                     /* bLength */"
250   echo "  USB_STRING_DESCRIPTOR_TYPE,   /* bDescriptorType */"
251   echo "  /* revision detail: \"$REVISION\" */"
252   echo $REVISION | sed -e "s/\(........\)/\1\\${nl}/g" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/  /" -e "/^  ./s/ $//p"
253   echo '};'
254   echo
255   echo "static const uint8_t ${prefix}config_options[] = {"
256   echo "  ${#CONFIG}*2+2,                       /* bLength */"
257   echo "  USB_STRING_DESCRIPTOR_TYPE,   /* bDescriptorType */"
258   echo "  /* configure options: \"$CONFIG\" */"
259   echo $CONFIG | sed -e "s/\(........\)/\1\\${nl}/g" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/  /" -e "/^  ./s/ $//p"
260   echo '};'
261   fi
262 }
263
264 if !(IFS="      "
265   while read VIDPID VERSION PRODUCT VENDOR; do
266     if test "$vidpid" = "$VIDPID"; then
267       output_vid_pid_version > usb-vid-pid-ver.c.inc
268       output_vendor_product_serial_strings neug_ >usb-strings.c.inc
269       exit 0
270     elif test "$with_fraucheky" = "$VIDPID"; then
271       output_vid_pid_version > fraucheky-vid-pid-ver.c.inc
272       output_vendor_product_serial_strings >fraucheky-usb-strings.c.inc
273     fi
274   done; exit 1) < ../NEUG_USB_DEVICE_ID
275 then
276   echo "Please specify valid Vendor ID and Product ID." 
277   echo "Check ../NEUG_USB_DEVICE_ID."
278   exit 1
279 fi
280
281 if test "$sys1_compat" = "no"; then
282    # Disable when you are sure that it's sys version 2.1.
283    # Note that Gnuk 1.0 and NeuG (until 0.06) uses sys version 1.0.
284    # Disabling the compatibility, executable will be target independent,
285    # assuming the clock initialization will be done by SYS (before entry).
286    have_sys_h="-DHAVE_SYS_H"
287 else
288    have_sys_h=""
289 fi
290
291
292 sed -e "s%@HAVE_SYS_H@%$have_sys_h%" \
293     -e "s%@ENABLE_FRAUCHEKY@%$ENABLE_FRAUCHEKY%" \
294     -e "s%@HEXOUTPUT_MAKE_OPTION@%$HEXOUTPUT_MAKE_OPTION%" \
295         < Makefile.in > Makefile
296 sed -e "s/@ORIGIN@/$ORIGIN/" -e "s/@FLASH_SIZE@/$FLASH_SIZE/" \
297     -e "s/@MEMORY_SIZE@/$MEMORY_SIZE/" \
298     -e "s/@FLASH_PAGE_SIZE@/$FLASH_PAGE_SIZE/" \
299         < neug.ld.in > neug.ld
300 sed -e "s/@DFU_DEFINE@/$DFU_DEFINE/" \
301     -e "s/@SERIALNO_STR_LEN_DEFINE@/$SERIALNO_STR_LEN_DEFINE/" \
302     -e "s/@FRAUCHEKY_DEFINE@/$FRAUCHEKY_DEFINE/" \
303     -e "s/@FRAUCHEKY_MSC_DEFINE@/$FRAUCHEKY_MSC_DEFINE/" \
304         < config.h.in > config.h
305 exit 0