# $NetBSD: arg-pp-main,v 1.8 2018/08/22 20:48:37 maya Exp $ # # Copyright (c) 2005 The NetBSD Foundation, Inc. # All rights reserved. # # This code is derived from software contributed to The NetBSD Foundation # by Johnny C. Lam. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. case $arg in ###################################################################### # Split direct paths to shared libraries into the "-Ldir -llib" # equivalent. ###################################################################### /*/lib*.so|/*/lib*.so.[0-9]*) dir="${arg%/lib*}" lib="${arg#$dir/lib}" case $lib in */*) argok=yes; argmatch=yes ;; *.so) lib="${lib%.so}" ;; *.so.[0-9]*) lib="${lib%.so.[0-9]*}" ;; esac case $argmatch in yes) ;; *) prepend_queue argbuf "-l$lib" $debug_log $wrapperlog " (arg-pp-main) pre: -l$lib" prepend_queue argbuf "-L$dir" $debug_log $wrapperlog " (arg-pp-main) pre: -L$dir" argmatch=yes ;; esac ;; /*/lib*.sl|/*/lib*.sl.[0-9]*) # HP-UX dir="${arg%/lib*}" lib="${arg#$dir/lib}" case $lib in */*) argok=yes; argmatch=yes ;; *.sl) lib="${lib%.sl}" ;; *.sl.[0-9]*) lib="${lib%.sl.[0-9]*}" ;; esac case $argmatch in yes) ;; *) prepend_queue argbuf "-l$lib" $debug_log $wrapperlog " (arg-pp-main) pre: -l$lib" prepend_queue argbuf "-L$dir" $debug_log $wrapperlog " (arg-pp-main) pre: -L$dir" argmatch=yes ;; esac ;; ###################################################################### # Remove extraneous comma in "-Wl,-R,/dir" and in "-Wl,-L,/dir". ###################################################################### -Wl,-L,*) arg="-Wl,-L${arg#-Wl,-L,}" $debug_log $wrapperlog " (arg-pp-main) pre: $arg" prepend_queue argbuf "$arg" argmatch=yes ;; -Wl,-R,*) arg="-Wl,-R${arg#-Wl,-R,}" $debug_log $wrapperlog " (arg-pp-main) pre: $arg" prepend_queue argbuf "$arg" argmatch=yes ;; ###################################################################### # Merge "-Wl,-R -Wl,/dir" into a single "-Wl,-R/dir". Same for -Wl,-L, # -Wl,-rpath and -Wl,-rpath-link. ###################################################################### -Wl,-[LR]) pop_queue argbuf nextarg $debug_log $wrapperlog " (arg-pp-main) pop: $nextarg" nextarg="${nextarg#-Wl,}" $debug_log $wrapperlog " (arg-pp-main) pre: $arg$nextarg" prepend_queue argbuf "$arg$nextarg" argmatch=yes ;; -Wl,-rpath|-Wl,-rpath-link|-Wl,--rpath) pop_queue argbuf nextarg $debug_log $wrapperlog " (arg-pp-main) pop: $nextarg" nextarg="${nextarg#-Wl,}" $debug_log $wrapperlog " (arg-pp-main) pre: $arg,$nextarg" prepend_queue argbuf "$arg,$nextarg" argmatch=yes ;; ###################################################################### # Remove rpath options that try to add relative paths to the runtime # library search path. This basically cleans up after lazy programmers # who can't write Makefiles. ###################################################################### -R[!/]*|-Wl,-R[!/]*|\ -Wl,-rpath,[!/]*|-Wl,-rpath-link,[!/]*|-Wl,--rpath,[!/]*) $debug_log $wrapperlog " (arg-pp-main) drop: $arg" argmatch=yes ;; ###################################################################### # Remove consecutive, repeated library options. ###################################################################### -l*) head_queue argbuf nextarg while $test "$nextarg" = "$arg"; do pop_queue argbuf nextarg $debug_log $wrapperlog " (arg-pp-main) drop: $nextarg" if queue_is_empty argbuf; then break else head_queue argbuf nextarg fi done argok=yes argmatch=yes ;; ####################################################################### # The -o option takes an extra argument that should be passed unmodified. ####################################################################### -o) skipargs=1 argok=yes argmatch=yes ;; ####################################################################### # GNU ld uses "--dynamic-linker /path/to/shared/object" to set the # dynamic linker code for ELF executables. ####################################################################### --dynamic-linker) skipargs=1 argok=yes argmatch=yes ;; esac