Version 1.0.9.
[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, 2016, 2017, 2018
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 #
28 # Submodule check
29 #
30 if ! test -f ../chopstx/rules.mk; then
31   echo "Submodule 'chopstx' not found" >&2
32   echo "You might need: git submodule update --init" >&2
33   exit 1
34 fi
35
36 # Default settings
37 help=no
38 vidpid=none
39 target=FST_01
40 verbose=no
41 with_dfu=default
42 debug=no
43 sys1_compat=yes
44 ackbtn_support=no
45 with_fraucheky=no
46 with_index=none
47 # For emulation
48 prefix=/usr/local
49 exec_prefix='${prefix}'
50 libexecdir='${exec_prefix}/libexec'
51
52 # Revision numbers
53 if test -e ../.git; then
54   if type git >/dev/null 2>&1; then
55      REVISION=$(git describe --dirty="-modified")
56      REVISION_CHOPSTX=$(cd ../chopstx && git describe --dirty="-modified")
57      REVISION_FRAUCHEKY=$(cd ../fraucheky && git describe --dirty="-modified")
58   else
59      # echo 'No git available, please install git'
60      GIT_REVISION=$(sed -e 's/^\(.......\).*$/g\1/' "../.git/$(sed -e 's/^ref: //' ../.git/HEAD)")
61      REVISION=$(cat ../VERSION)-$GIT_REVISION
62      REVISION_CHOPSTX=$(cat ../chopstx/VERSION)-$(sed -e 's/^\(.......\).*$/g\1/' ../.git/modules/chopstx/HEAD)
63      REVISION_FRAUCHEKY=$(cat ../fraucheky/VERSION)-$(sed -e 's/^\(.......\).*$/g\1/' ../.git/modules/fraucheky/HEAD)
64   fi
65 else
66   REVISION=$(cat ../VERSION)
67   REVISION_CHOPSTX=$(cat ../chopstx/VERSION)
68   REVISION_FRAUCHEKY=$(cat ../fraucheky/VERSION)
69 fi
70
71 # Process each option
72 for option; do
73   case $option in
74   *=*)  optarg=$(expr "X$option" : '[^=]*=\(.*\)') ;;
75   *)    optarg=yes ;;
76   esac
77
78   case $option in
79   -h | --help)
80     help=yes ;;
81   -v | --verbose)
82     verbose=yes ;;
83   --vidpid=*)
84     vidpid=$optarg ;;
85   --target=*)
86     target=$optarg ;;
87   --enable-sys1-compat)
88     sys1_compat=yes ;;
89   --disable-sys1-compat)
90     sys1_compat=no ;;
91   --with-dfu)
92     with_dfu=yes ;;
93   --without-dfu)
94     with_dfu=no ;;
95   --with-fraucheky=*)
96     with_fraucheky=$optarg ;;
97   --without-fraucheky)
98     with_fraucheky=no ;;
99   --with-index=*)
100     with_index=$optarg ;;
101   #
102   # For emulation
103   #
104   --prefix=*)
105     prefix=optarg ;;
106   --exec-prefix=*)
107     exec_prefix=optarg ;;
108   --libexecdir=*)
109     libexecdir=optarg ;;
110   *)
111     echo "Unrecognized option \`$option'" >&2
112     echo "Try \`$0 --help' for more information." >&2
113     exit 1
114     ;;
115   esac
116 done
117
118 if test "$help" = "yes"; then
119   cat <<EOF
120 Usage: $0 [OPTION]...
121
122 Defaults for the options are specified in brackets.
123
124 Configuration:
125   -h, --help            display this help and exit      [no]
126   --vidpid=VID:PID      specify vendor/product ID       [<NONE>]
127   --target=TARGET       specify target                  [FST_01]
128                         supported targets are:
129                            FST_01
130                            FST_01G
131                            FST_01SZ
132                            STM8S_DISCOVERY
133                            OLIMEX_STM32_H103
134                            MAPLE_MINI
135                            ST_DONGLE
136                            ST_NUCLEO_F103
137                            NITROKEY_START
138                            BLUE_PILL
139                            CQ_STARM
140                            STM32_PRIMER2
141                            STBEE
142                            STBEE_MINI
143                            FST_01_00 (unreleased version with 8MHz XTAL)
144   --enable-sys1-compat  enable SYS 1.0 compatibility    [yes]
145                            executable is target dependent
146   --disable-sys1-compat disable SYS 1.0 compatibility   [no]
147                            executable is target independent
148                            but requires SYS 3.0 or newer
149   --with-dfu            build image for DFU             [<target specific>]
150
151   --with-fraucheky=VID:PID
152                         include fraucheky support       [no]
153   --with-index=INDEX    specify INDEX file              [none]
154 EOF
155   exit 0
156 fi
157
158 if test "$with_fraucheky" = "no"; then
159   enable_fraucheky=""
160   FRAUCHEKY_DEFINE="#undef FRAUCHEKY_SUPPORT"
161   FRAUCHEKY_MSC_DEFINE="#undef MSC_INTERFACE_NO"
162 else
163   ../fraucheky/configure $with_fraucheky $with_index $REVISION $REVISION_CHOPSTX $REVISION_FRAUCHEKY
164   enable_fraucheky=yes
165   FRAUCHEKY_DEFINE="#define FRAUCHEKY_SUPPORT 1"
166   FRAUCHEKY_MSC_DEFINE="#define MSC_INTERFACE_NO    2"
167   if ! test -f ../fraucheky/build.mk; then
168     echo "Submodule 'fraucheky' not found" >&2
169     echo "You might need: git submodule update --init" >&2
170     exit 1
171   fi
172 fi
173
174 BOARD_HEADER_FILE=board-$(echo $target | tr '_[:upper:]' '-[:lower:]').h
175 echo "Header file is: $BOARD_HEADER_FILE"
176 ln -sf "../chopstx/board/$BOARD_HEADER_FILE" board.h
177
178 # Frequency
179 MHZ=72
180 # Flash page size in byte
181 FLASH_PAGE_SIZE=1024
182 # Flash memory size in KiB
183 FLASH_SIZE=128
184 # Memory size in KiB
185 MEMORY_SIZE=20
186
187 # Settings for TARGET
188 case $target in
189 CQ_STARM|STBEE_MINI)
190   if test "$with_dfu" = "default"; then
191     with_dfu=yes;
192   fi  ;;
193 STM32_PRIMER2)
194   FLASH_PAGE_SIZE=2048
195   FLASH_SIZE=512
196   MEMORY_SIZE=64
197   ;;
198 STBEE)
199   FLASH_PAGE_SIZE=2048
200   FLASH_SIZE=512
201   MEMORY_SIZE=64
202   if test "$with_dfu" = "default"; then
203     with_dfu=yes;
204   fi  ;;
205 BLUE_PILL|STM8S_DISCOVERY)
206   # It's 64KB version of STM32F103, but actually has 128KB
207   flash_override="-DSTM32F103_OVERRIDE_FLASH_SIZE_KB=128"
208   ;;
209 BLUE_PILL_G)
210   MHZ=96
211   ;;
212 FST_01SZ)
213   MHZ=96
214   ackbtn_support=yes
215   ;;
216 *)
217   ;;
218 esac
219
220 if test "$target" = "GNU_LINUX"; then
221   ldscript=""
222   chip="gnu-linux"
223   emulation="yes"
224   cross=""
225   mcu="none"
226   def_emulation="-DGNU_LINUX_EMULATION"
227   def_mhz=""
228   enable_hexoutput=""
229   libs="-lpthread"
230 else
231   ldscript="neug.ld"
232   chip="stm32f103"
233   emulation=""
234   cross="arm-none-eabi-"
235   mcu="cortex-m3"
236   def_emulation=""
237   def_mhz="-DMHZ=$MHZ"
238   enable_hexoutput=yes
239   libs=""
240 fi
241
242 if test "$emulation" = "yes"; then
243   if test "$vidpid" = "none"; then
244     vidpid=0000:0000
245   else
246     echo "Please don't specify VID:PID for emulation at compile time;"
247     echo "It is a user who should specify VID:PID at run time."
248     exit 1
249   fi
250 else
251   if test "$vidpid" = "none"; then
252     echo "Please specify Vendor ID and Product ID by --vidpid option." >&2
253   exit 1
254   fi
255 fi
256
257 # --with-dfu option
258 if test "$with_dfu" = "yes"; then
259   if test "$target" = "FST_01" -o "$target" = "FST_01G" \
260      -o "$target" = "FST_01_00"; then
261       echo "FST-01 doesn't have DFU loader, you should not use --with-dfu." >&2
262       exit 1
263   fi
264   echo "Configured for DFU"
265   ORIGIN=0x08003000
266   FLASH_SIZE=$((FLASH_SIZE - 12))
267   DFU_DEFINE="#define DFU_SUPPORT 1"
268 else
269   with_dfu=no
270   echo "Configured for bare system (no-DFU)"
271   ORIGIN=0x08000000
272   DFU_DEFINE="#undef DFU_SUPPORT"
273 fi
274
275 # Acknowledge button support
276 if test "$ackbtn_support" = "yes"; then
277   ACKBTN_DEFINE="#define ACKBTN_SUPPORT 1"
278   echo "Acknowledge button is supported"
279 else
280   ACKBTN_DEFINE="#undef ACKBTN_SUPPORT"
281   echo "Acknowledge button is not supported"
282 fi
283
284 ### !!! Replace following string of "FSIJ" to yours !!! ####
285 SERIALNO="FSIJ-$(sed -e 's%^[^/]*/%%' <../VERSION)-"
286
287 SERIALNO_STR_LEN_DEFINE="#define SERIALNO_STR_LEN ${#SERIALNO}"
288
289
290 if test "$sys1_compat" = "yes"; then
291   CONFIG="$target:dfu=$with_dfu"
292 else
293   if test "$with_dfu" = "yes"; then
294     echo "Common binary can't support DFU loader, don't use --with-dfu." >&2
295     exit 1
296   fi
297   # Override settings for common binary.  Safer side.
298   FLASH_PAGE_SIZE=2048
299   FLASH_SIZE=128
300   MEMORY_SIZE=20
301   CONFIG="common"
302 fi
303
304 output_vid_pid_version () {
305   echo "$VIDPID" | \
306   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]\)$%\1\t\2\t\3\t\4%p" | \
307   while read -r FIRST SECOND THIRD FOURTH; do
308     if test $FIRST != 00; then
309       echo replace_vid_msb $FIRST
310     fi
311     if test $SECOND != 00; then
312       echo replace_vid_lsb $SECOND
313     fi
314     if test $THIRD != 00; then
315       echo replace_pid_msb $THIRD
316     fi
317     if test $FOURTH != 00; then
318       echo replace_pid_lsb $FOURTH
319     fi
320   done
321   echo "$VERSION" | \
322   sed -n -e "s%^\([0-9a-f][0-9a-f]\)\([0-9a-f][0-9a-f]\)$%\1\t\2%p" | \
323   while read -r FIRST SECOND; do
324     if test $FIRST != 00; then
325       echo replace_bcd_device_msb $FIRST
326     fi
327     if test $SECOND != 00; then
328       echo replace_bcd_device_lsb $SECOND
329     fi
330   done
331 }
332
333 output_vendor_product_serial_strings () {
334   name=$1
335
336   echo "static const uint8_t ${name}string_vendor[] = {"
337   echo "  ${#VENDOR}*2+2,                       /* bLength */"
338   echo "  STRING_DESCRIPTOR,            /* bDescriptorType */"
339   echo "  /* Manufacturer: \"$VENDOR\" */"
340   echo "$VENDOR" | sed -e "s/\(........\)/\1\\${nl}/g" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/  /" -e "/^  ./s/ $//p"
341   echo '};'
342   echo
343   echo "static const uint8_t ${name}string_product[] = {"
344   echo "  ${#PRODUCT}*2+2,                      /* bLength */"
345   echo "  STRING_DESCRIPTOR,            /* bDescriptorType */"
346   echo "  /* Product name: \"$PRODUCT\" */"
347   echo "$PRODUCT" | sed -e "s/\(........\)/\1\\${nl}/g" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/  /" -e "/^  ./s/ $//p"
348   echo '};'
349
350   if test -n "$name"; then
351   echo
352   echo "static uint8_t ${name}string_serial[] = {"
353   echo "  ${#SERIALNO}*2+2+16,                  /* bLength */"
354   echo "  STRING_DESCRIPTOR,            /* bDescriptorType */"
355   echo "  /* Serial number: \"$SERIALNO\" */"
356   echo "$SERIALNO" | sed -e "s/\(........\)/\1\\${nl}/g" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/  /" -e "/^  ./s/ $//p"
357   if test "$emulation" = "yes"; then
358     echo "  'E', 0, 'M', 0, 'U', 0, 'L', 0,"
359     echo "  'A', 0, 'T', 0, 'E', 0, 'D', 0,"
360   else
361     echo "  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,"
362     echo "  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,"
363   fi
364   echo '};'
365   echo
366   echo "static const uint8_t ${name}revision_detail[] = {"
367   echo "  ${#REVISION}*2+2,                     /* bLength */"
368   echo "  STRING_DESCRIPTOR,            /* bDescriptorType */"
369   echo "  /* revision detail: \"$REVISION\" */"
370   echo "$REVISION" | sed -e "s/\(........\)/\1\\${nl}/g" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/  /" -e "/^  ./s/ $//p"
371   echo '};'
372   echo
373   echo "static const uint8_t ${name}config_options[] = {"
374   echo "  ${#CONFIG}*2+2,                       /* bLength */"
375   echo "  STRING_DESCRIPTOR,            /* bDescriptorType */"
376   echo "  /* configure options: \"$CONFIG\" */"
377   echo $CONFIG | sed -e "s/\(........\)/\1\\${nl}/g" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/  /" -e "/^  ./s/ $//p"
378   echo '};'
379   fi
380 }
381
382 (echo "#! /bin/bash"
383  echo
384  echo 'source "binary-edit.sh"') > put-vid-pid-ver.sh
385
386 if !(IFS="      "
387   while read -r VIDPID VERSION PRODUCT VENDOR; do
388     if test "$vidpid" = "$VIDPID"; then
389       echo                       >> put-vid-pid-ver.sh
390       echo 'addr=$file_off_ADDR' >> put-vid-pid-ver.sh
391       output_vid_pid_version     >> put-vid-pid-ver.sh
392       output_vendor_product_serial_strings neug_ >usb-strings.c.inc
393       exit 0
394     elif test "$with_fraucheky" = "$VIDPID"; then
395       echo                                 >> put-vid-pid-ver.sh
396       echo 'addr=$file_off_fraucheky_ADDR' >> put-vid-pid-ver.sh
397       output_vid_pid_version               >> put-vid-pid-ver.sh
398       output_vendor_product_serial_strings >fraucheky-usb-strings.c.inc
399     fi
400   done; exit 1) < ../NEUG_USB_DEVICE_ID
401 then
402   echo "Please specify valid Vendor ID and Product ID." >&2
403   echo "Check ../NEUG_USB_DEVICE_ID." >&2
404   exit 1
405 fi
406
407 if test "$sys1_compat" = "no"; then
408     # Disable when you are sure that it's sys version 3.0 or later.
409     # Note that Gnuk 1.0 and NeuG (until 0.06) uses sys version 1.0.
410     # Disabling the compatibility, executable will be target independent,
411     # assuming the clock initialization will be done by clock_init in 
412     # SYS.
413     use_sys3="-DUSE_SYS3"
414 else
415     use_sys3=""
416 fi
417
418
419 (echo "CHIP=$chip";
420  echo "EMULATION=$emulation";
421  echo "CROSS=$cross";
422  echo "MCU=$mcu";
423  echo "DEFS=$use_sys3 $flash_override $def_emulation $def_mhz";
424  echo "LDSCRIPT=$ldscript";
425  echo "LIBS=$libs";
426  echo "ENABLE_FRAUCHEKY=$enable_fraucheky";
427  echo "ENABLE_OUTPUT_HEX=$enable_hexoutput"
428  if test "$ackbtn_support" = "yes"; then
429    echo "USE_ACKBTN=yes"
430  fi
431  if test "$emulation" = "yes"; then
432    echo "prefix=$prefix"
433    echo "exec_prefix=$exec_prefix"
434    echo "libexecdir=$libexecdir"
435  fi
436 )       > config.mk
437 sed -e "s/@ORIGIN@/$ORIGIN/" -e "s/@FLASH_SIZE@/$FLASH_SIZE/" \
438     -e "s/@MEMORY_SIZE@/$MEMORY_SIZE/" \
439     -e "s/@FLASH_PAGE_SIZE@/$FLASH_PAGE_SIZE/" \
440         < neug.ld.in > neug.ld
441 sed -e "s/@DFU_DEFINE@/$DFU_DEFINE/" \
442     -e "s/@SERIALNO_STR_LEN_DEFINE@/$SERIALNO_STR_LEN_DEFINE/" \
443     -e "s/@FRAUCHEKY_DEFINE@/$FRAUCHEKY_DEFINE/" \
444     -e "s/@FRAUCHEKY_MSC_DEFINE@/$FRAUCHEKY_MSC_DEFINE/" \
445     -e "s/@ACKBTN_DEFINE@/$ACKBTN_DEFINE/" \
446         < config.h.in > config.h
447 exit 0