Support GNU/Linux target.
[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
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 with_fraucheky=no
45 with_index=none
46
47 # Revision numbers
48 if test -e ../.git; then
49   if type git >/dev/null 2>&1; then
50      REVISION=$(git describe --dirty="-modified")
51      REVISION_CHOPSTX=$(cd ../chopstx && git describe --dirty="-modified")
52      REVISION_FRAUCHEKY=$(cd ../fraucheky && git describe --dirty="-modified")
53   else
54      # echo 'No git available, please install git'
55      GIT_REVISION=$(sed -e 's/^\(.......\).*$/g\1/' "../.git/$(sed -e 's/^ref: //' ../.git/HEAD)")
56      REVISION=$(cat ../VERSION)-$GIT_REVISION
57      REVISION_CHOPSTX=$(cat ../chopstx/VERSION)-$(sed -e 's/^\(.......\).*$/g\1/' ../.git/modules/chopstx/HEAD)
58      REVISION_FRAUCHEKY=$(cat ../fraucheky/VERSION)-$(sed -e 's/^\(.......\).*$/g\1/' ../.git/modules/fraucheky/HEAD)
59   fi
60 else
61   REVISION=$(cat ../VERSION)
62   REVISION_CHOPSTX=$(cat ../chopstx/VERSION)
63   REVISION_FRAUCHEKY=$(cat ../fraucheky/VERSION)
64 fi
65
66 # Process each option
67 for option; do
68   case $option in
69   *=*)  optarg=$(expr "X$option" : '[^=]*=\(.*\)') ;;
70   *)    optarg=yes ;;
71   esac
72
73   case $option in
74   -h | --help)
75     help=yes ;;
76   -v | --verbose)
77     verbose=yes ;;
78   --vidpid=*)
79     vidpid=$optarg ;;
80   --target=*)
81     target=$optarg ;;
82   --enable-sys1-compat)
83     sys1_compat=yes ;;
84   --disable-sys1-compat)
85     sys1_compat=no ;;
86   --with-dfu)
87     with_dfu=yes ;;
88   --without-dfu)
89     with_dfu=no ;;
90   --with-fraucheky=*)
91     with_fraucheky=$optarg ;;
92   --without-fraucheky)
93     with_fraucheky=no ;;
94   --with-index=*)
95     with_index=$optarg ;;
96   *)
97     echo "Unrecognized option \`$option'" >&2
98     echo "Try \`$0 --help' for more information." >&2
99     exit 1
100     ;;
101   esac
102 done
103
104 if test "$help" = "yes"; then
105   cat <<EOF
106 Usage: $0 [OPTION]...
107
108 Defaults for the options are specified in brackets.
109
110 Configuration:
111   -h, --help            display this help and exit      [no]
112   --vidpid=VID:PID      specify vendor/product ID       [<NONE>]
113   --target=TARGET       specify target                  [FST_01]
114                         supported targets are:
115                            FST_01
116                            STM8S_DISCOVERY
117                            OLIMEX_STM32_H103
118                            STM32_PRIMER2
119                            STBEE
120                            STBEE_MINI
121                            MAPLE_MINI
122                            ST_DONGLE
123                            ST_NUCLEO_F103
124                            NITROKEY_START
125                            CQ_STARM
126                            FST_01_00 (unreleased version with 8MHz XTAL)
127   --enable-sys1-compat  enable SYS 1.0 compatibility    [yes]
128                            executable is target dependent
129   --disable-sys1-compat disable SYS 1.0 compatibility   [no]
130                            executable is target independent
131                            but requires SYS 3.0 or newer
132   --with-dfu            build image for DFU             [<target specific>]
133
134   --with-fraucheky=VID:PID
135                         include fraucheky support       [no]
136   --with-index=INDEX    specify INDEX file              [none]
137 EOF
138   exit 0
139 fi
140
141 if test "$vidpid" = "none"; then
142   echo "Please specify Vendor ID and Product ID by --vidpid option." >&2
143   exit 1
144 fi
145
146 if ! test "$with_fraucheky" = "no"; then
147   ../fraucheky/configure $with_fraucheky $with_index $REVISION $REVISION_CHOPSTX $REVISION_FRAUCHEKY
148   ENABLE_FRAUCHEKY=""
149   FRAUCHEKY_DEFINE="#define FRAUCHEKY_SUPPORT 1"
150   FRAUCHEKY_MSC_DEFINE="#define MSC_INTERFACE_NO    2"
151 else
152   ENABLE_FRAUCHEKY="# "
153   FRAUCHEKY_DEFINE="#undef FRAUCHEKY_SUPPORT"
154   FRAUCHEKY_MSC_DEFINE="#undef MSC_INTERFACE_NO"
155   if ! test -f ../fraucheky/build.mk; then
156     echo "Submodule 'fraucheky' not found" >&2
157     echo "You might need: git submodule update --init" >&2
158     exit 1
159   fi
160 fi
161
162 BOARD_HEADER_FILE=board-$(echo $target | tr '_[:upper:]' '-[:lower:]').h
163 echo Header file is: $BOARD_HEADER_FILE
164 ln -sf ../chopstx/board/$BOARD_HEADER_FILE board.h
165
166 # Flash page size in byte
167 FLASH_PAGE_SIZE=1024
168 # Flash memory size in KiB
169 FLASH_SIZE=128
170 # Memory size in KiB
171 MEMORY_SIZE=20
172
173 # Settings for TARGET
174 case $target in
175 CQ_STARM|STBEE_MINI)
176   if test "$with_dfu" = "default"; then
177     with_dfu=yes;
178   fi  ;;
179 STM32_PRIMER2)
180   FLASH_PAGE_SIZE=2048
181   FLASH_SIZE=512
182   MEMORY_SIZE=64
183   ;;
184 STBEE)
185   FLASH_PAGE_SIZE=2048
186   FLASH_SIZE=512
187   MEMORY_SIZE=64
188   if test "$with_dfu" = "default"; then
189     with_dfu=yes;
190   fi  ;;
191 STM8S_DISCOVERY)
192   FLASH_SIZE=64
193   ;;
194 *)
195   ;;
196 esac
197
198 if test "$target" = "GNU_LINUX"; then
199   ldscript=""
200   chip="gnu-linux"
201   use_sys=""
202   emulation="yes"
203   cross=""
204   mcu="none"
205   def_emulation="-DGNU_LINUX_EMULATION"
206   libs="-lpthread"
207 else
208   ldscript="neug.ld"
209   chip="stm32f103"
210   use_sys="yes"
211   emulation=""
212   cross="arm-none-eabi-"
213   mcu="cortex-m3"
214   def_emulation=""
215   libs=""
216 fi
217
218 # --with-dfu option
219 if test "$with_dfu" = "yes"; then
220   if test "$target" = "FST_01" -o "$target" = "FST_01_00"; then
221       echo "FST-01 doesn't have DFU loader, you should not use --with-dfu." >&2
222       exit 1
223   fi
224   echo "Configured for DFU"
225   ORIGIN=0x08003000
226   FLASH_SIZE=$(expr $FLASH_SIZE - 12)
227   DFU_DEFINE="#define DFU_SUPPORT 1"
228   HEXOUTPUT_MAKE_OPTION="ENABLE_OUTPUT_HEX=yes"
229 else
230   with_dfu=no
231   echo "Configured for bare system (no-DFU)"
232   ORIGIN=0x08000000
233   DFU_DEFINE="#undef DFU_SUPPORT"
234   HEXOUTPUT_MAKE_OPTION=""
235 fi
236
237 ### !!! Replace following string of "FSIJ" to yours !!! ####
238 SERIALNO="FSIJ-$(cat ../VERSION | sed -e 's%^[^/]*/%%')-"
239
240 SERIALNO_STR_LEN_DEFINE="#define SERIALNO_STR_LEN ${#SERIALNO}"
241
242
243 if test "$sys1_compat" = "yes"; then
244   CONFIG="$target:dfu=$with_dfu"
245 else
246   if test "$with_dfu" = "yes"; then
247     echo "Common binary can't support DFU loader, don't use --with-dfu." >&2
248     exit 1
249   fi
250   # Override settings for common binary.  Safer side.
251   FLASH_PAGE_SIZE=2048
252   FLASH_SIZE=128
253   MEMORY_SIZE=20
254   CONFIG="common"
255 fi
256
257 output_vid_pid_version () {
258   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"
259   echo $VERSION | sed -n -e "s%^\([0-9a-f][0-9a-f]\)\([0-9a-f][0-9a-f]\)$%  0x\2, 0x\1, /* bcdDevice */%p"
260 }
261
262 output_vendor_product_serial_strings () {
263   prefix=$1
264
265   echo "static const uint8_t ${prefix}string_vendor[] = {"
266   echo "  ${#VENDOR}*2+2,                       /* bLength */"
267   echo "  STRING_DESCRIPTOR,            /* bDescriptorType */"
268   echo "  /* Manufacturer: \"$VENDOR\" */"
269   echo $VENDOR | sed -e "s/\(........\)/\1\\${nl}/g" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/  /" -e "/^  ./s/ $//p"
270   echo '};'
271   echo
272   echo "static const uint8_t ${prefix}string_product[] = {"
273   echo "  ${#PRODUCT}*2+2,                      /* bLength */"
274   echo "  STRING_DESCRIPTOR,            /* bDescriptorType */"
275   echo "  /* Product name: \"$PRODUCT\" */"
276   echo $PRODUCT | sed -e "s/\(........\)/\1\\${nl}/g" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/  /" -e "/^  ./s/ $//p"
277   echo '};'
278
279   if test -n "$prefix"; then
280   echo
281   echo "static uint8_t ${prefix}string_serial[] = {"
282   echo "  ${#SERIALNO}*2+2+16,                  /* bLength */"
283   echo "  STRING_DESCRIPTOR,            /* bDescriptorType */"
284   echo "  /* Serial number: \"$SERIALNO\" */"
285   echo $SERIALNO | sed -e "s/\(........\)/\1\\${nl}/g" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/  /" -e "/^  ./s/ $//p"
286   echo "  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,"
287   echo "  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,"
288   echo '};'
289   echo
290   echo "static const uint8_t ${prefix}revision_detail[] = {"
291   echo "  ${#REVISION}*2+2,                     /* bLength */"
292   echo "  STRING_DESCRIPTOR,            /* bDescriptorType */"
293   echo "  /* revision detail: \"$REVISION\" */"
294   echo $REVISION | sed -e "s/\(........\)/\1\\${nl}/g" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/  /" -e "/^  ./s/ $//p"
295   echo '};'
296   echo
297   echo "static const uint8_t ${prefix}config_options[] = {"
298   echo "  ${#CONFIG}*2+2,                       /* bLength */"
299   echo "  STRING_DESCRIPTOR,            /* bDescriptorType */"
300   echo "  /* configure options: \"$CONFIG\" */"
301   echo $CONFIG | sed -e "s/\(........\)/\1\\${nl}/g" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/  /" -e "/^  ./s/ $//p"
302   echo '};'
303   fi
304 }
305
306 if !(IFS="      "
307   while read VIDPID VERSION PRODUCT VENDOR; do
308     if test "$vidpid" = "$VIDPID"; then
309       output_vid_pid_version > usb-vid-pid-ver.c.inc
310       output_vendor_product_serial_strings neug_ >usb-strings.c.inc
311       exit 0
312     elif test "$with_fraucheky" = "$VIDPID"; then
313       output_vid_pid_version > fraucheky-vid-pid-ver.c.inc
314       output_vendor_product_serial_strings >fraucheky-usb-strings.c.inc
315     fi
316   done; exit 1) < ../NEUG_USB_DEVICE_ID
317 then
318   echo "Please specify valid Vendor ID and Product ID." >&2
319   echo "Check ../NEUG_USB_DEVICE_ID." >&2
320   exit 1
321 fi
322
323 if test "$sys1_compat" = "no"; then
324     # Disable when you are sure that it's sys version 3.0 or later.
325     # Note that Gnuk 1.0 and NeuG (until 0.06) uses sys version 1.0.
326     # Disabling the compatibility, executable will be target independent,
327     # assuming the clock initialization will be done by clock_init in 
328     # SYS.
329     use_sys3="-DUSE_SYS3"
330 else
331     use_sys3=""
332 fi
333
334
335 sed -e "s%@LDSCRIPT@%$ldscript%" \
336     -e "s%@CHIP@%$chip%" \
337     -e "s%@USE_SYS@%$use_sys%" \
338     -e "s%@EMULATION@%$emulation%" \
339     -e "s%@CROSS@%$cross%" \
340     -e "s%@MCU@%$mcu%" \
341     -e "s%@DEF_EMULATION@%$def_emulation%" \
342     -e "s%@LIBS@%$libs%" \
343     -e "s%@USE_SYS3@%$use_sys3%" \
344     -e "s%@ENABLE_FRAUCHEKY@%$ENABLE_FRAUCHEKY%" \
345     -e "s%@HEXOUTPUT_MAKE_OPTION@%$HEXOUTPUT_MAKE_OPTION%" \
346         < Makefile.in > Makefile
347 sed -e "s/@ORIGIN@/$ORIGIN/" -e "s/@FLASH_SIZE@/$FLASH_SIZE/" \
348     -e "s/@MEMORY_SIZE@/$MEMORY_SIZE/" \
349     -e "s/@FLASH_PAGE_SIZE@/$FLASH_PAGE_SIZE/" \
350         < neug.ld.in > neug.ld
351 sed -e "s/@DFU_DEFINE@/$DFU_DEFINE/" \
352     -e "s/@SERIALNO_STR_LEN_DEFINE@/$SERIALNO_STR_LEN_DEFINE/" \
353     -e "s/@FRAUCHEKY_DEFINE@/$FRAUCHEKY_DEFINE/" \
354     -e "s/@FRAUCHEKY_MSC_DEFINE@/$FRAUCHEKY_MSC_DEFINE/" \
355         < config.h.in > config.h
356 exit 0