Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(60)

Side by Side Diff: openssl/import_openssl.sh

Issue 2072073002: Delete bundled copy of OpenSSL and replace with README. (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/openssl@master
Patch Set: Delete bundled copy of OpenSSL and replace with README. Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « openssl/e_os2.h ('k') | openssl/openssl.config » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 #!/bin/bash
2 #
3 # Copyright (C) 2009 The Android Open Source Project
4 #
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
8 #
9 # http://www.apache.org/licenses/LICENSE-2.0
10 #
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
16 #
17
18 #
19 # This script imports new versions of OpenSSL (http://openssl.org/source) into t he
20 # Android source tree. To run, (1) fetch the appropriate tarball from the OpenS SL repository,
21 # (2) check the gpg/pgp signature, and then (3) run:
22 # ./import_openssl.sh import openssl-*.tar.gz
23 #
24 # IMPORTANT: See README.android for additional details.
25
26 # turn on exit on error as well as a warning when it happens
27 set -e
28 trap "echo WARNING: Exiting on non-zero subprocess exit code" ERR;
29
30 # Ensure consistent sorting order / tool output.
31 export LANG=C
32 export LC_ALL=C
33
34 function die() {
35 declare -r message=$1
36
37 echo $message
38 exit 1
39 }
40
41 function usage() {
42 declare -r message=$1
43
44 if [ ! "$message" = "" ]; then
45 echo $message
46 fi
47 echo "Usage:"
48 echo " ./import_openssl.sh import </path/to/openssl-*.tar.gz>"
49 echo " ./import_openssl.sh regenerate <patch/*.patch>"
50 echo " ./import_openssl.sh generate <patch/*.patch> </path/to/openssl-*.tar.g z>"
51 exit 1
52 }
53
54 function main() {
55 if [ ! -d patches ]; then
56 die "OpenSSL patch directory patches/ not found"
57 fi
58
59 if [ ! -f openssl.version ]; then
60 die "openssl.version not found"
61 fi
62
63 source openssl.version
64 if [ "$OPENSSL_VERSION" == "" ]; then
65 die "Invalid openssl.version; see README.android for more information"
66 fi
67
68 OPENSSL_DIR=openssl-$OPENSSL_VERSION
69 OPENSSL_DIR_ORIG=$OPENSSL_DIR.orig
70
71 if [ ! -f openssl.config ]; then
72 die "openssl.config not found"
73 fi
74
75 source openssl.config
76 if [ "$CONFIGURE_ARGS" == "" -o "$UNNEEDED_SOURCES" == "" -o "$NEEDED_SOURCES" == "" ]; then
77 die "Invalid openssl.config; see README.android for more information"
78 fi
79
80 declare -r command=$1
81 shift || usage "No command specified. Try import, regenerate, or generate."
82 if [ "$command" = "import" ]; then
83 declare -r tar=$1
84 shift || usage "No tar file specified."
85 import $tar
86 elif [ "$command" = "regenerate" ]; then
87 declare -r patch=$1
88 shift || usage "No patch file specified."
89 [ -d $OPENSSL_DIR ] || usage "$OPENSSL_DIR not found, did you mean to use ge nerate?"
90 [ -d $OPENSSL_DIR_ORIG_ORIG ] || usage "$OPENSSL_DIR_ORIG not found, did you mean to use generate?"
91 regenerate $patch
92 elif [ "$command" = "generate" ]; then
93 declare -r patch=$1
94 shift || usage "No patch file specified."
95 declare -r tar=$1
96 shift || usage "No tar file specified."
97 generate $patch $tar
98 else
99 usage "Unknown command specified $command. Try import, regenerate, or genera te."
100 fi
101 }
102
103 # Compute the name of an assembly source file generated by one of the
104 # gen_asm_xxxx() functions below. The logic is the following:
105 # - if "$2" is not empty, output it directly
106 # - otherwise, change the file extension of $1 from .pl to .S and output
107 # it.
108 # Usage: default_asm_file "$1" "$2"
109 # or default_asm_file "$@"
110 #
111 # $1: generator path (perl script)
112 # $2: optional output file name.
113 function default_asm_file () {
114 if [ "$2" ]; then
115 echo "$2"
116 else
117 echo "${1%%.pl}.S"
118 fi
119 }
120
121 function default_asm_mac_ia32_file () {
122 if [ "$2" ]; then
123 echo "$2"
124 else
125 echo "${1%%.pl}-mac.S"
126 fi
127 }
128 # Generate an ARM assembly file.
129 # $1: generator (perl script)
130 # $2: [optional] output file name
131 function gen_asm_arm () {
132 local OUT
133 OUT=$(default_asm_file "$@")
134 perl "$1" > "$OUT"
135 }
136
137 function gen_asm_mips () {
138 local OUT
139 OUT=$(default_asm_file "$@")
140 # The perl scripts expect to run the target compiler as $CC to determine
141 # the endianess of the target. Setting CC to true is a hack that forces the sc ripts
142 # to generate little endian output
143 CC=true perl "$1" o32 > "$OUT"
144 }
145
146 function gen_asm_x86 () {
147 local OUT
148 OUT=$(default_asm_file "$@")
149 perl "$1" elf -fPIC > "$OUT"
150 }
151
152 function gen_asm_x86_64 () {
153 local OUT
154 OUT=$(default_asm_file "$@")
155 perl "$1" elf "$OUT" > "$OUT"
156 }
157
158 function gen_asm_mac_ia32 () {
159 local OUT
160 OUT=$(default_asm_mac_ia32_file "$@")
161 perl "$1" macosx "$OUT" > "$OUT"
162 }
163
164 # Filter all items in a list that match a given pattern.
165 # $1: space-separated list
166 # $2: egrep pattern.
167 # Out: items in $1 that match $2
168 function filter_by_egrep() {
169 declare -r pattern=$1
170 shift
171 echo "$@" | tr ' ' '\n' | grep -e "$pattern" | tr '\n' ' '
172 }
173
174 # Sort and remove duplicates in a space-separated list
175 # $1: space-separated list
176 # Out: new space-separated list
177 function uniq_sort () {
178 echo "$@" | tr ' ' '\n' | sort -u | tr '\n' ' '
179 }
180
181 function print_autogenerated_header() {
182 echo "# Auto-generated - DO NOT EDIT!"
183 echo "# To regenerate, edit openssl.config, then run:"
184 echo "# ./import_openssl.sh import /path/to/openssl-$OPENSSL_VERSION.tar.g z"
185 echo "#"
186 }
187
188 function generate_build_config_mk() {
189 ./Configure $CONFIGURE_ARGS
190 rm -f apps/CA.pl.bak crypto/opensslconf.h.bak
191
192 declare -r tmpfile=$(mktemp)
193 (grep -e -D Makefile | grep -v CONFIGURE_ARGS= | grep -v OPTIONS= | grep -v -e -DOPENSSL_NO_DEPRECATED) > $tmpfile
194
195 declare -r cflags=$(filter_by_egrep "^-D" $(grep -e "^CFLAG=" $tmpfile))
196 declare -r depflags=$(filter_by_egrep "^-D" $(grep -e "^DEPFLAG=" $tmpfile))
197 rm -f $tmpfile
198
199 echo "Generating $(basename $1)"
200 (
201 print_autogenerated_header
202
203 echo "openssl_cflags := \\"
204 for cflag in $cflags $depflags; do
205 echo " $cflag \\"
206 done
207 echo ""
208 ) > $1
209 }
210
211 # Return the value of a computed variable name.
212 # E.g.:
213 # FOO=foo
214 # BAR=bar
215 # echo $(var_value FOO_$BAR) -> prints the value of ${FOO_bar}
216 # $1: Variable name
217 # Out: variable value
218 var_value() {
219 # Note: don't use 'echo' here, because it's sensitive to values
220 # that begin with an underscore (e.g. "-n")
221 eval printf \"%s\\n\" \$$1
222 }
223
224 # Same as var_value, but returns sorted output without duplicates.
225 # $1: Variable name
226 # Out: variable value (if space-separated list, sorted with no duplicates)
227 var_sorted_value() {
228 uniq_sort $(var_value $1)
229 }
230
231 # Print the definition of a given variable in a GNU Make build file.
232 # $1: Variable name (e.g. common_src_files)
233 # $2+: Variable value (e.g. list of sources)
234 print_vardef_in_mk() {
235 declare -r varname=$1
236 shift
237 if [ -z "$1" ]; then
238 echo "$varname :="
239 else
240 echo "$varname := \\"
241 for src; do
242 echo " $src \\"
243 done
244 fi
245 echo ""
246 }
247
248 # Same as print_vardef_in_mk, but print a CFLAGS definition from
249 # a list of compiler defines.
250 # $1: Variable name (e.g. common_c_flags)
251 # $2: List of defines (e.g. OPENSSL_NO_CAMELLIA ...)
252 print_defines_in_mk() {
253 declare -r varname=$1
254 shift
255 if [ -z "$1" ]; then
256 echo "$varname :="
257 else
258 echo "$varname := \\"
259 for def; do
260 echo " -D$def \\"
261 done
262 fi
263 echo ""
264 }
265
266 # Generate a configuration file like Crypto-config.mk
267 # This uses variable definitions from openssl.config to build a config
268 # file that can compute the list of target- and host-specific sources /
269 # compiler flags for a given component.
270 #
271 # $1: Target file name. (e.g. Crypto-config.mk)
272 # $2: Variable prefix. (e.g. CRYPTO)
273 function generate_config_mk() {
274 declare -r output="$1"
275 declare -r prefix="$2"
276 declare -r all_archs="arm x86 x86_64 mips"
277
278 echo "Generating $(basename $output)"
279 (
280 print_autogenerated_header
281 echo \
282 "# Before including this file, the local Android.mk must define the following
283 # variables:
284 #
285 # local_c_flags
286 # local_c_includes
287 # local_additional_dependencies
288 #
289 # This script will define the following variables:
290 #
291 # target_c_flags
292 # target_c_includes
293 # target_src_files
294 #
295 # host_c_flags
296 # host_c_includes
297 # host_src_files
298 #
299
300 # Ensure these are empty.
301 unknown_arch_c_flags :=
302 unknown_arch_src_files :=
303 unknown_arch_exclude_files :=
304
305 "
306 common_defines=$(var_sorted_value OPENSSL_${prefix}_DEFINES)
307 print_defines_in_mk common_c_flags $common_defines
308
309 common_sources=$(var_sorted_value OPENSSL_${prefix}_SOURCES)
310 print_vardef_in_mk common_src_files $common_sources
311
312 common_includes=$(var_sorted_value OPENSSL_${prefix}_INCLUDES)
313 print_vardef_in_mk common_c_includes $common_includes
314
315 for arch in $all_archs; do
316 arch_defines=$(var_sorted_value OPENSSL_${prefix}_DEFINES_${arch})
317 print_defines_in_mk ${arch}_c_flags $arch_defines
318
319 arch_sources=$(var_sorted_value OPENSSL_${prefix}_SOURCES_${arch})
320 print_vardef_in_mk ${arch}_src_files $arch_sources
321
322 arch_exclude_sources=$(var_sorted_value OPENSSL_${prefix}_SOURCES_EXCLUDES _${arch})
323 print_vardef_in_mk ${arch}_exclude_files $arch_exclude_sources
324
325 done
326
327 echo "\
328 target_arch := \$(TARGET_ARCH)
329 ifeq (\$(target_arch)-\$(TARGET_HAS_BIGENDIAN),mips-true)
330 target_arch := unknown_arch
331 endif
332
333 target_c_flags := \$(common_c_flags) \$(\$(target_arch)_c_flags) \$(local_c_f lags)
334 target_c_includes := \$(addprefix external/openssl/,\$(common_c_includes)) \$(lo cal_c_includes)
335 target_src_files := \$(common_src_files) \$(\$(target_arch)_src_files)
336 target_src_files := \$(filter-out \$(\$(target_arch)_exclude_files), \$(target_ src_files))
337
338 ifeq (\$(HOST_OS)-\$(HOST_ARCH),linux-x86)
339 host_arch := x86
340 else
341 host_arch := unknown_arch
342 endif
343
344 host_c_flags := \$(common_c_flags) \$(\$(host_arch)_c_flags) \$(local_c_flags )
345 host_c_includes := \$(addprefix external/openssl/,\$(common_c_includes)) \$(loca l_c_includes)
346 host_src_files := \$(common_src_files) \$(\$(host_arch)_src_files)
347 host_src_files := \$(filter-out \$(\$(host_arch)_exclude_files), \$(host_src_fi les))
348
349 local_additional_dependencies += \$(LOCAL_PATH)/$(basename $output)
350 "
351
352 ) > "$output"
353 }
354
355 function import() {
356 declare -r OPENSSL_SOURCE=$1
357
358 untar $OPENSSL_SOURCE readonly
359 applypatches $OPENSSL_DIR
360
361 cd $OPENSSL_DIR
362
363 generate_build_config_mk ../build-config.mk
364
365 cp -f LICENSE ../NOTICE
366 touch ../MODULE_LICENSE_BSD_LIKE
367
368 # Avoid checking in symlinks
369 for i in `find include/openssl -type l`; do
370 target=`readlink $i`
371 rm -f $i
372 if [ -f include/openssl/$target ]; then
373 cp include/openssl/$target $i
374 fi
375 done
376
377 # Generate arm asm
378 gen_asm_arm crypto/aes/asm/aes-armv4.pl
379 gen_asm_arm crypto/bn/asm/armv4-gf2m.pl
380 gen_asm_arm crypto/bn/asm/armv4-mont.pl
381 gen_asm_arm crypto/modes/asm/ghash-armv4.pl
382 gen_asm_arm crypto/sha/asm/sha1-armv4-large.pl
383 gen_asm_arm crypto/sha/asm/sha256-armv4.pl
384 gen_asm_arm crypto/sha/asm/sha512-armv4.pl
385
386 # Generate mips asm
387 gen_asm_mips crypto/aes/asm/aes-mips.pl
388 gen_asm_mips crypto/bn/asm/mips.pl crypto/bn/asm/bn-mips.S
389 gen_asm_mips crypto/bn/asm/mips-mont.pl
390 gen_asm_mips crypto/sha/asm/sha1-mips.pl
391 gen_asm_mips crypto/sha/asm/sha512-mips.pl crypto/sha/asm/sha256-mips.S
392
393 # Generate x86 asm
394 gen_asm_x86 crypto/x86cpuid.pl
395 gen_asm_x86 crypto/aes/asm/aes-586.pl
396 gen_asm_x86 crypto/aes/asm/vpaes-x86.pl
397 gen_asm_x86 crypto/aes/asm/aesni-x86.pl
398 gen_asm_x86 crypto/bn/asm/bn-586.pl
399 gen_asm_x86 crypto/bn/asm/co-586.pl
400 gen_asm_x86 crypto/bn/asm/x86-mont.pl
401 gen_asm_x86 crypto/bn/asm/x86-gf2m.pl
402 gen_asm_x86 crypto/modes/asm/ghash-x86.pl
403 gen_asm_x86 crypto/sha/asm/sha1-586.pl
404 gen_asm_x86 crypto/sha/asm/sha256-586.pl
405 gen_asm_x86 crypto/sha/asm/sha512-586.pl
406 gen_asm_x86 crypto/md5/asm/md5-586.pl
407 gen_asm_x86 crypto/des/asm/des-586.pl
408 gen_asm_x86 crypto/des/asm/crypt586.pl
409 gen_asm_x86 crypto/bf/asm/bf-586.pl
410
411 # Generate x86_64 asm
412 gen_asm_x86_64 crypto/x86_64cpuid.pl
413 gen_asm_x86_64 crypto/sha/asm/sha1-x86_64.pl
414 gen_asm_x86_64 crypto/sha/asm/sha512-x86_64.pl crypto/sha/asm/sha256-x86_64.S
415 gen_asm_x86_64 crypto/sha/asm/sha512-x86_64.pl
416 gen_asm_x86_64 crypto/modes/asm/ghash-x86_64.pl
417 gen_asm_x86_64 crypto/aes/asm/aesni-x86_64.pl
418 gen_asm_x86_64 crypto/aes/asm/vpaes-x86_64.pl
419 gen_asm_x86_64 crypto/aes/asm/bsaes-x86_64.pl
420 gen_asm_x86_64 crypto/aes/asm/aes-x86_64.pl
421 gen_asm_x86_64 crypto/aes/asm/aesni-sha1-x86_64.pl
422 gen_asm_x86_64 crypto/md5/asm/md5-x86_64.pl
423 gen_asm_x86_64 crypto/bn/asm/modexp512-x86_64.pl
424 gen_asm_x86_64 crypto/bn/asm/x86_64-mont.pl
425 gen_asm_x86_64 crypto/bn/asm/x86_64-gf2m.pl
426 gen_asm_x86_64 crypto/bn/asm/x86_64-mont5.pl
427 gen_asm_x86_64 crypto/rc4/asm/rc4-x86_64.pl
428 gen_asm_x86_64 crypto/rc4/asm/rc4-md5-x86_64.pl
429
430 # Generate mac_ia32 asm
431 gen_asm_mac_ia32 crypto/x86cpuid.pl
432 gen_asm_mac_ia32 crypto/aes/asm/aes-586.pl
433 gen_asm_mac_ia32 crypto/aes/asm/vpaes-x86.pl
434 gen_asm_mac_ia32 crypto/aes/asm/aesni-x86.pl
435 gen_asm_mac_ia32 crypto/bn/asm/bn-586.pl
436 gen_asm_mac_ia32 crypto/bn/asm/co-586.pl
437 gen_asm_mac_ia32 crypto/bn/asm/x86-mont.pl
438 gen_asm_mac_ia32 crypto/bn/asm/x86-gf2m.pl
439 gen_asm_mac_ia32 crypto/modes/asm/ghash-x86.pl
440 gen_asm_mac_ia32 crypto/sha/asm/sha1-586.pl
441 gen_asm_mac_ia32 crypto/sha/asm/sha256-586.pl
442 gen_asm_mac_ia32 crypto/sha/asm/sha512-586.pl
443 gen_asm_mac_ia32 crypto/md5/asm/md5-586.pl
444 gen_asm_mac_ia32 crypto/des/asm/des-586.pl
445 gen_asm_mac_ia32 crypto/des/asm/crypt586.pl
446 gen_asm_mac_ia32 crypto/bf/asm/bf-586.pl
447
448 # Setup android.testssl directory
449 mkdir android.testssl
450 cat test/testssl | \
451 sed 's#../util/shlib_wrap.sh ./ssltest#adb shell /system/bin/ssltest#' | \
452 sed 's#../util/shlib_wrap.sh ../apps/openssl#adb shell /system/bin/openssl#' | \
453 sed 's#adb shell /system/bin/openssl no-dh#[ `adb shell /system/bin/openssl no-dh` = no-dh ]#' | \
454 sed 's#adb shell /system/bin/openssl no-rsa#[ `adb shell /system/bin/openssl no-rsa` = no-dh ]#' | \
455 sed 's#../apps/server2.pem#/sdcard/android.testssl/server2.pem#' | \
456 cat > \
457 android.testssl/testssl
458 chmod +x android.testssl/testssl
459 cat test/Uss.cnf | sed 's#./.rnd#/sdcard/android.testssl/.rnd#' >> android.tes tssl/Uss.cnf
460 cat test/CAss.cnf | sed 's#./.rnd#/sdcard/android.testssl/.rnd#' >> android.te stssl/CAss.cnf
461 cp apps/server2.pem android.testssl/
462 cp ../patches/testssl.sh android.testssl/
463
464 cd ..
465
466 generate_config_mk Crypto-config.mk CRYPTO
467 generate_config_mk Ssl-config.mk SSL
468 generate_config_mk Apps-config.mk APPS
469
470 # Prune unnecessary sources
471 prune
472
473 NEEDED_SOURCES="$NEEDED_SOURCES android.testssl"
474 for i in $NEEDED_SOURCES; do
475 echo "Updating $i"
476 rm -r $i
477 mv $OPENSSL_DIR/$i .
478 done
479
480 cleantar
481 }
482
483 function regenerate() {
484 declare -r patch=$1
485
486 generatepatch $patch
487 }
488
489 function generate() {
490 declare -r patch=$1
491 declare -r OPENSSL_SOURCE=$2
492
493 untar $OPENSSL_SOURCE
494 applypatches $OPENSSL_DIR_ORIG $patch
495 prune
496
497 for i in $NEEDED_SOURCES; do
498 echo "Restoring $i"
499 rm -r $OPENSSL_DIR/$i
500 cp -rf $i $OPENSSL_DIR/$i
501 done
502
503 generatepatch $patch
504 cleantar
505 }
506
507 # Find all files in a sub-directory that are encoded in ISO-8859
508 # $1: Directory.
509 # Out: list of files in $1 that are encoded as ISO-8859.
510 function find_iso8859_files() {
511 find $1 -type f -print0 | xargs -0 file | fgrep "ISO-8859" | cut -d: -f1
512 }
513
514 # Convert all ISO-8859 files in a given subdirectory to UTF-8
515 # $1: Directory name
516 function convert_iso8859_to_utf8() {
517 declare -r iso_files=$(find_iso8859_files "$1")
518 for iso_file in $iso_files; do
519 iconv --from-code iso-8859-1 --to-code utf-8 $iso_file > $iso_file.tmp
520 rm -f $iso_file
521 mv $iso_file.tmp $iso_file
522 done
523 }
524
525 function untar() {
526 declare -r OPENSSL_SOURCE=$1
527 declare -r readonly=$2
528
529 # Remove old source
530 cleantar
531
532 # Process new source
533 tar -zxf $OPENSSL_SOURCE
534 convert_iso8859_to_utf8 $OPENSSL_DIR
535 cp -rfP $OPENSSL_DIR $OPENSSL_DIR_ORIG
536 if [ ! -z $readonly ]; then
537 find $OPENSSL_DIR_ORIG -type f -print0 | xargs -0 chmod a-w
538 fi
539 }
540
541 function prune() {
542 echo "Removing $UNNEEDED_SOURCES"
543 (cd $OPENSSL_DIR_ORIG && rm -rf $UNNEEDED_SOURCES)
544 (cd $OPENSSL_DIR && rm -r $UNNEEDED_SOURCES)
545 }
546
547 function cleantar() {
548 rm -rf $OPENSSL_DIR_ORIG
549 rm -rf $OPENSSL_DIR
550 }
551
552 function applypatches () {
553 declare -r dir=$1
554 declare -r skip_patch=$2
555
556 cd $dir
557
558 # Apply appropriate patches
559 for i in $OPENSSL_PATCHES; do
560 if [ ! "$skip_patch" = "patches/$i" ]; then
561 echo "Applying patch $i"
562 patch -p1 --merge < ../patches/$i || die "Could not apply patches/$i. Fix source and run: $0 regenerate patches/$i"
563 else
564 echo "Skiping patch $i"
565 fi
566
567 done
568
569 # Cleanup patch output
570 find . \( -type f -o -type l \) -name "*.orig" -print0 | xargs -0 rm -f
571
572 cd ..
573 }
574
575 function generatepatch() {
576 declare -r patch=$1
577
578 # Cleanup stray files before generating patch
579 find $BOUNCYCASTLE_DIR -type f -name "*.orig" -print0 | xargs -0 rm -f
580 find $BOUNCYCASTLE_DIR -type f -name "*~" -print0 | xargs -0 rm -f
581
582 declare -r variable_name=OPENSSL_PATCHES_`basename $patch .patch | sed s/-/_/` _SOURCES
583 # http://tldp.org/LDP/abs/html/ivr.html
584 eval declare -r sources=\$$variable_name
585 rm -f $patch
586 touch $patch
587 for i in $sources; do
588 LC_ALL=C TZ=UTC0 diff -aup $OPENSSL_DIR_ORIG/$i $OPENSSL_DIR/$i >> $patch && die "ERROR: No diff for patch $path in file $i"
589 done
590 echo "Generated patch $patch"
591 echo "NOTE To make sure there are not unwanted changes from conflicting patche s, be sure to review the generated patch."
592 }
593
594 main $@
OLDNEW
« no previous file with comments | « openssl/e_os2.h ('k') | openssl/openssl.config » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698