xref: /aosp_15_r20/build/soong/rust/proc_macro.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2019 The Android Open Source Project
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage rust
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
19*333d2b36SAndroid Build Coastguard Worker)
20*333d2b36SAndroid Build Coastguard Worker
21*333d2b36SAndroid Build Coastguard Workerfunc init() {
22*333d2b36SAndroid Build Coastguard Worker	android.RegisterModuleType("rust_proc_macro", ProcMacroFactory)
23*333d2b36SAndroid Build Coastguard Worker}
24*333d2b36SAndroid Build Coastguard Worker
25*333d2b36SAndroid Build Coastguard Workertype ProcMacroCompilerProperties struct {
26*333d2b36SAndroid Build Coastguard Worker}
27*333d2b36SAndroid Build Coastguard Worker
28*333d2b36SAndroid Build Coastguard Workertype procMacroDecorator struct {
29*333d2b36SAndroid Build Coastguard Worker	*baseCompiler
30*333d2b36SAndroid Build Coastguard Worker	*flagExporter
31*333d2b36SAndroid Build Coastguard Worker
32*333d2b36SAndroid Build Coastguard Worker	Properties ProcMacroCompilerProperties
33*333d2b36SAndroid Build Coastguard Worker}
34*333d2b36SAndroid Build Coastguard Worker
35*333d2b36SAndroid Build Coastguard Workertype procMacroInterface interface {
36*333d2b36SAndroid Build Coastguard Worker	ProcMacro() bool
37*333d2b36SAndroid Build Coastguard Worker}
38*333d2b36SAndroid Build Coastguard Worker
39*333d2b36SAndroid Build Coastguard Workervar _ compiler = (*procMacroDecorator)(nil)
40*333d2b36SAndroid Build Coastguard Workervar _ exportedFlagsProducer = (*procMacroDecorator)(nil)
41*333d2b36SAndroid Build Coastguard Worker
42*333d2b36SAndroid Build Coastguard Workerfunc ProcMacroFactory() android.Module {
43*333d2b36SAndroid Build Coastguard Worker	module, _ := NewProcMacro(android.HostSupportedNoCross)
44*333d2b36SAndroid Build Coastguard Worker	return module.Init()
45*333d2b36SAndroid Build Coastguard Worker}
46*333d2b36SAndroid Build Coastguard Worker
47*333d2b36SAndroid Build Coastguard Workerfunc NewProcMacro(hod android.HostOrDeviceSupported) (*Module, *procMacroDecorator) {
48*333d2b36SAndroid Build Coastguard Worker	module := newModule(hod, android.MultilibFirst)
49*333d2b36SAndroid Build Coastguard Worker
50*333d2b36SAndroid Build Coastguard Worker	procMacro := &procMacroDecorator{
51*333d2b36SAndroid Build Coastguard Worker		baseCompiler: NewBaseCompiler("lib", "lib64", InstallInSystem),
52*333d2b36SAndroid Build Coastguard Worker		flagExporter: NewFlagExporter(),
53*333d2b36SAndroid Build Coastguard Worker	}
54*333d2b36SAndroid Build Coastguard Worker
55*333d2b36SAndroid Build Coastguard Worker	// Don't sanitize procMacros
56*333d2b36SAndroid Build Coastguard Worker	module.sanitize = nil
57*333d2b36SAndroid Build Coastguard Worker	module.compiler = procMacro
58*333d2b36SAndroid Build Coastguard Worker
59*333d2b36SAndroid Build Coastguard Worker	return module, procMacro
60*333d2b36SAndroid Build Coastguard Worker}
61*333d2b36SAndroid Build Coastguard Worker
62*333d2b36SAndroid Build Coastguard Workerfunc (procMacro *procMacroDecorator) compilerProps() []interface{} {
63*333d2b36SAndroid Build Coastguard Worker	return append(procMacro.baseCompiler.compilerProps(),
64*333d2b36SAndroid Build Coastguard Worker		&procMacro.Properties)
65*333d2b36SAndroid Build Coastguard Worker}
66*333d2b36SAndroid Build Coastguard Worker
67*333d2b36SAndroid Build Coastguard Workerfunc (procMacro *procMacroDecorator) compilerFlags(ctx ModuleContext, flags Flags) Flags {
68*333d2b36SAndroid Build Coastguard Worker	flags = procMacro.baseCompiler.compilerFlags(ctx, flags)
69*333d2b36SAndroid Build Coastguard Worker	flags.RustFlags = append(flags.RustFlags, "--extern proc_macro")
70*333d2b36SAndroid Build Coastguard Worker	return flags
71*333d2b36SAndroid Build Coastguard Worker}
72*333d2b36SAndroid Build Coastguard Worker
73*333d2b36SAndroid Build Coastguard Workerfunc (procMacro *procMacroDecorator) compile(ctx ModuleContext, flags Flags, deps PathDeps) buildOutput {
74*333d2b36SAndroid Build Coastguard Worker	fileName := procMacro.getStem(ctx) + ctx.toolchain().ProcMacroSuffix()
75*333d2b36SAndroid Build Coastguard Worker	outputFile := android.PathForModuleOut(ctx, fileName)
76*333d2b36SAndroid Build Coastguard Worker	srcPath := crateRootPath(ctx, procMacro)
77*333d2b36SAndroid Build Coastguard Worker	ret := TransformSrctoProcMacro(ctx, srcPath, deps, flags, outputFile)
78*333d2b36SAndroid Build Coastguard Worker	procMacro.baseCompiler.unstrippedOutputFile = outputFile
79*333d2b36SAndroid Build Coastguard Worker
80*333d2b36SAndroid Build Coastguard Worker	return ret
81*333d2b36SAndroid Build Coastguard Worker}
82*333d2b36SAndroid Build Coastguard Worker
83*333d2b36SAndroid Build Coastguard Workerfunc (procMacro *procMacroDecorator) getStem(ctx ModuleContext) string {
84*333d2b36SAndroid Build Coastguard Worker	stem := procMacro.baseCompiler.getStemWithoutSuffix(ctx)
85*333d2b36SAndroid Build Coastguard Worker	validateLibraryStem(ctx, stem, procMacro.crateName())
86*333d2b36SAndroid Build Coastguard Worker
87*333d2b36SAndroid Build Coastguard Worker	return stem + String(procMacro.baseCompiler.Properties.Suffix)
88*333d2b36SAndroid Build Coastguard Worker}
89*333d2b36SAndroid Build Coastguard Worker
90*333d2b36SAndroid Build Coastguard Workerfunc (procMacro *procMacroDecorator) autoDep(ctx android.BottomUpMutatorContext) autoDep {
91*333d2b36SAndroid Build Coastguard Worker	return rlibAutoDep
92*333d2b36SAndroid Build Coastguard Worker}
93*333d2b36SAndroid Build Coastguard Worker
94*333d2b36SAndroid Build Coastguard Workerfunc (procMacro *procMacroDecorator) ProcMacro() bool {
95*333d2b36SAndroid Build Coastguard Worker	return true
96*333d2b36SAndroid Build Coastguard Worker}
97*333d2b36SAndroid Build Coastguard Worker
98*333d2b36SAndroid Build Coastguard Workerfunc (procMacro *procMacroDecorator) everInstallable() bool {
99*333d2b36SAndroid Build Coastguard Worker	// Proc_macros are never installed
100*333d2b36SAndroid Build Coastguard Worker	return false
101*333d2b36SAndroid Build Coastguard Worker}
102