@@ -26,10 +26,15 @@ lib() {
26
26
parse_options () {
27
27
OPTIONS=()
28
28
ARGUMENTS=()
29
+ EXTRA_ARGUMENTS=()
29
30
local arg option index
30
31
31
- for arg in " $@ " ; do
32
- if [ " ${arg: 0: 1} " = " -" ]; then
32
+ while [ $# -gt 0 ]; do
33
+ arg=" $1 "
34
+ if [ " $arg " == " --" ]; then
35
+ shift 1
36
+ break
37
+ elif [ " ${arg: 0: 1} " = " -" ]; then
33
38
if [ " ${arg: 1: 1} " = " -" ]; then
34
39
OPTIONS[${# OPTIONS[*]} ]=" ${arg: 2} "
35
40
else
@@ -40,10 +45,14 @@ lib() {
40
45
index=$(( $index + 1 ))
41
46
done
42
47
fi
48
+ shift 1
43
49
else
44
50
ARGUMENTS[${# ARGUMENTS[*]} ]=" $arg "
51
+ shift 1
45
52
fi
46
53
done
54
+
55
+ EXTRA_ARGUMENTS=(" $@ " )
47
56
}
48
57
49
58
if [ " $1 " == " --$FUNCNAME " ]; then
@@ -520,6 +529,7 @@ build_package() {
520
529
package_option () {
521
530
local package_name=" $1 "
522
531
local command_name=" $2 "
532
+ # e.g. RUBY_CONFIGURE_OPTS_ARRAY, OPENSSL_MAKE_OPTS_ARRAY
523
533
local variable=" $( capitalize " ${package_name} _${command_name} " ) _OPTS_ARRAY"
524
534
local array=" $variable [@]"
525
535
shift 2
@@ -641,18 +651,18 @@ build_package_ruby() {
641
651
build_package_ree_installer () {
642
652
build_package_auto_tcltk
643
653
644
- local options=" "
645
- is_mac && options= " --no-tcmalloc"
654
+ local options=()
655
+ is_mac && options+=( --no-tcmalloc)
646
656
647
657
local option
648
- for option in ${RUBY_CONFIGURE_OPTS_ARRAY[@]} $RUBY_CONFIGURE_OPTS ; do
649
- options= " $options -c $option "
658
+ for option in " ${RUBY_CONFIGURE_OPTS_ARRAY[@]} " $RUBY_CONFIGURE_OPTS ; do
659
+ options+=( -c " $option " )
650
660
done
651
661
652
662
# Work around install_useful_libraries crash with --dont-install-useful-gems
653
663
mkdir -p " $PREFIX_PATH /lib/ruby/gems/1.8/gems"
654
664
655
- { ./installer --auto " $PREFIX_PATH " --dont-install-useful-gems $ options $CONFIGURE_OPTS
665
+ { ./installer --auto " $PREFIX_PATH " --dont-install-useful-gems " ${ options[@]} " $CONFIGURE_OPTS
656
666
} >&4 2>&1
657
667
}
658
668
@@ -1259,6 +1269,7 @@ unset KEEP_BUILD_PATH
1259
1269
unset HAS_PATCH
1260
1270
unset IPV4
1261
1271
unset IPV6
1272
+ unset EARLY_EXIT
1262
1273
1263
1274
RUBY_BUILD_INSTALL_PREFIX=" $( abs_dirname " $0 " ) /.."
1264
1275
@@ -1270,17 +1281,13 @@ parse_options "$@"
1270
1281
for option in " ${OPTIONS[@]} " ; do
1271
1282
case " $option " in
1272
1283
" h" | " help" )
1273
- version
1274
- echo
1275
- usage 0
1284
+ EARLY_EXIT=help
1276
1285
;;
1277
1286
" definitions" )
1278
- list_definitions
1279
- exit 0
1287
+ EARLY_EXIT=list_definitions
1280
1288
;;
1281
1289
" l" | " list" )
1282
- list_maintained_versions
1283
- exit 0
1290
+ EARLY_EXIT=list_maintained_versions
1284
1291
;;
1285
1292
" k" | " keep" )
1286
1293
KEEP_BUILD_PATH=true
@@ -1298,18 +1305,61 @@ for option in "${OPTIONS[@]}"; do
1298
1305
IPV6=true
1299
1306
;;
1300
1307
" version" )
1301
- version
1302
- exit 0
1308
+ EARLY_EXIT=version
1309
+ ;;
1310
+ * )
1311
+ printf " ruby-build: invalid flag '%s'\n" " $option " >&2
1312
+ EARLY_EXIT=usage_error
1303
1313
;;
1304
1314
esac
1305
1315
done
1306
1316
1307
- [ " ${# ARGUMENTS[@]} " -eq 2 ] || usage 1 >&2
1308
-
1309
1317
DEFINITION_PATH=" ${ARGUMENTS[0]} "
1310
- if [ -z " $DEFINITION_PATH " ]; then
1318
+ PREFIX_PATH=" ${ARGUMENTS[1]} "
1319
+
1320
+ if [ -z " $EARLY_EXIT " ] && [ -z " $DEFINITION_PATH " ]; then
1321
+ echo " ruby-build: missing definition argument" >&2
1322
+ EARLY_EXIT=usage_error
1323
+ fi
1324
+
1325
+ if [ -z " $EARLY_EXIT " ] && [ -z " $PREFIX_PATH " ]; then
1326
+ echo " ruby-build: missing prefix argument" >&2
1327
+ EARLY_EXIT=usage_error
1328
+ fi
1329
+
1330
+ if [ " ${# ARGUMENTS[@]} " -gt 2 ]; then
1331
+ echo " ruby-build: expected at most 2 arguments, got [${ARGUMENTS[*]} ]" >&2
1332
+ EARLY_EXIT=usage_error
1333
+ fi
1334
+
1335
+ if [ " ${# EXTRA_ARGUMENTS[@]} " -gt 0 ]; then
1336
+ RUBY_CONFIGURE_OPTS_ARRAY=(" ${EXTRA_ARGUMENTS[@]} " )
1337
+ fi
1338
+
1339
+ case " $EARLY_EXIT " in
1340
+ help )
1341
+ version
1342
+ echo
1343
+ usage 0
1344
+ ;;
1345
+ version | list_definitions | list_maintained_versions )
1346
+ " $EARLY_EXIT "
1347
+ exit 0
1348
+ ;;
1349
+ usage_error )
1350
+ echo >&2
1311
1351
usage 1 >&2
1312
- elif [ ! -f " $DEFINITION_PATH " ]; then
1352
+ ;;
1353
+ ' ' )
1354
+ ;;
1355
+ * )
1356
+ echo " unimplemented EARLY_EXIT: $EARLY_EXIT " >&2
1357
+ exit 1
1358
+ ;;
1359
+ esac
1360
+
1361
+ # expand the <definition> argument to full path of the definition file
1362
+ if [ ! -f " $DEFINITION_PATH " ]; then
1313
1363
for DEFINITION_DIR in " ${RUBY_BUILD_DEFINITIONS[@]} " ; do
1314
1364
if [ -f " ${DEFINITION_DIR} /${DEFINITION_PATH} " ]; then
1315
1365
DEFINITION_PATH=" ${DEFINITION_DIR} /${DEFINITION_PATH} "
@@ -1323,10 +1373,8 @@ elif [ ! -f "$DEFINITION_PATH" ]; then
1323
1373
fi
1324
1374
fi
1325
1375
1326
- PREFIX_PATH=" ${ARGUMENTS[1]} "
1327
- if [ -z " $PREFIX_PATH " ]; then
1328
- usage 1 >&2
1329
- elif [ " ${PREFIX_PATH#/ } " = " $PREFIX_PATH " ]; then
1376
+ # normalize the <prefix> argument
1377
+ if [ " ${PREFIX_PATH#/ } " = " $PREFIX_PATH " ]; then
1330
1378
PREFIX_PATH=" ${PWD} /${PREFIX_PATH} "
1331
1379
fi
1332
1380
@@ -1357,7 +1405,7 @@ if [ -n "$noexec" ]; then
1357
1405
fi
1358
1406
1359
1407
if [ -z " $MAKE " ]; then
1360
- if is_freebsd && [[ $1 == jruby-* ]]; then
1408
+ if is_freebsd && [[ ${ARGUMENTS[0]} == jruby-* ]]; then
1361
1409
# jruby-launcher requires gmake: https://github.com/ruby/ruby/pull/8591
1362
1410
export MAKE=" gmake"
1363
1411
else
0 commit comments