1 | #! /bin/bash
|
---|
2 |
|
---|
3 | #
|
---|
4 | # Copyright (c) 2011 Petr Koupy
|
---|
5 | # All rights reserved.
|
---|
6 | #
|
---|
7 | # Redistribution and use in source and binary forms, with or without
|
---|
8 | # modification, are permitted provided that the following conditions
|
---|
9 | # are met:
|
---|
10 | #
|
---|
11 | # - Redistributions of source code must retain the above copyright
|
---|
12 | # notice, this list of conditions and the following disclaimer.
|
---|
13 | # - Redistributions in binary form must reproduce the above copyright
|
---|
14 | # notice, this list of conditions and the following disclaimer in the
|
---|
15 | # documentation and/or other materials provided with the distribution.
|
---|
16 | # - The name of the author may not be used to endorse or promote products
|
---|
17 | # derived from this software without specific prior written permission.
|
---|
18 | #
|
---|
19 | # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
---|
20 | # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
---|
21 | # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
---|
22 | # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
---|
23 | # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
---|
24 | # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
---|
25 | # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
---|
26 | # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
---|
27 | # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
---|
28 | # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
---|
29 | #
|
---|
30 |
|
---|
31 | #
|
---|
32 | # This script is intended to be called indirectly from the Makefile.
|
---|
33 | # Given information from Makefile.common (e.g. CFLAGS), this shell
|
---|
34 | # script generates false toolchain consisting of a short shell script
|
---|
35 | # for each tool. Therefore, generated false tool already contains some
|
---|
36 | # filtered information from the HelenOS side. When the actual call is
|
---|
37 | # intercepted, information passed from the binutils side is filtered
|
---|
38 | # and stored. Information from both sides is then joined together
|
---|
39 | # and passed to the real tool.
|
---|
40 | #
|
---|
41 | # Basic idea behind filtering the information is that binutils is
|
---|
42 | # dominant provider for the compilation, whereas HelenOS is dominant
|
---|
43 | # for the linkage. In that way, the compilation command from binutils
|
---|
44 | # is left untouched and only extended with a couple of flags that are
|
---|
45 | # specific for HelenOS (i.e. include directories, preprocessor
|
---|
46 | # directives, preprocessor flags, standard libc exclusion). Similarly,
|
---|
47 | # the linkage command is taken from HelenOS and extended with the
|
---|
48 | # filtered information from binutils (i.e. output binary, objects,
|
---|
49 | # binutils libraries).
|
---|
50 | #
|
---|
51 | # Most of the false tools are straightforward. However, gcc needs a
|
---|
52 | # special approach because binutils use it for both compilation and
|
---|
53 | # linkage. In case the linking usage is detected, the call is redirected
|
---|
54 | # to the linker. There is also special case for configure script tests
|
---|
55 | # that require compiler link step.
|
---|
56 | #
|
---|
57 |
|
---|
58 | case "$1" in
|
---|
59 | "gcc")
|
---|
60 | (
|
---|
61 | echo '#! /bin/bash'
|
---|
62 | echo 'AS_LINK="`echo \"$*\" | grep '\'as-new\''`"'
|
---|
63 | echo 'LD_LINK="`echo \"$*\" | grep '\'ld-new\''`"'
|
---|
64 | echo 'LINK="`echo -n "$AS_LINK""$LD_LINK"`"'
|
---|
65 | echo 'if [ -n "$LINK" ]; then'
|
---|
66 | echo ' LD_ARGS="`echo \" $*\" | \'
|
---|
67 | echo ' sed '\'s/ -O[^ ]*//g\'' | \'
|
---|
68 | echo ' sed '\'s/ -W[^ ]*//g\'' | \'
|
---|
69 | echo ' sed '\'s/ -g//g\'' | \'
|
---|
70 | echo ' sed '\'s/ -l[^ ]*//g\'' | \'
|
---|
71 | echo ' sed '\'s/ [ ]*/ /g\''`"'
|
---|
72 | echo ' ld $LD_ARGS'
|
---|
73 | echo 'else'
|
---|
74 | CFLAGS="`echo " $3 " | \
|
---|
75 | sed 's/ -O[^ ]*//g' | \
|
---|
76 | sed 's/ -W[^ ]*//g' | \
|
---|
77 | sed 's/ -pipe//g' | \
|
---|
78 | sed 's/ -g[^ ]*//g' | \
|
---|
79 | sed 's/ [ ]*/ /g'`"
|
---|
80 | echo ' CONFTEST="`echo \"$*\" | grep '\' conftest \''`"'
|
---|
81 | echo ' if [ -n "$CONFTEST" ]; then'
|
---|
82 | echo ' LFLAGS="-Xlinker -z -Xlinker muldefs"'
|
---|
83 | echo ' echo' \'"$2"\' '"$@"' \'"$CFLAGS -T $4"\' '"$LFLAGS"' \'"$5"\'
|
---|
84 | echo " $2" '$@' "$CFLAGS -T $4" '$LFLAGS' "$5"
|
---|
85 | echo ' else'
|
---|
86 | # Remove flags:
|
---|
87 | # -Werror
|
---|
88 | # Avoid build failure due to some harmless bugs
|
---|
89 | # (e.g. unused parameter) in the HelenOS.
|
---|
90 | # -Wc++-compat
|
---|
91 | # Required just for gold linker.
|
---|
92 | echo ' GCC_ARGS="`echo \" $*\" | \'
|
---|
93 | echo ' sed '\'s/ -Werror//g\'' | \'
|
---|
94 | echo ' sed '\'s/ -Wc++-compat//g\'' | \'
|
---|
95 | echo ' sed '\'s/ [ ]*/ /g\''`"'
|
---|
96 | # Add flags:
|
---|
97 | # -example
|
---|
98 | # Flag description.
|
---|
99 | # echo ' GCC_ARGS="$GCC_ARGS -example"'
|
---|
100 | echo ' echo' \'"$2"\' '"$GCC_ARGS"' \'"$CFLAGS"\'
|
---|
101 | echo " $2" '$GCC_ARGS' "$CFLAGS"
|
---|
102 | echo ' fi'
|
---|
103 | echo 'fi'
|
---|
104 | ) > 'gcc'
|
---|
105 | chmod a+x 'gcc'
|
---|
106 | ;;
|
---|
107 | "as")
|
---|
108 | (
|
---|
109 | echo '#! /bin/bash'
|
---|
110 | echo 'echo' \'"$2"\' '"$@"'
|
---|
111 | echo "$2" '$@'
|
---|
112 | ) > 'as'
|
---|
113 | chmod a+x 'as'
|
---|
114 | ;;
|
---|
115 | "ar")
|
---|
116 | (
|
---|
117 | echo '#! /bin/bash'
|
---|
118 | echo 'echo' \'"$2"\' '"$@"'
|
---|
119 | echo "$2" '$@'
|
---|
120 | ) > 'ar'
|
---|
121 | chmod a+x 'ar'
|
---|
122 | ;;
|
---|
123 | "ranlib")
|
---|
124 | (
|
---|
125 | echo '#! /bin/bash'
|
---|
126 | echo 'echo' 'ar -s' '"$@"'
|
---|
127 | echo 'ar -s' '$@'
|
---|
128 | ) > 'ranlib'
|
---|
129 | chmod a+x 'ranlib'
|
---|
130 | ;;
|
---|
131 | "ld")
|
---|
132 | (
|
---|
133 | echo '#! /bin/bash'
|
---|
134 | echo 'echo' \'"$2 -n $3 -T $4"\' '"$@"' \'"$5"\'
|
---|
135 | echo "$2 -n $3 -T $4" '$@' "$5"
|
---|
136 | ) > 'ld'
|
---|
137 | chmod a+x 'ld'
|
---|
138 | ;;
|
---|
139 | "objdump")
|
---|
140 | (
|
---|
141 | echo '#! /bin/bash'
|
---|
142 | echo 'echo' \'"$2"\' '"$@"'
|
---|
143 | echo "$2" '$@'
|
---|
144 | ) > 'objdump'
|
---|
145 | chmod a+x 'objdump'
|
---|
146 | ;;
|
---|
147 | "objcopy")
|
---|
148 | (
|
---|
149 | echo '#! /bin/bash'
|
---|
150 | echo 'echo' \'"$2"\' '"$@"'
|
---|
151 | echo "$2" '$@'
|
---|
152 | ) > 'objcopy'
|
---|
153 | chmod a+x 'objcopy'
|
---|
154 | ;;
|
---|
155 | "strip")
|
---|
156 | (
|
---|
157 | echo '#! /bin/bash'
|
---|
158 | echo 'echo' \'"$2"\' '"$@"'
|
---|
159 | echo "$2" '$@'
|
---|
160 | ) > 'strip'
|
---|
161 | chmod a+x 'strip'
|
---|
162 | ;;
|
---|
163 | *)
|
---|
164 | ;;
|
---|
165 | esac
|
---|
166 |
|
---|