xref: /aosp_15_r20/build/soong/cc/ndk_abi.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2021 Google Inc. All rights reserved.
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 cc
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.RegisterParallelSingletonType("ndk_abi_dump", NdkAbiDumpSingleton)
23*333d2b36SAndroid Build Coastguard Worker	android.RegisterParallelSingletonType("ndk_abi_diff", NdkAbiDiffSingleton)
24*333d2b36SAndroid Build Coastguard Worker}
25*333d2b36SAndroid Build Coastguard Worker
26*333d2b36SAndroid Build Coastguard Workerfunc getNdkAbiDumpInstallBase(ctx android.PathContext) android.OutputPath {
27*333d2b36SAndroid Build Coastguard Worker	return android.PathForOutput(ctx).Join(ctx, "abi-dumps/ndk")
28*333d2b36SAndroid Build Coastguard Worker}
29*333d2b36SAndroid Build Coastguard Worker
30*333d2b36SAndroid Build Coastguard Workerfunc getNdkAbiDumpTimestampFile(ctx android.PathContext) android.OutputPath {
31*333d2b36SAndroid Build Coastguard Worker	return android.PathForOutput(ctx, "ndk_abi_dump.timestamp")
32*333d2b36SAndroid Build Coastguard Worker}
33*333d2b36SAndroid Build Coastguard Worker
34*333d2b36SAndroid Build Coastguard Workerfunc NdkAbiDumpSingleton() android.Singleton {
35*333d2b36SAndroid Build Coastguard Worker	return &ndkAbiDumpSingleton{}
36*333d2b36SAndroid Build Coastguard Worker}
37*333d2b36SAndroid Build Coastguard Worker
38*333d2b36SAndroid Build Coastguard Workertype ndkAbiDumpSingleton struct{}
39*333d2b36SAndroid Build Coastguard Worker
40*333d2b36SAndroid Build Coastguard Workerfunc (n *ndkAbiDumpSingleton) GenerateBuildActions(ctx android.SingletonContext) {
41*333d2b36SAndroid Build Coastguard Worker	var depPaths android.Paths
42*333d2b36SAndroid Build Coastguard Worker	ctx.VisitAllModules(func(module android.Module) {
43*333d2b36SAndroid Build Coastguard Worker		if !module.Enabled(ctx) {
44*333d2b36SAndroid Build Coastguard Worker			return
45*333d2b36SAndroid Build Coastguard Worker		}
46*333d2b36SAndroid Build Coastguard Worker
47*333d2b36SAndroid Build Coastguard Worker		if m, ok := module.(*Module); ok {
48*333d2b36SAndroid Build Coastguard Worker			if installer, ok := m.installer.(*stubDecorator); ok {
49*333d2b36SAndroid Build Coastguard Worker				if installer.hasAbiDump {
50*333d2b36SAndroid Build Coastguard Worker					depPaths = append(depPaths, installer.abiDumpPath)
51*333d2b36SAndroid Build Coastguard Worker				}
52*333d2b36SAndroid Build Coastguard Worker			}
53*333d2b36SAndroid Build Coastguard Worker		}
54*333d2b36SAndroid Build Coastguard Worker	})
55*333d2b36SAndroid Build Coastguard Worker
56*333d2b36SAndroid Build Coastguard Worker	// `m dump-ndk-abi` will dump the NDK ABI.
57*333d2b36SAndroid Build Coastguard Worker	// `development/tools/ndk/update_ndk_abi.sh` will dump the NDK ABI and
58*333d2b36SAndroid Build Coastguard Worker	// update the golden copies in prebuilts/abi-dumps/ndk.
59*333d2b36SAndroid Build Coastguard Worker	ctx.Build(pctx, android.BuildParams{
60*333d2b36SAndroid Build Coastguard Worker		Rule:      android.Touch,
61*333d2b36SAndroid Build Coastguard Worker		Output:    getNdkAbiDumpTimestampFile(ctx),
62*333d2b36SAndroid Build Coastguard Worker		Implicits: depPaths,
63*333d2b36SAndroid Build Coastguard Worker	})
64*333d2b36SAndroid Build Coastguard Worker
65*333d2b36SAndroid Build Coastguard Worker	ctx.Phony("dump-ndk-abi", getNdkAbiDumpTimestampFile(ctx))
66*333d2b36SAndroid Build Coastguard Worker}
67*333d2b36SAndroid Build Coastguard Worker
68*333d2b36SAndroid Build Coastguard Workerfunc getNdkAbiDiffTimestampFile(ctx android.PathContext) android.WritablePath {
69*333d2b36SAndroid Build Coastguard Worker	return android.PathForOutput(ctx, "ndk_abi_diff.timestamp")
70*333d2b36SAndroid Build Coastguard Worker}
71*333d2b36SAndroid Build Coastguard Worker
72*333d2b36SAndroid Build Coastguard Workerfunc NdkAbiDiffSingleton() android.Singleton {
73*333d2b36SAndroid Build Coastguard Worker	return &ndkAbiDiffSingleton{}
74*333d2b36SAndroid Build Coastguard Worker}
75*333d2b36SAndroid Build Coastguard Worker
76*333d2b36SAndroid Build Coastguard Workertype ndkAbiDiffSingleton struct{}
77*333d2b36SAndroid Build Coastguard Worker
78*333d2b36SAndroid Build Coastguard Workerfunc (n *ndkAbiDiffSingleton) GenerateBuildActions(ctx android.SingletonContext) {
79*333d2b36SAndroid Build Coastguard Worker	var depPaths android.Paths
80*333d2b36SAndroid Build Coastguard Worker	ctx.VisitAllModules(func(module android.Module) {
81*333d2b36SAndroid Build Coastguard Worker		if m, ok := module.(android.Module); ok && !m.Enabled(ctx) {
82*333d2b36SAndroid Build Coastguard Worker			return
83*333d2b36SAndroid Build Coastguard Worker		}
84*333d2b36SAndroid Build Coastguard Worker
85*333d2b36SAndroid Build Coastguard Worker		if m, ok := module.(*Module); ok {
86*333d2b36SAndroid Build Coastguard Worker			if installer, ok := m.installer.(*stubDecorator); ok {
87*333d2b36SAndroid Build Coastguard Worker				depPaths = append(depPaths, installer.abiDiffPaths...)
88*333d2b36SAndroid Build Coastguard Worker			}
89*333d2b36SAndroid Build Coastguard Worker		}
90*333d2b36SAndroid Build Coastguard Worker	})
91*333d2b36SAndroid Build Coastguard Worker
92*333d2b36SAndroid Build Coastguard Worker	depPaths = append(depPaths, getNdkAbiDumpTimestampFile(ctx))
93*333d2b36SAndroid Build Coastguard Worker
94*333d2b36SAndroid Build Coastguard Worker	// `m diff-ndk-abi` will diff the NDK ABI.
95*333d2b36SAndroid Build Coastguard Worker	ctx.Build(pctx, android.BuildParams{
96*333d2b36SAndroid Build Coastguard Worker		Rule:      android.Touch,
97*333d2b36SAndroid Build Coastguard Worker		Output:    getNdkAbiDiffTimestampFile(ctx),
98*333d2b36SAndroid Build Coastguard Worker		Implicits: depPaths,
99*333d2b36SAndroid Build Coastguard Worker	})
100*333d2b36SAndroid Build Coastguard Worker
101*333d2b36SAndroid Build Coastguard Worker	ctx.Phony("diff-ndk-abi", getNdkAbiDiffTimestampFile(ctx))
102*333d2b36SAndroid Build Coastguard Worker}
103