~vojtech-horky/helenos/coastline-qemu

« back to all changes in this revision

Viewing changes to hsct-create-specs-file.py

  • Committer: Vojtech Horky
  • Date: 2017-08-07 14:28:40 UTC
  • mfrom: (104.1.27 coastline)
  • Revision ID: vojtechhorky@users.sourceforge.net-20170807142840-nj7i0b2i0py5o5qh
MergeĀ upstreamĀ changes

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/env python3
 
2
 
 
3
#
 
4
# Copyright (c) 2017 Vojtech Horky
 
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
# https://gcc.gnu.org/onlinedocs/gcc/Spec-Files.html
 
32
#
 
33
# Usage: prog base-path CFLAGS -- ASFLAGS -- LDFLAGS
 
34
 
 
35
import sys
 
36
import re
 
37
 
 
38
def args_to_dict(args):
 
39
    i = 0
 
40
    result = {}
 
41
    while i < len(args):
 
42
        if args[i] in [ '-I', '-imacros', '-T' ]:
 
43
            result[ args[i] ] = args[i + 1]
 
44
            i = i + 2
 
45
        else:
 
46
            result[ args[i] ] = None
 
47
            i = i + 1
 
48
    return result
 
49
 
 
50
base_path = sys.argv[1]
 
51
cflags_args = []
 
52
asmflags_args = []
 
53
ldflags_args = []
 
54
 
 
55
i = 2
 
56
while i < len(sys.argv):
 
57
    if sys.argv[i] == '--':
 
58
        i = i + 1
 
59
        break
 
60
    cflags_args.append(sys.argv[i])
 
61
    i = i + 1
 
62
while i < len(sys.argv):
 
63
    if sys.argv[i] == '--':
 
64
        i = i + 1
 
65
        break
 
66
    asmflags_args.append(sys.argv[i])
 
67
    i = i + 1
 
68
while i < len(sys.argv):
 
69
    if sys.argv[i] == '--':
 
70
        break
 
71
    ldflags_args.append(sys.argv[i])
 
72
    i = i + 1
 
73
 
 
74
 
 
75
cflags = args_to_dict(cflags_args)
 
76
asmflags = args_to_dict(asmflags_args)
 
77
ldflags = args_to_dict(ldflags_args)
 
78
 
 
79
spec_directives = {
 
80
    '*asm': [ "+ " ],
 
81
    '*helenos_flags_charset': [],
 
82
    '*cpp_unique_options': [ "+ ", "-D__helenos__", "-D__HELENOS__" ],
 
83
    '*cpp': [ "+ %(helenos_flags_charset)" ],
 
84
    '*libgcc': [],
 
85
    '*startfile': [],
 
86
    '*endfile': [],
 
87
    '*cc1': [ "+ %(helenos_flags_charset)" ],
 
88
    '*cross_compile': [ '1' ],
 
89
    '*link': [],
 
90
}
 
91
 
 
92
charset_flags = re.compile('^-f.*charset.*=')
 
93
optim_flag = re.compile('^-O[0123s]$')
 
94
 
 
95
extra_asm_flags = [ '-march=4kc', '-march=r4000' ]
 
96
 
 
97
for flag in cflags:
 
98
    if (flag == '-pipe') or (optim_flag.match(flag) is not None) or flag.startswith("-W"):
 
99
        pass
 
100
    elif charset_flags.match(flag) is not None:
 
101
        spec_directives['*helenos_flags_charset'].append(flag)
 
102
    elif flag == '-imacros':
 
103
        # Skip the config.h file altogether
 
104
        # FIXME: check that no macros from that file are used in the headers!
 
105
        pass
 
106
    elif flag.startswith("-I"):
 
107
        include_path = flag[2:]
 
108
        if include_path.startswith(base_path):
 
109
            spec_directives['*cpp_unique_options'].append(flag)
 
110
    elif flag.startswith("-D"):
 
111
        spec_directives['*cpp_unique_options'].append(flag)
 
112
    elif flag == '-nostdlib':
 
113
        spec_directives['*link'].append(flag)
 
114
    elif flag == '-nostdinc':
 
115
        spec_directives['*cpp_unique_options'].append(flag)
 
116
    else:
 
117
        full_flag = flag if cflags[flag] is None else flag + " " + cflags[flag]
 
118
        spec_directives['*cc1'].append(full_flag)
 
119
        
 
120
        # Some flags needs to be passed to the assembler too
 
121
        if flag in extra_asm_flags:
 
122
            spec_directives['*asm'].append(full_flag)
 
123
 
 
124
 
 
125
for flag in asmflags:
 
126
    if flag == '--fatal-warnings':
 
127
        continue
 
128
    full_flag = flag if asmflags[flag] is None else flag + " " + asmflags[flag]
 
129
    spec_directives['*asm'].append(full_flag)
 
130
 
 
131
 
 
132
for flag in ldflags:
 
133
    if flag == '--fatal-warnings':
 
134
        continue
 
135
    full_flag = flag if ldflags[flag] is None else flag + " " + ldflags[flag]
 
136
    spec_directives['*link'].append(full_flag)
 
137
 
 
138
 
 
139
for spec_name in spec_directives:
 
140
    print("{}:\n{}\n".format(spec_name, " \\\n".join(spec_directives[spec_name])))
 
141