@@ -29,6 +29,7 @@ import (
2929 "github.com/spdx/tools-golang/spdx/v2/common"
3030
3131 build "chainguard.dev/melange/pkg/build/sbom"
32+ "chainguard.dev/melange/pkg/config"
3233 "chainguard.dev/melange/pkg/sbom"
3334)
3435
@@ -121,13 +122,14 @@ func (g *Generator) GenerateSPDX(ctx context.Context, gc *build.GeneratorContext
121122 // Add APK packages to their respective SBOMs
122123 for _ , sp := range gc .Configuration .Subpackages {
123124 spSBOM := sg .Document (sp .Name )
125+ spPkg := packageForSubpackage (pkg , & sp )
124126
125127 apkSubPkg := & sbom.Package {
126128 IDComponents : []string {"apk" , sp .Name , pkg .FullVersion ()},
127129 Name : sp .Name ,
128130 Version : pkg .FullVersion (),
129- Copyright : pkg .FullCopyright (),
130- LicenseDeclared : pkg .LicenseExpression (),
131+ Copyright : spPkg .FullCopyright (),
132+ LicenseDeclared : spPkg .LicenseExpression (),
131133 Namespace : gc .Namespace ,
132134 Arch : arch ,
133135 PURL : pkg .PackageURLForSubpackage (gc .Namespace , arch , sp .Name ),
@@ -139,7 +141,7 @@ func (g *Generator) GenerateSPDX(ctx context.Context, gc *build.GeneratorContext
139141 // Add upstream source packages from subpackage pipelines
140142 for i , p := range sp .Pipeline {
141143 uniqueID := strconv .Itoa (i )
142- upstreamPkg , err := p .SBOMPackageForUpstreamSource (pkg .LicenseExpression (), gc .Namespace , uniqueID )
144+ upstreamPkg , err := p .SBOMPackageForUpstreamSource (spPkg .LicenseExpression (), gc .Namespace , uniqueID )
143145 if err != nil {
144146 return nil , fmt .Errorf ("creating SBOM package for upstream source in subpackage %s: %w" , sp .Name , err )
145147 }
@@ -206,7 +208,7 @@ func (g *Generator) GenerateSPDX(ctx context.Context, gc *build.GeneratorContext
206208 }
207209
208210 // Add licensing information
209- li , err := gc . Configuration . Package . LicensingInfos (ctx , gc . WorkspaceDir )
211+ li , err := licensingInfos (ctx , gc )
210212 if err != nil {
211213 return nil , fmt .Errorf ("gathering licensing infos: %w" , err )
212214 }
@@ -227,6 +229,40 @@ func (g *Generator) GenerateSPDX(ctx context.Context, gc *build.GeneratorContext
227229 return out , nil
228230}
229231
232+ func packageForSubpackage (pkg * config.Package , sp * config.Subpackage ) config.Package {
233+ copyright := sp .Copyright
234+ if len (copyright ) == 0 {
235+ copyright = pkg .Copyright
236+ }
237+
238+ return config.Package {
239+ Name : sp .Name ,
240+ Version : pkg .Version ,
241+ Epoch : pkg .Epoch ,
242+ Copyright : copyright ,
243+ }
244+ }
245+
246+ func licensingInfos (ctx context.Context , gc * build.GeneratorContext ) (map [string ]string , error ) {
247+ out , err := gc .Configuration .Package .LicensingInfos (ctx , gc .WorkspaceDir )
248+ if err != nil {
249+ return nil , err
250+ }
251+
252+ for _ , sp := range gc .Configuration .Subpackages {
253+ spPkg := packageForSubpackage (& gc .Configuration .Package , & sp )
254+ li , err := spPkg .LicensingInfos (ctx , gc .WorkspaceDir )
255+ if err != nil {
256+ return nil , err
257+ }
258+ for k , v := range li {
259+ out [k ] = v
260+ }
261+ }
262+
263+ return out , nil
264+ }
265+
230266// GenerateSBOM generates and writes SPDX SBOM documents for the main package and
231267// all subpackages based on the build context.
232268func (g * Generator ) GenerateSBOM (ctx context.Context , gc * build.GeneratorContext ) error {
0 commit comments