-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnasm_assemble.gni
172 lines (150 loc) · 4.7 KB
/
nasm_assemble.gni
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
# Copyright 2018 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# This provides the nasm_assemble() template which uses NASM to assemble
# assembly files.
#
# Files to be assembled with NASM should have an extension of .asm.
#
# Parameters
#
# nasm_flags (optional)
# [list of strings] Pass additional flags into NASM. These are appended
# to the command line. Note that the output format is already set up
# based on the current toolchain so you don't need to specify these
# things (see below).
#
# Example: nasm_flags = [ "-Wall" ]
#
# include_dirs (optional)
# [list of dir names] List of additional include dirs. Note that the
# source root and the root generated file dir is always added, just like
# our C++ build sets up.
#
# Example: include_dirs = [ "//some/other/path", target_gen_dir ]
#
# defines (optional)
# [list of strings] List of defines, as with the native code defines.
#
# Example: defines = [ "FOO", "BAR=1" ]
#
# inputs, deps, visibility (optional)
# These have the same meaning as in an action.
#
# Example
#
# nasm_assemble("my_nasm_target") {
# sources = [
# "ultra_optimized_awesome.asm",
# ]
# include_dirs = [ "assembly_include" ]
# }
import("//build/compiled_action.gni")
if (is_mac || is_ios) {
if (current_cpu == "x86") {
_nasm_flags = [ "-fmacho32" ]
} else if (current_cpu == "x64") {
_nasm_flags = [ "-fmacho64" ]
}
} else if (is_posix || is_fuchsia) {
if (current_cpu == "x86") {
_nasm_flags = [ "-felf32" ]
} else if (current_cpu == "x64") {
_nasm_flags = [
"-DPIC",
"-felf64",
]
}
} else if (is_win) {
if (current_cpu == "x86") {
_nasm_flags = [
"-DPREFIX",
"-fwin32",
]
} else if (current_cpu == "x64") {
_nasm_flags = [ "-fwin64" ]
}
}
if (is_win) {
asm_obj_extension = "obj"
} else {
asm_obj_extension = "o"
}
template("nasm_assemble") {
assert(defined(invoker.sources), "Need sources defined for $target_name")
# Only depend on NASM on x86 systems. Force compilation of .asm files for
# ARM to fail.
assert(current_cpu == "x86" || current_cpu == "x64")
action_name = "${target_name}_action"
source_set_name = target_name
compiled_action_foreach(action_name) {
# Only the source set can depend on this.
visibility = [ ":$source_set_name" ]
tool = "//third_party/nasm"
forward_variables_from(invoker,
[
"sources",
"inputs",
"deps",
])
# Flags.
args = _nasm_flags
if (defined(invoker.nasm_flags)) {
args += invoker.nasm_flags
}
# User defined include dirs go first.
if (defined(invoker.include_dirs)) {
foreach(include, invoker.include_dirs) {
# NASM does not append path separators when processing the -I flags, so
# -Ifoo means includes of bar look up "foobar" rather than "foo/bar".
# Add the trailing slash for it.
args += [ "-I" + rebase_path(include, root_build_dir) + "/" ]
}
}
# Default nasm include dirs. Make it match the native build (source root and
# root generated code directory).
# This goes to the end of include list. Note that, as above, we must append
# path separators because NASM does not do it itself.
args += [
"-I./",
# rebase_path("//") already includes a trailing slash.
"-I" + rebase_path("//", root_build_dir),
"-I" + rebase_path(root_gen_dir, root_build_dir) + "/",
]
# Extra defines.
if (defined(invoker.defines)) {
foreach(def, invoker.defines) {
args += [ "-D$def" ]
}
}
# Output file.
outputs = [
"$target_out_dir/$source_set_name/{{source_name_part}}.o",
]
args += [
"-MD",
rebase_path(outputs[0] + ".d", root_build_dir),
"-o",
rebase_path(outputs[0], root_build_dir),
"{{source}}",
]
depfile = outputs[0] + ".d"
}
# Gather the .o files into a linkable thing. This doesn't actually link
# anything (a source set just compiles files to link later), but will pass
# the object files generated by the action up the dependency chain.
static_library(source_set_name) {
if (defined(invoker.visibility)) {
visibility = invoker.visibility
}
if (defined(invoker.all_dependent_configs)) {
all_dependent_configs = invoker.all_dependent_configs
}
sources = get_target_outputs(":$action_name")
# Do not publicize any header to remove build dependency.
public = []
deps = [
":$action_name",
]
}
}