xref: /freebsd-src/crypto/libecc/scripts/crossbuild.sh (revision f0865ec9906d5a18fa2a3b61381f22ce16e606ad)
1*f0865ec9SKyle Evans#/*
2*f0865ec9SKyle Evans# *  Copyright (C) 2017 - This file is part of libecc project
3*f0865ec9SKyle Evans# *
4*f0865ec9SKyle Evans# *  Authors:
5*f0865ec9SKyle Evans# *      Ryad BENADJILA <ryadbenadjila@gmail.com>
6*f0865ec9SKyle Evans# *      Arnaud EBALARD <arnaud.ebalard@ssi.gouv.fr>
7*f0865ec9SKyle Evans# *      Jean-Pierre FLORI <jean-pierre.flori@ssi.gouv.fr>
8*f0865ec9SKyle Evans# *
9*f0865ec9SKyle Evans# *  Contributors:
10*f0865ec9SKyle Evans# *      Nicolas VIVET <nicolas.vivet@ssi.gouv.fr>
11*f0865ec9SKyle Evans# *      Karim KHALFALLAH <karim.khalfallah@ssi.gouv.fr>
12*f0865ec9SKyle Evans# *
13*f0865ec9SKyle Evans# *  This software is licensed under a dual BSD and GPL v2 license.
14*f0865ec9SKyle Evans# *  See LICENSE file at the root folder of the project.
15*f0865ec9SKyle Evans# */
16*f0865ec9SKyle Evans#!/bin/sh
17*f0865ec9SKyle Evans
18*f0865ec9SKyle Evans# Check if a file $1 exists. Copy it in $2 if
19*f0865ec9SKyle Evans# it exists, or else log and error in $3.
20*f0865ec9SKyle Evanscheck_and_copy(){
21*f0865ec9SKyle Evans	if [ -e $1 ]
22*f0865ec9SKyle Evans	then
23*f0865ec9SKyle Evans		cp $1 $2
24*f0865ec9SKyle Evans	else
25*f0865ec9SKyle Evans		echo "$2 did not compile ..." >> $3
26*f0865ec9SKyle Evans	fi
27*f0865ec9SKyle Evans}
28*f0865ec9SKyle Evans
29*f0865ec9SKyle Evanscopy_compiled_examples(){
30*f0865ec9SKyle Evans	ROOT_DIR=$1
31*f0865ec9SKyle Evans	CROSSBUILD_OUTPUT=$2
32*f0865ec9SKyle Evans	triplet=$3
33*f0865ec9SKyle Evans	wordsize=$4
34*f0865ec9SKyle Evans	ERROR_LOG_FILE=$5
35*f0865ec9SKyle Evans	suffix=$6
36*f0865ec9SKyle Evans	# Basic
37*f0865ec9SKyle Evans	check_and_copy $ROOT_DIR/src/examples/basic/nn_pollard_rho $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/nn_pollard_rho_"$triplet"_word"$wordsize""$suffix" $ERROR_LOG_FILE
38*f0865ec9SKyle Evans	check_and_copy $ROOT_DIR/src/examples/basic/fp_square_residue $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/fp_square_residue_"$triplet"_word"$wordsize""$suffix" $ERROR_LOG_FILE
39*f0865ec9SKyle Evans	check_and_copy $ROOT_DIR/src/examples/basic/curve_basic_examples $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/curve_basic_examples_"$triplet"_word"$wordsize""$suffix" $ERROR_LOG_FILE
40*f0865ec9SKyle Evans	check_and_copy $ROOT_DIR/src/examples/basic/curve_ecdh $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/curve_ecdh_"$triplet"_word"$wordsize""$suffix" $ERROR_LOG_FILE
41*f0865ec9SKyle Evans	# Hash
42*f0865ec9SKyle Evans	check_and_copy $ROOT_DIR/src/examples/"hash"/"hash" $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/hash_"$triplet"_word"$wordsize""$suffix" $ERROR_LOG_FILE
43*f0865ec9SKyle Evans	# SSS
44*f0865ec9SKyle Evans	check_and_copy $ROOT_DIR/src/examples/sss/sss $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/sss_"$triplet"_word"$wordsize""$suffix" $ERROR_LOG_FILE
45*f0865ec9SKyle Evans	# Signatures
46*f0865ec9SKyle Evans	check_and_copy $ROOT_DIR/src/examples/sig/rsa/rsa $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/rsa_"$triplet"_word"$wordsize""$suffix" $ERROR_LOG_FILE
47*f0865ec9SKyle Evans	check_and_copy $ROOT_DIR/src/examples/sig/dsa/dsa $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/dsa_"$triplet"_word"$wordsize""$suffix" $ERROR_LOG_FILE
48*f0865ec9SKyle Evans	check_and_copy $ROOT_DIR/src/examples/sig/sdsa/sdsa $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/sdsa_"$triplet"_word"$wordsize""$suffix" $ERROR_LOG_FILE
49*f0865ec9SKyle Evans	check_and_copy $ROOT_DIR/src/examples/sig/kcdsa/kcdsa $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/kcdsa_"$triplet"_word"$wordsize""$suffix" $ERROR_LOG_FILE
50*f0865ec9SKyle Evans	check_and_copy $ROOT_DIR/src/examples/sig/gostr34_10_94/gostr34_10_94 $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/gostr34_10_94_"$triplet"_word"$wordsize""$suffix" $ERROR_LOG_FILE
51*f0865ec9SKyle Evans}
52*f0865ec9SKyle Evans
53*f0865ec9SKyle Evanscheck_triplet_wordsize(){
54*f0865ec9SKyle Evans	triplet=$1
55*f0865ec9SKyle Evans	wordsize=$2
56*f0865ec9SKyle Evans	# Create a temporary workspace and copy the files to compile
57*f0865ec9SKyle Evans	ROOT_DIR=$CROSSBUILD_OUTPUT/tmp/ecc_root_"$triplet"_"$wordsize"
58*f0865ec9SKyle Evans	mkdir -p $ROOT_DIR
59*f0865ec9SKyle Evans	# Copy necessary source files from the root project
60*f0865ec9SKyle Evans	cp -r $SRC_DIR/src/ $ROOT_DIR/
61*f0865ec9SKyle Evans	cp -r $SRC_DIR/include/ $ROOT_DIR/
62*f0865ec9SKyle Evans	cp $SRC_DIR/common.mk $ROOT_DIR/
63*f0865ec9SKyle Evans	cp $SRC_DIR/Makefile $ROOT_DIR/
64*f0865ec9SKyle Evans	mkdir -p $ROOT_DIR/build
65*f0865ec9SKyle Evans	mkdir -p $CROSSBUILD_OUTPUT/compilation_log
66*f0865ec9SKyle Evans	mkdir -p $CROSSBUILD_OUTPUT/error_log
67*f0865ec9SKyle Evans	COMPILATION_LOG_FILE=$CROSSBUILD_OUTPUT/compilation_log/compilation_log_"$triplet"_"$wordsize"
68*f0865ec9SKyle Evans	ERROR_LOG_FILE=$CROSSBUILD_OUTPUT/error_log/error_log_"$triplet"_"$wordsize"
69*f0865ec9SKyle Evans	# NOTE: for 64 bit triplets, multiarch/crossbuild docker's gcc 4.9 has a bug handling loop unrolling in -O3 and
70*f0865ec9SKyle Evans	# is mistaken in detecting arrays overflows at compilation time
71*f0865ec9SKyle Evans	# See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64277
72*f0865ec9SKyle Evans	# Also, add the "-Wno-pedantic-ms-format" for specific quikrs of mingw with "%lld" (...)
73*f0865ec9SKyle Evans	if [ "$triplet" = "x86_64-w64-mingw32" ] || [ "$triplet" = "aarch64-linux-gnu" ]; then
74*f0865ec9SKyle Evans		extra_lib_cflags="-O2"
75*f0865ec9SKyle Evans		extra_bin_cflags=""
76*f0865ec9SKyle Evans		if [ "$triplet" = "x86_64-w64-mingw32" ] && [ "$wordsize" = "64" ]; then
77*f0865ec9SKyle Evans			extra_lib_cflags=$extra_lib_cflags" -Wno-pedantic-ms-format"
78*f0865ec9SKyle Evans		fi
79*f0865ec9SKyle Evans	# There is also a misbehavior for mingw improperly finding unintialized variables
80*f0865ec9SKyle Evans	# Also, add the "-Wno-pedantic-ms-format" for specific quikrs of mingw with "%lld" (...)
81*f0865ec9SKyle Evans	elif [ "$triplet" = "i686-w64-mingw32" ]; then
82*f0865ec9SKyle Evans		extra_lib_cflags="-Wno-maybe-uninitialized"
83*f0865ec9SKyle Evans		extra_bin_cflags=""
84*f0865ec9SKyle Evans		if [ "$wordsize" = "64" ]; then
85*f0865ec9SKyle Evans			extra_lib_cflags=$extra_lib_cflags" -Wno-pedantic-ms-format"
86*f0865ec9SKyle Evans		fi
87*f0865ec9SKyle Evans        # NOTE: on darwin based clang, some of our options are too recent for the installed
88*f0865ec9SKyle Evans        # llvm ... Hence we remove warnings as errors here
89*f0865ec9SKyle Evans	elif [ "$triplet" = "i386-apple-darwin" ] || [ "$triplet" = "x86_64-apple-darwin" ] || [ "$triplet" = "x86_64h-apple-darwin" ]; then
90*f0865ec9SKyle Evans		extra_lib_cflags="-Wno-error"
91*f0865ec9SKyle Evans		extra_bin_cflags="-Wno-error"
92*f0865ec9SKyle Evans        else
93*f0865ec9SKyle Evans		extra_lib_cflags=""
94*f0865ec9SKyle Evans		extra_bin_cflags=""
95*f0865ec9SKyle Evans	fi
96*f0865ec9SKyle Evans	############## Release compilation
97*f0865ec9SKyle Evans	echo "======== COMPILING RELEASE FOR $triplet / $wordsize" 2>&1 | tee -a $COMPILATION_LOG_FILE
98*f0865ec9SKyle Evans	# Library, self tests and utils
99*f0865ec9SKyle Evans	docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR -w $ROOT_DIR -e EXTRA_LIB_CFLAGS="$extra_lib_cflags" -e EXTRA_BIN_CFLAGS="$extra_bin_cflags" multiarch/crossbuild make "$wordsize" 2>&1 | tee -a $COMPILATION_LOG_FILE
100*f0865ec9SKyle Evans	mkdir -p $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"
101*f0865ec9SKyle Evans	check_and_copy $ROOT_DIR/build/ec_self_tests $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/ec_self_tests_"$triplet"_word"$wordsize" $ERROR_LOG_FILE
102*f0865ec9SKyle Evans	check_and_copy $ROOT_DIR/build/ec_utils $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/ec_utils_"$triplet"_word"$wordsize" $ERROR_LOG_FILE
103*f0865ec9SKyle Evans	# Examples
104*f0865ec9SKyle Evans	docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR/ -w $ROOT_DIR/src/examples -e EXTRA_LIB_CFLAGS="$extra_lib_cflags" -e EXTRA_BIN_CFLAGS="$extra_bin_cflags" multiarch/crossbuild make "$wordsize" 2>&1 | tee -a $COMPILATION_LOG_FILE
105*f0865ec9SKyle Evans	copy_compiled_examples "$ROOT_DIR" "$CROSSBUILD_OUTPUT" "$triplet" "$wordsize" "$ERROR_LOG_FILE" ""
106*f0865ec9SKyle Evans	# Clean
107*f0865ec9SKyle Evans	docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR -w $ROOT_DIR multiarch/crossbuild make clean
108*f0865ec9SKyle Evans	docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR/src/examples -w $ROOT_DIR/src/examples multiarch/crossbuild make clean
109*f0865ec9SKyle Evans	############## Debug compilation
110*f0865ec9SKyle Evans	echo "======== COMPILING DEBUG FOR $triplet / $wordsize" 2>&1 | tee -a $COMPILATION_LOG_FILE
111*f0865ec9SKyle Evans	############## Release compilation
112*f0865ec9SKyle Evans	# Library, self tests and utils
113*f0865ec9SKyle Evans	docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR -w $ROOT_DIR -e EXTRA_LIB_CFLAGS="$extra_lib_cflags" -e EXTRA_BIN_CFLAGS="$extra_bin_cflags" multiarch/crossbuild make debug"$wordsize" 2>&1 | tee -a $COMPILATION_LOG_FILE
114*f0865ec9SKyle Evans	mkdir -p $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"
115*f0865ec9SKyle Evans	check_and_copy $ROOT_DIR/build/ec_self_tests $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/ec_self_tests_"$triplet"_word"$wordsize"_debug $ERROR_LOG_FILE
116*f0865ec9SKyle Evans	check_and_copy $ROOT_DIR/build/ec_utils $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/ec_utils_"$triplet"_word"$wordsize"_debug $ERROR_LOG_FILE
117*f0865ec9SKyle Evans	# Examples
118*f0865ec9SKyle Evans	docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR/ -w $ROOT_DIR/src/examples -e EXTRA_LIB_CFLAGS="$extra_lib_cflags" -e EXTRA_BIN_CFLAGS="$extra_bin_cflags" multiarch/crossbuild make debug"$wordsize" 2>&1 | tee -a $COMPILATION_LOG_FILE
119*f0865ec9SKyle Evans	copy_compiled_examples "$ROOT_DIR" "$CROSSBUILD_OUTPUT" "$triplet" "$wordsize" "$ERROR_LOG_FILE" "_debug"
120*f0865ec9SKyle Evans	# Clean
121*f0865ec9SKyle Evans	docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR -w $ROOT_DIR multiarch/crossbuild make clean
122*f0865ec9SKyle Evans	docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR/src/examples -w $ROOT_DIR/src/examples multiarch/crossbuild make clean
123*f0865ec9SKyle Evans	echo "===========================================" 2>&1 | tee -a $COMPILATION_LOG_FILE
124*f0865ec9SKyle Evans	# Compile static binaries for everyone except Mac OS (gcc on it does not support -static)
125*f0865ec9SKyle Evans	if [ "$triplet" != "i386-apple-darwin" ] && [ "$triplet" != "x86_64-apple-darwin" ] && [ "$triplet" != "x86_64h-apple-darwin" ]; then
126*f0865ec9SKyle Evans		############## Release compilation with static binaries (for emulation)
127*f0865ec9SKyle Evans		echo "======== COMPILING STATIC RELEASE FOR $triplet / $wordsize" 2>&1 | tee -a $COMPILATION_LOG_FILE
128*f0865ec9SKyle Evans		# Library, self tests and utils
129*f0865ec9SKyle Evans		docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR -w $ROOT_DIR -e EXTRA_LIB_CFLAGS="$extra_lib_cflags" -e EXTRA_BIN_CFLAGS="$extra_bin_cflags" -e BIN_LDFLAGS="-static" multiarch/crossbuild make "$wordsize" 2>&1 | tee -a $COMPILATION_LOG_FILE
130*f0865ec9SKyle Evans		mkdir -p $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"
131*f0865ec9SKyle Evans		check_and_copy $ROOT_DIR/build/ec_self_tests $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/ec_self_tests_"$triplet"_word"$wordsize"_static $ERROR_LOG_FILE
132*f0865ec9SKyle Evans		check_and_copy $ROOT_DIR/build/ec_utils $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/ec_utils_"$triplet"_word"$wordsize"_static $ERROR_LOG_FILE
133*f0865ec9SKyle Evans		# Examples
134*f0865ec9SKyle Evans		docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR/ -w $ROOT_DIR/src/examples -e EXTRA_LIB_CFLAGS="$extra_lib_cflags" -e EXTRA_BIN_CFLAGS="$extra_bin_cflags" -e BIN_LDFLAGS="-static" multiarch/crossbuild make "$wordsize" 2>&1 | tee -a $COMPILATION_LOG_FILE
135*f0865ec9SKyle Evans		copy_compiled_examples "$ROOT_DIR" "$CROSSBUILD_OUTPUT" "$triplet" "$wordsize" "$ERROR_LOG_FILE" "_static"
136*f0865ec9SKyle Evans		# Clean
137*f0865ec9SKyle Evans		docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR -w $ROOT_DIR multiarch/crossbuild make clean
138*f0865ec9SKyle Evans		docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR/src/examples -w $ROOT_DIR/src/examples multiarch/crossbuild make clean
139*f0865ec9SKyle Evans		##### 4096 bits case for 64 bit word size only
140*f0865ec9SKyle Evans		###############################################
141*f0865ec9SKyle Evans		if [ "$wordsize" = "64" ]; then
142*f0865ec9SKyle Evans			docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR -w $ROOT_DIR multiarch/crossbuild make clean
143*f0865ec9SKyle Evans			docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR/src/examples -w $ROOT_DIR/src/examples multiarch/crossbuild make clean
144*f0865ec9SKyle Evans			# Self tests and utils
145*f0865ec9SKyle Evans			docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR -w $ROOT_DIR -e EXTRA_LIB_CFLAGS="$extra_lib_cflags -DUSER_NN_BIT_LEN=4096" -e EXTRA_BIN_CFLAGS="$extra_bin_cflags -DUSER_NN_BIT_LEN=4096" -e BIN_LDFLAGS="-static" multiarch/crossbuild make "$wordsize" 2>&1 | tee -a $COMPILATION_LOG_FILE
146*f0865ec9SKyle Evans			mkdir -p $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"
147*f0865ec9SKyle Evans			check_and_copy $ROOT_DIR/build/ec_self_tests $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/ec_self_tests_"$triplet"_word"$wordsize"_static_4096 $ERROR_LOG_FILE
148*f0865ec9SKyle Evans			check_and_copy $ROOT_DIR/build/ec_utils $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/ec_utils_"$triplet"_word"$wordsize"_static_4096 $ERROR_LOG_FILE
149*f0865ec9SKyle Evans			# Examples
150*f0865ec9SKyle Evans			docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR/ -w $ROOT_DIR/src/examples -e EXTRA_LIB_CFLAGS="$extra_lib_cflags -DUSER_NN_BIT_LEN=4096" -e EXTRA_BIN_CFLAGS="$extra_bin_cflags -DUSER_NN_BIT_LEN=4096" -e BIN_LDFLAGS="-static" multiarch/crossbuild make "$wordsize" 2>&1 | tee -a $COMPILATION_LOG_FILE
151*f0865ec9SKyle Evans			copy_compiled_examples "$ROOT_DIR" "$CROSSBUILD_OUTPUT" "$triplet" "$wordsize" "$ERROR_LOG_FILE" "_static_4096"
152*f0865ec9SKyle Evans			# Clean
153*f0865ec9SKyle Evans			docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR -w $ROOT_DIR multiarch/crossbuild make clean
154*f0865ec9SKyle Evans			docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR/src/examples -w $ROOT_DIR/src/examples multiarch/crossbuild make clean
155*f0865ec9SKyle Evans		fi
156*f0865ec9SKyle Evans		############## Debug compilation with static binaries (for emulation)
157*f0865ec9SKyle Evans		echo "======== COMPILING STATIC DEBUG FOR $triplet / $wordsize" 2>&1 | tee -a $COMPILATION_LOG_FILE
158*f0865ec9SKyle Evans		############## Release compilation with static binaries (for emulation)
159*f0865ec9SKyle Evans		# Self tests and utils
160*f0865ec9SKyle Evans		docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR -w $ROOT_DIR -e EXTRA_LIB_CFLAGS="$extra_lib_cflags" -e EXTRA_BIN_CFLAGS="$extra_bin_cflags" -e BIN_LDFLAGS="-static" multiarch/crossbuild make debug"$wordsize" 2>&1 | tee -a $COMPILATION_LOG_FILE
161*f0865ec9SKyle Evans		mkdir -p $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"
162*f0865ec9SKyle Evans		check_and_copy $ROOT_DIR/build/ec_self_tests $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/ec_self_tests_"$triplet"_word"$wordsize"_debug_static $ERROR_LOG_FILE
163*f0865ec9SKyle Evans		check_and_copy $ROOT_DIR/build/ec_utils $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/ec_utils_"$triplet"_word"$wordsize"_debug_static $ERROR_LOG_FILE
164*f0865ec9SKyle Evans		# Examples
165*f0865ec9SKyle Evans		docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR/ -w $ROOT_DIR/src/examples -e EXTRA_LIB_CFLAGS="$extra_lib_cflags" -e EXTRA_BIN_CFLAGS="$extra_bin_cflags" -e BIN_LDFLAGS="-static" multiarch/crossbuild make debug"$wordsize" 2>&1 | tee -a $COMPILATION_LOG_FILE
166*f0865ec9SKyle Evans		copy_compiled_examples "$ROOT_DIR" "$CROSSBUILD_OUTPUT" "$triplet" "$wordsize" "$ERROR_LOG_FILE" "_debug_static"
167*f0865ec9SKyle Evans		# Clean
168*f0865ec9SKyle Evans		docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR -w $ROOT_DIR multiarch/crossbuild make clean
169*f0865ec9SKyle Evans		docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR/src/examples -w $ROOT_DIR/src/examples multiarch/crossbuild make clean
170*f0865ec9SKyle Evans		##### 4096 bits case for 64 bit word size only
171*f0865ec9SKyle Evans		###############################################
172*f0865ec9SKyle Evans		if [ "$wordsize" = "64" ]; then
173*f0865ec9SKyle Evans			docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR -w $ROOT_DIR multiarch/crossbuild make clean
174*f0865ec9SKyle Evans			docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR/src/examples -w $ROOT_DIR/src/examples multiarch/crossbuild make clean
175*f0865ec9SKyle Evans			# Self tests and utils
176*f0865ec9SKyle Evans			docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR -w $ROOT_DIR -e EXTRA_LIB_CFLAGS="$extra_lib_cflags -DUSER_NN_BIT_LEN=4096" -e EXTRA_BIN_CFLAGS="$extra_bin_cflags -DUSER_NN_BIT_LEN=4096" -e BIN_LDFLAGS="-static" multiarch/crossbuild make debug"$wordsize" 2>&1 | tee -a $COMPILATION_LOG_FILE
177*f0865ec9SKyle Evans			mkdir -p $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"
178*f0865ec9SKyle Evans			check_and_copy $ROOT_DIR/build/ec_self_tests $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/ec_self_tests_"$triplet"_word"$wordsize"_debug_static_4096 $ERROR_LOG_FILE
179*f0865ec9SKyle Evans			check_and_copy $ROOT_DIR/build/ec_utils $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/ec_utils_"$triplet"_word"$wordsize"_debug_static_4096 $ERROR_LOG_FILE
180*f0865ec9SKyle Evans			# Examples
181*f0865ec9SKyle Evans			docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR/ -w $ROOT_DIR/src/examples -e EXTRA_LIB_CFLAGS="$extra_lib_cflags -DUSER_NN_BIT_LEN=4096" -e EXTRA_BIN_CFLAGS="$extra_bin_cflags -DUSER_NN_BIT_LEN=4096" -e BIN_LDFLAGS="-static" multiarch/crossbuild make debug"$wordsize" 2>&1 | tee -a $COMPILATION_LOG_FILE
182*f0865ec9SKyle Evans			copy_compiled_examples "$ROOT_DIR" "$CROSSBUILD_OUTPUT" "$triplet" "$wordsize" "$ERROR_LOG_FILE" "_debug_static_4096"
183*f0865ec9SKyle Evans			# Clean
184*f0865ec9SKyle Evans			docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR -w $ROOT_DIR multiarch/crossbuild make clean
185*f0865ec9SKyle Evans			docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR/src/examples -w $ROOT_DIR/src/examples multiarch/crossbuild make clean
186*f0865ec9SKyle Evans		fi
187*f0865ec9SKyle Evans		echo "===========================================" 2>&1 | tee -a $COMPILATION_LOG_FILE
188*f0865ec9SKyle Evans	fi
189*f0865ec9SKyle Evans	# Cleanup compilation stuff
190*f0865ec9SKyle Evans	rm -rf $ROOT_DIR
191*f0865ec9SKyle Evans}
192*f0865ec9SKyle Evans
193*f0865ec9SKyle Evans
194*f0865ec9SKyle Evansprint_help(){
195*f0865ec9SKyle Evans	echo "$0 uses the docker multiarch/crossbuild image to compile libecc on multiple platforms"
196*f0865ec9SKyle Evans	echo "with multiple word sizes (16, 32 and 64). The compilation logs and errors as well as"
197*f0865ec9SKyle Evans	echo "the produced binaries are kept int the 'crossbuild_out' folder."
198*f0865ec9SKyle Evans	echo "Supported platform triplets are:"
199*f0865ec9SKyle Evans	echo "arm-linux-gnueabi / arm-linux-gnueabihf / powerpc64le-linux-gnu / aarch64-linux-gnu /"
200*f0865ec9SKyle Evans	echo "mipsel-linux-gnu / i386-apple-darwin / x86_64-apple-darwin / i686-w64-mingw32 / x86_64-w64-mingw32."
201*f0865ec9SKyle Evans	echo ""
202*f0865ec9SKyle Evans	echo "$0 with no argument will test the compilation for all the triplets and the word sizes."
203*f0865ec9SKyle Evans	echo "  -h: print this help"
204*f0865ec9SKyle Evans	echo "  -triplet: execute the crossbuild only for a given triplet:"
205*f0865ec9SKyle Evans	echo "      $ sh $0 -triplet arm-linux-gnueabi"
206*f0865ec9SKyle Evans	echo "      => This will execute cross-compilation for arm-linux-gnueabi for all the word sizes."
207*f0865ec9SKyle Evans	echo "      $ sh $0 -triplet arm-linux-gnueabi 64"
208*f0865ec9SKyle Evans	echo "      => This will execute cross-compilation for arm-linux-gnueabi only for 64-bit word size."
209*f0865ec9SKyle Evans	echo "  -cpu: will specify the number of tasks used for parallel compilation. The default behaviour is to"
210*f0865ec9SKyle Evans	echo "        use the maximum available CPUs on the machine, but one can reduce th enumber of parallel"
211*f0865ec9SKyle Evans	echo "        tasks with this toggle. Warning: this toggle is not compatible with the -triplet toggle."
212*f0865ec9SKyle Evans}
213*f0865ec9SKyle Evans
214*f0865ec9SKyle Evans
215*f0865ec9SKyle Evans######### Script main
216*f0865ec9SKyle Evans
217*f0865ec9SKyle Evans# Adapt our sources directory depending on the calling
218*f0865ec9SKyle Evans# directory
219*f0865ec9SKyle EvansSRC_DIR=`dirname "$(readlink -f "$0")"`/..
220*f0865ec9SKyle EvansCROSSBUILD_OUTPUT=$SRC_DIR/scripts/crossbuild_out/
221*f0865ec9SKyle Evans
222*f0865ec9SKyle Evans# Check for the docker command line
223*f0865ec9SKyle EvansCHECK_DOCKER=$(docker -v)
224*f0865ec9SKyle Evansif [ $? -ne 0 ]; then
225*f0865ec9SKyle Evans	echo "docker is not installed ... Please install it!"
226*f0865ec9SKyle Evans	exit
227*f0865ec9SKyle Evansfi
228*f0865ec9SKyle Evans
229*f0865ec9SKyle Evans# Check for docker image multiarch/crossbuild
230*f0865ec9SKyle Evansif [ -z $(docker images -q multiarch/crossbuild) ]
231*f0865ec9SKyle Evansthen
232*f0865ec9SKyle Evans	echo "Please install the multiarch/crossbuild docker image:"
233*f0865ec9SKyle Evans	echo "$ docker pull multiarch/crossbuild"
234*f0865ec9SKyle Evans	exit
235*f0865ec9SKyle Evansfi
236*f0865ec9SKyle Evans
237*f0865ec9SKyle Evans# Print help if asked
238*f0865ec9SKyle Evansif [ "$1" = "-h" ]
239*f0865ec9SKyle Evansthen
240*f0865ec9SKyle Evans	print_help $0
241*f0865ec9SKyle Evans	exit
242*f0865ec9SKyle Evansfi
243*f0865ec9SKyle Evans
244*f0865ec9SKyle Evans# If we have arguments, just execute subcommand
245*f0865ec9SKyle Evansif [ "$1" = "-triplet" ]
246*f0865ec9SKyle Evansthen
247*f0865ec9SKyle Evans	# Clean stuff if this is an explicit call from command line
248*f0865ec9SKyle Evans	if ! [ "$4" = "-automate" ]
249*f0865ec9SKyle Evans	then
250*f0865ec9SKyle Evans		echo "Cleaning before running ..."
251*f0865ec9SKyle Evans		rm -rf $CROSSBUILD_OUTPUT/*
252*f0865ec9SKyle Evans		docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -v $SRC_DIR:/ecc -w /ecc multiarch/crossbuild make clean
253*f0865ec9SKyle Evans		docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -v $SRC_DIR:/ecc -w /ecc/src/examples multiarch/crossbuild make clean
254*f0865ec9SKyle Evans		docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -v $SRC_DIR:/ecc -w /ecc/src/arithmetic_tests multiarch/crossbuild make clean
255*f0865ec9SKyle Evans	fi
256*f0865ec9SKyle Evans	# If no specific word size has been given, do all the sizes
257*f0865ec9SKyle Evans	if [ "$3" = "" ]
258*f0865ec9SKyle Evans	then
259*f0865ec9SKyle Evans		for wordsize in 16 32 64;
260*f0865ec9SKyle Evans		do
261*f0865ec9SKyle Evans			check_triplet_wordsize $2 $wordsize
262*f0865ec9SKyle Evans		done
263*f0865ec9SKyle Evans	else
264*f0865ec9SKyle Evans		check_triplet_wordsize $2 $3
265*f0865ec9SKyle Evans	fi
266*f0865ec9SKyle Evans	exit
267*f0865ec9SKyle Evansfi
268*f0865ec9SKyle Evans
269*f0865ec9SKyle Evans# Clean
270*f0865ec9SKyle Evansecho "Cleaning before running ..."
271*f0865ec9SKyle Evansrm -rf $CROSSBUILD_OUTPUT/*
272*f0865ec9SKyle Evansdocker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -v $SRC_DIR:/ecc -w /ecc multiarch/crossbuild make clean
273*f0865ec9SKyle Evansdocker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -v $SRC_DIR:/ecc -w /ecc/src/examples multiarch/crossbuild make clean
274*f0865ec9SKyle Evansdocker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -v $SRC_DIR:/ecc -w /ecc/src/arithmetic_tests multiarch/crossbuild make clean
275*f0865ec9SKyle Evans
276*f0865ec9SKyle EvansALL_CHECKS=""
277*f0865ec9SKyle Evansfor wordsize in 16 32 64;
278*f0865ec9SKyle Evansdo
279*f0865ec9SKyle Evans	for triplet in arm-linux-gnueabi arm-linux-gnueabihf powerpc64le-linux-gnu aarch64-linux-gnu mipsel-linux-gnu i386-apple-darwin x86_64-apple-darwin x86_64h-apple-darwin i686-w64-mingw32 x86_64-w64-mingw32;
280*f0865ec9SKyle Evans	do
281*f0865ec9SKyle Evans		ALL_CHECKS="$ALL_CHECKS\n-triplet $triplet $wordsize -automate"
282*f0865ec9SKyle Evans	done
283*f0865ec9SKyle Evansdone
284*f0865ec9SKyle Evans
285*f0865ec9SKyle Evansif [ "$1" = "-cpu" ]
286*f0865ec9SKyle Evansthen
287*f0865ec9SKyle Evans	if [ "$3" = "-triplet" ]
288*f0865ec9SKyle Evans	then
289*f0865ec9SKyle Evans		echo "-cpu and -triplet are not compatible ..."
290*f0865ec9SKyle Evans		exit
291*f0865ec9SKyle Evans	else
292*f0865ec9SKyle Evans		# User defined number of CPUs
293*f0865ec9SKyle Evans		NCPU=$2
294*f0865ec9SKyle Evans	fi
295*f0865ec9SKyle Evanselse
296*f0865ec9SKyle Evans	# Get number of CPUs for parallel processing
297*f0865ec9SKyle Evans	NCPU=`getconf _NPROCESSORS_ONLN`
298*f0865ec9SKyle Evansfi
299*f0865ec9SKyle Evansecho "Parallelizing on $NCPU processors"
300*f0865ec9SKyle Evans# Unleash the kraken
301*f0865ec9SKyle Evansecho $ALL_CHECKS | xargs -n 4 -P $NCPU sh `readlink -f "$0"`
302*f0865ec9SKyle Evans
303*f0865ec9SKyle Evans# Check if we had an error, and if yes exit with error
304*f0865ec9SKyle Evansfor wordsize in 16 32 64;
305*f0865ec9SKyle Evansdo
306*f0865ec9SKyle Evans	for triplet in arm-linux-gnueabi arm-linux-gnueabihf powerpc64le-linux-gnu aarch64-linux-gnu mipsel-linux-gnu i386-apple-darwin x86_64-apple-darwin x86_64h-apple-darwin i686-w64-mingw32 x86_64-w64-mingw32;
307*f0865ec9SKyle Evans	do
308*f0865ec9SKyle Evans		ERROR_LOG_FILE=$CROSSBUILD_OUTPUT/error_log/error_log_"$triplet"_"$wordsize"
309*f0865ec9SKyle Evans		if [ -f "$ERROR_LOG_FILE" ]; then
310*f0865ec9SKyle Evans			echo "!!!!!!! There have been compilation errors for $triplet $wordsize ..."
311*f0865ec9SKyle Evans			exit 255
312*f0865ec9SKyle Evans		fi
313*f0865ec9SKyle Evans	done
314*f0865ec9SKyle Evansdone
315*f0865ec9SKyle Evansecho "All compilations went OK!"
316