110 --debug add extra compile flags for debug builds |
110 --debug add extra compile flags for debug builds |
111 --release add extra compile flags for release builds |
111 --release add extra compile flags for release builds |
112 |
112 |
113 Optional Features: |
113 Optional Features: |
114 --enable-static statically link libstdc++ |
114 --enable-static statically link libstdc++ |
|
115 --enable-asan compile with address sanitizer |
|
116 --enable-ubsan compile with undefined behavior sanitizer |
115 |
117 |
116 __EOF__ |
118 __EOF__ |
117 } |
119 } |
118 |
120 |
119 # create temporary directory |
121 # create temporary directory |
177 "--help"*) printhelp; abort_configure ;; |
179 "--help"*) printhelp; abort_configure ;; |
178 "--debug") BUILD_TYPE="debug" ;; |
180 "--debug") BUILD_TYPE="debug" ;; |
179 "--release") BUILD_TYPE="release" ;; |
181 "--release") BUILD_TYPE="release" ;; |
180 "--enable-static") FEATURE_STATIC=on ;; |
182 "--enable-static") FEATURE_STATIC=on ;; |
181 "--disable-static") unset FEATURE_STATIC ;; |
183 "--disable-static") unset FEATURE_STATIC ;; |
|
184 "--enable-asan") FEATURE_ASAN=on ;; |
|
185 "--disable-asan") unset FEATURE_ASAN ;; |
|
186 "--enable-ubsan") FEATURE_UBSAN=on ;; |
|
187 "--disable-ubsan") unset FEATURE_UBSAN ;; |
182 "-"*) echo "unknown option: $ARG"; abort_configure ;; |
188 "-"*) echo "unknown option: $ARG"; abort_configure ;; |
183 esac |
189 esac |
184 done |
190 done |
185 |
191 |
186 |
192 |
293 shift |
299 shift |
294 printf "$@" |
300 printf "$@" |
295 fi |
301 fi |
296 } |
302 } |
297 |
303 |
|
304 dependency_error_asan() |
|
305 { |
|
306 print_check_msg "$dep_checked_asan" "checking for asan... " |
|
307 # dependency asan toolchain="gnuc" |
|
308 while true |
|
309 do |
|
310 if notistoolchain "gnuc"; then |
|
311 break |
|
312 fi |
|
313 TEMP_CXXFLAGS="$TEMP_CXXFLAGS -fsanitize=address" |
|
314 TEMP_LDFLAGS="$TEMP_LDFLAGS -fsanitize=address" |
|
315 print_check_msg "$dep_checked_asan" "yes\n" |
|
316 dep_checked_asan=1 |
|
317 return 1 |
|
318 done |
|
319 |
|
320 print_check_msg "$dep_checked_asan" "no\n" |
|
321 dep_checked_asan=1 |
|
322 return 0 |
|
323 } |
298 dependency_error_static() |
324 dependency_error_static() |
299 { |
325 { |
300 print_check_msg "$dep_checked_static" "checking for static... " |
326 print_check_msg "$dep_checked_static" "checking for static... " |
301 # dependency static toolchain="gcc" |
327 # dependency static toolchain="gnuc" |
302 while true |
328 while true |
303 do |
329 do |
304 if notistoolchain "gcc"; then |
330 if notistoolchain "gnuc"; then |
305 break |
331 break |
306 fi |
332 fi |
307 TEMP_LDFLAGS="$TEMP_LDFLAGS -static" |
333 TEMP_LDFLAGS="$TEMP_LDFLAGS -static" |
308 print_check_msg "$dep_checked_static" "yes\n" |
334 print_check_msg "$dep_checked_static" "yes\n" |
309 dep_checked_static=1 |
335 dep_checked_static=1 |
310 return 1 |
336 return 1 |
311 done |
337 done |
312 |
338 |
313 # dependency static toolchain="clang" |
|
314 while true |
|
315 do |
|
316 if notistoolchain "clang"; then |
|
317 break |
|
318 fi |
|
319 TEMP_LDFLAGS="$TEMP_LDFLAGS -static" |
|
320 print_check_msg "$dep_checked_static" "yes\n" |
|
321 dep_checked_static=1 |
|
322 return 1 |
|
323 done |
|
324 |
|
325 print_check_msg "$dep_checked_static" "no\n" |
339 print_check_msg "$dep_checked_static" "no\n" |
326 dep_checked_static=1 |
340 dep_checked_static=1 |
|
341 return 0 |
|
342 } |
|
343 dependency_error_ubsan() |
|
344 { |
|
345 print_check_msg "$dep_checked_ubsan" "checking for ubsan... " |
|
346 # dependency ubsan toolchain="gnuc" |
|
347 while true |
|
348 do |
|
349 if notistoolchain "gnuc"; then |
|
350 break |
|
351 fi |
|
352 TEMP_CXXFLAGS="$TEMP_CXXFLAGS -fsanitize=undefined" |
|
353 TEMP_LDFLAGS="$TEMP_LDFLAGS -fsanitize=undefined" |
|
354 print_check_msg "$dep_checked_ubsan" "yes\n" |
|
355 dep_checked_ubsan=1 |
|
356 return 1 |
|
357 done |
|
358 |
|
359 print_check_msg "$dep_checked_ubsan" "no\n" |
|
360 dep_checked_ubsan=1 |
327 return 0 |
361 return 0 |
328 } |
362 } |
329 |
363 |
330 # start collecting dependency information |
364 # start collecting dependency information |
331 echo > "$TEMP_DIR/flags.mk" |
365 echo > "$TEMP_DIR/flags.mk" |
408 if [ -n "$FEATURE_STATIC" ]; then |
442 if [ -n "$FEATURE_STATIC" ]; then |
409 : |
443 : |
410 else |
444 else |
411 : |
445 : |
412 fi |
446 fi |
|
447 if [ -n "$FEATURE_ASAN" ]; then |
|
448 # check dependency |
|
449 if dependency_error_asan ; then |
|
450 # "auto" features can fail and are just disabled in this case |
|
451 if [ "$FEATURE_ASAN" = "auto" ]; then |
|
452 DISABLE_FEATURE_ASAN=1 |
|
453 else |
|
454 DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED asan " |
|
455 ERROR=1 |
|
456 fi |
|
457 fi |
|
458 if [ -n "$DISABLE_FEATURE_ASAN" ]; then |
|
459 unset FEATURE_ASAN |
|
460 fi |
|
461 fi |
|
462 if [ -n "$FEATURE_ASAN" ]; then |
|
463 : |
|
464 else |
|
465 : |
|
466 fi |
|
467 if [ -n "$FEATURE_UBSAN" ]; then |
|
468 # check dependency |
|
469 if dependency_error_ubsan ; then |
|
470 # "auto" features can fail and are just disabled in this case |
|
471 if [ "$FEATURE_UBSAN" = "auto" ]; then |
|
472 DISABLE_FEATURE_UBSAN=1 |
|
473 else |
|
474 DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED ubsan " |
|
475 ERROR=1 |
|
476 fi |
|
477 fi |
|
478 if [ -n "$DISABLE_FEATURE_UBSAN" ]; then |
|
479 unset FEATURE_UBSAN |
|
480 fi |
|
481 fi |
|
482 if [ -n "$FEATURE_UBSAN" ]; then |
|
483 : |
|
484 else |
|
485 : |
|
486 fi |
413 |
487 |
414 |
488 |
415 if [ -n "${TEMP_CFLAGS}" ] && [ -n "$lang_c" ]; then |
489 if [ -n "${TEMP_CFLAGS}" ] && [ -n "$lang_c" ]; then |
416 echo "CFLAGS += $TEMP_CFLAGS" >> "$TEMP_DIR/flags.mk" |
490 echo "CFLAGS += $TEMP_CFLAGS" >> "$TEMP_DIR/flags.mk" |
417 fi |
491 fi |