diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java index 02c7c26002e4b9..96839183e266ba 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java @@ -29,6 +29,7 @@ import com.google.common.collect.Sets; import com.google.common.collect.Streams; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.Root; import com.google.devtools.build.lib.analysis.AnalysisUtils; import com.google.devtools.build.lib.analysis.FileProvider; import com.google.devtools.build.lib.analysis.LanguageDependentFragment; @@ -1367,6 +1368,76 @@ private CppCompilationContext initializeCppCompilationContext(CppModel model) { } } + // TODO: Clean this up and have an `experimental` configuration + ImmutableList.Builder headerMapsBuilder = ImmutableList.builder(); + String targetName = ruleContext.getTarget().getName(); + { + HeaderMapInfo.Builder headerMapInfo = new HeaderMapInfo.Builder(); + headerMapInfo.addHeaders(publicHeaders.getHeaders()); + headerMapInfo.addHeaders(privateHeaders); + headerMapInfo.addHeaders(publicTextualHeaders); + Root root = ruleContext.getBinOrGenfilesDirectory(); + PathFragment path = PathFragment.create(targetName + "_internal.hmap"); + Artifact out = ruleContext.getPackageRelativeArtifact(path, + ruleContext + .getConfiguration() + .getGenfilesDirectory(ruleContext.getRule().getRepository())); + ruleContext.registerAction( + new HeaderMapAction(ruleContext.getActionOwner(), + headerMapInfo.build().getSources(), + out)); + contextBuilder.addQuoteIncludeDir(out.getExecPath()); + headerMapsBuilder.add(out); + } + + { + String namespace; + if (ruleContext.attributes().has("header_namespace")) { + namespace = ruleContext.attributes().get("header_namespace", Type.STRING); + } else { + namespace = ruleContext.getRule().getName(); + } + + HeaderMapInfo.Builder headerMapInfo = new HeaderMapInfo.Builder(); + headerMapInfo.setNamespace(namespace); + headerMapInfo.addNamespacedHeaders(publicHeaders.getHeaders()); + headerMapInfo.addHeaders(publicHeaders.getHeaders()); + + // These are all of the headers entered into `srcs`. + headerMapInfo.addNamespacedHeaders(privateHeaders); + headerMapInfo.addHeaders(privateHeaders); + + headerMapInfo.addNamespacedHeaders(publicTextualHeaders); + headerMapInfo.addHeaders(publicTextualHeaders); + + if (ruleContext.attributes().has("deps")){ + for (HeaderMapInfoProvider hmapProvider : ruleContext.getPrerequisites("deps", Mode.TARGET, HeaderMapInfoProvider.class)) { + headerMapInfo.mergeHeaderMapInfo(hmapProvider.getInfo()); + } + } + Root root = ruleContext.getBinOrGenfilesDirectory(); + PathFragment path = PathFragment.create(targetName + ".hmap"); + Artifact out = ruleContext.getPackageRelativeArtifact(path, + ruleContext + .getConfiguration() + .getGenfilesDirectory(ruleContext.getRule().getRepository())); + ruleContext.registerAction( + new HeaderMapAction(ruleContext.getActionOwner(), + headerMapInfo.build().getSources(), + out)); + contextBuilder.addIncludeDir(out.getExecPath()); + headerMapsBuilder.add(out); + } + + ImmutableList headerMaps = headerMapsBuilder.build(); + if (headerMaps.size() > 0) { + contextBuilder.setHeaderMaps(headerMaps); + // If we have headermaps, then we need to add an include of + // the working directory ( i.e. exec root ) in this form + // and it must be after including the header map files + contextBuilder.addIncludeDir(PathFragment.create(".")); + } + if (featureConfiguration.isEnabled(CppRuleClasses.MODULE_MAPS)) { if (cppModuleMap == null) { cppModuleMap = CppHelper.createDefaultCppModuleMap(ruleContext, /*suffix=*/ ""); diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/ClangHeaderMap.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/ClangHeaderMap.java index dc9b11ff0a5c13..66510cb614f08c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/ClangHeaderMap.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/ClangHeaderMap.java @@ -74,6 +74,7 @@ enum { public ByteBuffer buff; private int numBuckets; + private int numUsedBuckets; private int stringsOffset; private int stringsSize; private int maxValueLength; @@ -95,7 +96,6 @@ enum { // https://clang.llvm.org/doxygen/HeaderMap_8cpp_source.html ClangHeaderMap(Map headerPathsByKeys) { int dataOffset = 1; - System.out.println(headerPathsByKeys); setMap(headerPathsByKeys); int endBuckets = HEADER_SIZE + numBuckets * BUCKET_SIZE; @@ -189,55 +189,57 @@ private String getString(int offset) { } } - private void addBucket(HMapBucket bucket) { - String key = bucket.key; - int bucketIdx = clangKeyHash(key) & (numBuckets - 1); - - // Base case, the bucket Idx is free - if (buckets[bucketIdx] == null) { - buckets[bucketIdx] = bucket; - return; - } - - // Handle collisions. - - // Try to find the next slot. - // - // The lexer does a linear scan of the hash table when keys do - // not match, starting at the bucket. - while(bucketIdx < numBuckets) { + private void addBucket(HMapBucket bucket, HMapBucket[] buckets, int numBuckets) { + // Use a load factor of 0.5 + if (((numUsedBuckets + 1) / numBuckets) > 0.5 == false) { + int bucketIdx = clangKeyHash(bucket.key) & (numBuckets - 1); + // Base case, the bucket Idx is free if (buckets[bucketIdx] == null) { buckets[bucketIdx] = bucket; + this.numUsedBuckets++; return; } - bucketIdx = (bucketIdx + 1) & (numBuckets - 1); + + // Handle collisions. + // + // The lexer does a linear scan of the hash table when keys do + // not match, starting at the bucket. + while(bucketIdx < numBuckets) { + bucketIdx = (bucketIdx + 1) & (numBuckets - 1); + if (buckets[bucketIdx] == null) { + buckets[bucketIdx] = bucket; + this.numUsedBuckets++; + return; + } + } } // If there are no more slots left, grow by a power of 2 int newNumBuckets = numBuckets * 2; HMapBucket[] newBuckets = new HMapBucket[newNumBuckets]; - for(int i = 0; i < numBuckets; i++) { - HMapBucket cpBucket = buckets[i]; + + HMapBucket[] oldBuckets = buckets; + this.buckets = newBuckets; + this.numBuckets = newNumBuckets; + this.numUsedBuckets = 0; + for(HMapBucket cpBucket: oldBuckets) { if (cpBucket != null) { - int cpBucketIdx = clangKeyHash(cpBucket.key) & (newNumBuckets - 1); - newBuckets[cpBucketIdx] = cpBucket; + addBucket(cpBucket, newBuckets, newNumBuckets); } } - buckets = newBuckets; - numBuckets = newNumBuckets; - // Start again - addBucket(bucket); + addBucket(bucket, newBuckets, newNumBuckets); } private void setMap(Map headerPathsByKeys){ // Compute header metadata maxValueLength = 1; maxStringsSize = 0; + numUsedBuckets = 0; // Per the format, buckets need to be powers of 2 in size - numBuckets = getNextPowerOf2(headerPathsByKeys.size()); + numBuckets = getNextPowerOf2(headerPathsByKeys.size() + 1); buckets = new HMapBucket[numBuckets]; for(Map.Entry entry: headerPathsByKeys.entrySet()){ @@ -258,7 +260,7 @@ private void setMap(Map headerPathsByKeys){ } HMapBucket bucket = new HMapBucket(key, prefix, suffix); - addBucket(bucket); + addBucket(bucket, buckets, numBuckets); int prefixLen = prefix.getBytes().length + 1; int suffixLen = suffix.getBytes().length + 1; int keyLen = key.getBytes().length + 1; diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompilationContext.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompilationContext.java index 1cf52529911008..f583b58681c0b5 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompilationContext.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompilationContext.java @@ -23,6 +23,7 @@ import com.google.devtools.build.lib.actions.MiddlemanFactory; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; +import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; @@ -48,11 +49,11 @@ public final class CppCompilationContext implements TransitiveInfoProvider { public static final CppCompilationContext EMPTY = new Builder(null).build(); private final CommandLineContext commandLineContext; - + private final NestedSet declaredIncludeDirs; private final NestedSet declaredIncludeWarnDirs; private final NestedSet declaredIncludeSrcs; - + /** * Module maps from direct dependencies. */ @@ -62,12 +63,13 @@ public final class CppCompilationContext implements TransitiveInfoProvider { private final NestedSet nonCodeInputs; private final NestedSet> pregreppedHdrs; - + private final ModuleInfo moduleInfo; private final ModuleInfo picModuleInfo; private final CppModuleMap cppModuleMap; private final CppModuleMap verificationModuleMap; + private final ImmutableList headerMaps; private final boolean propagateModuleMapAsActionInput; @@ -87,7 +89,8 @@ private CppCompilationContext( NestedSet directModuleMaps, CppModuleMap cppModuleMap, @Nullable CppModuleMap verificationModuleMap, - boolean propagateModuleMapAsActionInput) { + boolean propagateModuleMapAsActionInput, + ImmutableList headerMaps) { Preconditions.checkNotNull(commandLineContext); this.commandLineContext = commandLineContext; this.declaredIncludeDirs = declaredIncludeDirs; @@ -98,6 +101,7 @@ private CppCompilationContext( this.moduleInfo = moduleInfo; this.picModuleInfo = picModuleInfo; this.cppModuleMap = cppModuleMap; + this.headerMaps = headerMaps; this.nonCodeInputs = nonCodeInputs; this.verificationModuleMap = verificationModuleMap; this.compilationPrerequisites = compilationPrerequisites; @@ -231,6 +235,9 @@ public NestedSet getAdditionalInputs() { if (cppModuleMap != null && propagateModuleMapAsActionInput) { builder.add(cppModuleMap.getArtifact()); } + if (headerMaps != null) { + builder.addAll(headerMaps); + } return builder.build(); } @@ -279,7 +286,8 @@ public static CppCompilationContext disallowUndeclaredHeaders(CppCompilationCont context.directModuleMaps, context.cppModuleMap, context.verificationModuleMap, - context.propagateModuleMapAsActionInput); + context.propagateModuleMapAsActionInput, + context.headerMaps); } /** @@ -331,7 +339,8 @@ public static CppCompilationContext mergeForLipo(CppCompilationContext ownerCont mergeSets(ownerContext.directModuleMaps, libContext.directModuleMaps), libContext.cppModuleMap, libContext.verificationModuleMap, - libContext.propagateModuleMapAsActionInput); + libContext.propagateModuleMapAsActionInput, + libContext.headerMaps); } /** @@ -400,6 +409,8 @@ public static class Builder { private final Set defines = new LinkedHashSet<>(); private CppModuleMap cppModuleMap; private CppModuleMap verificationModuleMap; + private ImmutableList headerMaps; + private boolean propagateModuleMapAsActionInput = true; /** The rule that owns the context */ @@ -634,6 +645,11 @@ public Builder setCppModuleMap(CppModuleMap cppModuleMap) { return this; } + public Builder setHeaderMaps(ImmutableList headerMaps) { + this.headerMaps = headerMaps; + return this; + } + /** Sets the C++ module map used to verify that headers are modules compatible. */ public Builder setVerificationModuleMap(CppModuleMap verificationModuleMap) { this.verificationModuleMap = verificationModuleMap; @@ -704,7 +720,8 @@ public CppCompilationContext build(ActionOwner owner, MiddlemanFactory middleman directModuleMaps.build(), cppModuleMap, verificationModuleMap, - propagateModuleMapAsActionInput); + propagateModuleMapAsActionInput, + headerMaps); } /** @@ -760,7 +777,7 @@ private Artifact getMiddlemanArtifact(MiddlemanFactory middlemanFactory) { ruleContext.getRule().getRepository())); } } - + /** * Gathers data about the direct and transitive .pcm files belonging to this context. Can be to * either gather data on PIC or on no-PIC .pcm files. diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/HeaderMapAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/HeaderMapAction.java index aa18ee3565acdb..c95dd7ab8f86a5 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/HeaderMapAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/HeaderMapAction.java @@ -74,8 +74,12 @@ public String getMnemonic() { @Override protected String computeKey() { Fingerprint f = new Fingerprint(); - //TODO: ComputeKeys based on headerMap f.addString(GUID); + for(Map.Entry entry: headerMap.entrySet()){ + String key = entry.getKey(); + String path = entry.getValue(); + f.addString(key + "->" + path); + } return f.hexDigestAndReset(); } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/HeaderMapInfo.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/HeaderMapInfo.java new file mode 100644 index 00000000000000..e9574a46c22e0a --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/HeaderMapInfo.java @@ -0,0 +1,93 @@ +package com.google.devtools.build.lib.rules.cpp; + +import com.google.devtools.build.lib.vfs.Path; +import java.util.Collection; +import java.util.List; +import java.util.HashMap; +import java.util.Map; +import com.google.devtools.build.lib.actions.Artifact; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableList; + +public class HeaderMapInfo { + private final ImmutableMap sources; + private HeaderMapInfo(ImmutableMap sources) { + this.sources = sources; + } + + public ImmutableMap getSources() { + return sources; + } + + /** Builder for HeaderMapInfo */ + public static class Builder { + private final ImmutableList.Builder basicHeaders = ImmutableList.builder(); + private final ImmutableList.Builder namespacedHeaders = ImmutableList.builder(); + private final ImmutableList.Builder mergedHeaderMapInfos = ImmutableList.builder(); + private String namespace = ""; + + /** Set the namespace. */ + public Builder setNamespace(String namespace) { + this.namespace = namespace; + return this; + } + + /** Signals that the build uses a header. */ + public Builder addHeader(Artifact header) { + this.basicHeaders.add(header); + return this; + } + + public Builder addHeaders(Iterable headers) { + this.basicHeaders.addAll(headers); + return this; + } + + /** Signals that the build uses a header under the namespace. */ + public Builder addNamespacedHeader(Artifact header) { + this.namespacedHeaders.add(header); + return this; + } + + public Builder addNamespacedHeaders(Iterable headers) { + this.namespacedHeaders.addAll(headers); + return this; + } + + /** + * Merge a header map info. + * Merged HeaderMapInfos are merged in reverse that they were added. + * Directly added headers take precedence over those that were merged. + */ + public Builder mergeHeaderMapInfo(HeaderMapInfo info) { + this.mergedHeaderMapInfos.add(info); + return this; + } + + public HeaderMapInfo build() { + Map inputMap = new HashMap(); + for (HeaderMapInfo info: mergedHeaderMapInfos.build().reverse()){ + for (Map.Entry entry: info.getSources().entrySet()){ + inputMap.put(entry.getKey(), entry.getValue()); + } + } + + for (Artifact hdr : basicHeaders.build()) { + inputMap.put(hdr.getPath().getBaseName(), hdr.getExecPath().getPathString()); + } + + // If there is no namespace, don't add a slash + if (namespace.equals("") == false) { + for (Artifact hdr : namespacedHeaders.build()) { + String namespacedKey = namespace + "/" + hdr.getPath().getBaseName(); + inputMap.put(namespacedKey, hdr.getExecPath().getPathString()); + } + } else { + for (Artifact hdr : namespacedHeaders.build()) { + inputMap.put(hdr.getPath().getBaseName(), hdr.getExecPath().getPathString()); + } + } + return new HeaderMapInfo(ImmutableMap.copyOf(inputMap)); + } + } +} diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/HeaderMapInfoProvider.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/HeaderMapInfoProvider.java new file mode 100644 index 00000000000000..92f50bad45831b --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/HeaderMapInfoProvider.java @@ -0,0 +1,31 @@ +package com.google.devtools.build.lib.rules.cpp; + +import com.google.common.collect.ImmutableList; +import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; +import com.google.devtools.build.lib.util.FileTypeSet; + +public class HeaderMapInfoProvider implements TransitiveInfoProvider { + private HeaderMapInfo info; + + public HeaderMapInfo getInfo() { + return info; + } + + private HeaderMapInfoProvider(HeaderMapInfo info) { + this.info = info; + } + + /** Builder for HeaderMapInfoProvider */ + public static class Builder { + private HeaderMapInfo info; + + public Builder setHeaderMapInfo(HeaderMapInfo info) { + this.info = info; + return this; + } + + public HeaderMapInfoProvider build() { + return new HeaderMapInfoProvider(this.info); + } + } +} diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java index cd08ee7d1e50e3..5dc0720f3953bb 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java @@ -67,12 +67,17 @@ import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.packages.Info; import com.google.devtools.build.lib.packages.NativeProvider; +import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.rules.apple.AppleToolchain; import com.google.devtools.build.lib.rules.cpp.CcLinkParams; import com.google.devtools.build.lib.rules.cpp.CcLinkParamsInfo; import com.google.devtools.build.lib.rules.cpp.CppCompilationContext; import com.google.devtools.build.lib.rules.cpp.CppFileTypes; import com.google.devtools.build.lib.rules.cpp.CppModuleMap; +import com.google.devtools.build.lib.rules.cpp.HeaderMapAction; +import com.google.devtools.build.lib.rules.cpp.HeaderMapInfo; +import com.google.devtools.build.lib.rules.cpp.HeaderMapInfoProvider; +import com.google.devtools.build.lib.syntax.Type; import com.google.devtools.build.lib.util.FileType; import com.google.devtools.build.lib.util.FileTypeSet; import com.google.devtools.build.lib.util.Preconditions; @@ -80,6 +85,9 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.HashMap; +import java.util.Map; +import com.google.devtools.build.lib.actions.Root; /** * Contains information common to multiple objc_* rules, and provides a unified API for extracting @@ -154,6 +162,7 @@ static class Builder { private Iterable dynamicFrameworkImports = ImmutableList.of(); private Optional compilationArtifacts = Optional.absent(); private Iterable depObjcProviders = ImmutableList.of(); + private Iterable headerMapInfoProviders = ImmutableList.of(); private Iterable directDepObjcProviders = ImmutableList.of(); private Iterable runtimeDepObjcProviders = ImmutableList.of(); private Iterable defines = ImmutableList.of(); @@ -358,6 +367,30 @@ Builder setAlwayslink(boolean alwayslink) { return this; } + public HeaderMapInfoProvider getHeaderMapInfoProvider(RuleContext ruleContext, ImmutableListhdrs){ + HeaderMapInfo.Builder headerMapInfo = new HeaderMapInfo.Builder(); + String namespace; + if (ruleContext.attributes().has("header_namespace")) { + namespace = ruleContext.attributes().get("header_namespace", Type.STRING); + } else { + namespace = ruleContext.getRule().getName(); + } + + headerMapInfo.setNamespace(namespace); + headerMapInfo.addHeaders(hdrs); + headerMapInfo.addNamespacedHeaders(hdrs); + + if (ruleContext.attributes().has("deps")){ + // Propagate all of the dep sources + for (HeaderMapInfoProvider hmapProvider : ruleContext.getPrerequisites("deps", Mode.TARGET, HeaderMapInfoProvider.class)) { + headerMapInfo.mergeHeaderMapInfo(hmapProvider.getInfo()); + } + } + return new HeaderMapInfoProvider.Builder() + .setHeaderMapInfo(headerMapInfo.build()).build(); + } + + /** * Specifies that this target has a clang module map. This should be called if this target * compiles sources or exposes headers for other targets to use. Note that this does not add @@ -404,6 +437,7 @@ Builder setLinkmapFile(Artifact linkmapFile) { ObjcCommon build() { Iterable bundleImports = BundleableFile.bundleImportsFromRule(context); + ImmutableList.Builder headerMapHeaders = ImmutableList.builder(); ObjcProvider.Builder objcProvider = new ObjcProvider.Builder() @@ -435,6 +469,8 @@ ObjcCommon build() { for (CppCompilationContext headerProvider : depCcHeaderProviders) { objcProvider.addAll(HEADER, filterFileset(headerProvider.getDeclaredIncludeSrcs())); + headerMapHeaders.addAll(filterFileset(headerProvider.getDeclaredIncludeSrcs())); + objcProvider.addAll(INCLUDE, headerProvider.getIncludeDirs()); // TODO(bazel-team): This pulls in stl via CppHelper.mergeToolchainDependentContext but // probably shouldn't. @@ -471,6 +507,9 @@ ObjcCommon build() { AppleToolchain.sdkDir() + "/usr/include/", PathFragment.safePathStrings(attributes.sdkIncludes())), PathFragment::create); + + headerMapHeaders.addAll(filterFileset(attributes.hdrs())); + headerMapHeaders.addAll(filterFileset(attributes.textualHdrs())); objcProvider .addAll(HEADER, filterFileset(attributes.hdrs())) .addAll(HEADER, filterFileset(attributes.textualHdrs())) @@ -513,6 +552,7 @@ ObjcCommon build() { Iterables.concat(artifacts.getSrcs(), artifacts.getNonArcSrcs()); // TODO(bazel-team): Add private headers to the provider when we have module maps to enforce // them. + headerMapHeaders.addAll(artifacts.getPrivateHdrs()); objcProvider .addAll(HEADER, filterFileset(artifacts.getAdditionalHdrs())) .addAll(LIBRARY, artifacts.getArchive().asSet()) @@ -573,7 +613,7 @@ ObjcCommon build() { .add(DEBUG_SYMBOLS_PLIST, intermediateArtifacts.dsymPlist(dsymOutputType)); } - return new ObjcCommon(objcProvider.build(), compilationArtifacts); + return new ObjcCommon(objcProvider.build(), getHeaderMapInfoProvider(context, headerMapHeaders.build()), compilationArtifacts); } private static boolean isCcLibrary(TransitiveInfoCollection info) { @@ -610,12 +650,14 @@ private static boolean useLaunchStoryboard(RuleContext ruleContext) { public static final FileType FRAMEWORK_CONTAINER_TYPE = FileType.of(".framework"); private final ObjcProvider objcProvider; + private final HeaderMapInfoProvider headerMapInfoProvider; private final Optional compilationArtifacts; private ObjcCommon( - ObjcProvider objcProvider, Optional compilationArtifacts) { + ObjcProvider objcProvider, HeaderMapInfoProvider headerMapInfoProvider, Optional compilationArtifacts) { this.objcProvider = Preconditions.checkNotNull(objcProvider); + this.headerMapInfoProvider = headerMapInfoProvider; this.compilationArtifacts = Preconditions.checkNotNull(compilationArtifacts); } @@ -623,6 +665,10 @@ public ObjcProvider getObjcProvider() { return objcProvider; } + public HeaderMapInfoProvider getHeaderMapInfoProvider() { + return headerMapInfoProvider; + } + public Optional getCompilationArtifacts() { return compilationArtifacts; } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java index bb7429f0192acc..cdc448e541439f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java @@ -23,6 +23,7 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.rules.cpp.CcLinkParamsInfo; +import com.google.devtools.build.lib.rules.cpp.HeaderMapInfoProvider; import com.google.devtools.build.lib.rules.objc.ObjcCommon.ResourceAttributes; import com.google.devtools.build.lib.syntax.Type; import java.util.Map; @@ -91,6 +92,7 @@ public ConfiguredTarget create(RuleContext ruleContext) return ObjcRuleClasses.ruleConfiguredTarget(ruleContext, filesToBuild.build()) .addNativeDeclaredProvider(common.getObjcProvider()) + .addProvider(common.getHeaderMapInfoProvider()) .addProvider(J2ObjcEntryClassProvider.class, j2ObjcEntryClassProvider) .addProvider(J2ObjcMappingFileProvider.class, j2ObjcMappingFileProvider) .addProvider( diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java index dded003b2f286a..996cb3d7aa1d5a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java @@ -492,6 +492,8 @@ However, if they appear to be localized (i.e. are contained in a .direct_compile_time_input() .allowedRuleClasses("objc_bundle", "objc_bundle_library") .allowedFileTypes()) + //TODO: @jerry docs + .add(attr("header_namespace", Type.STRING)) .build(); } @Override