diff options
author | 2016-08-17 19:11:59 +0000 | |
---|---|---|
committer | 2016-08-18 08:31:02 +0000 | |
commit | 6f3e05cb3acaa9a2f15ae3a8e9ab626263d2aff6 (patch) | |
tree | 5592dc3a208d8ce27e0b5775b36ad0d965180aaf /src/main/java/com/google/devtools/build/lib/rules/objc/ObjcVariablesExtension.java | |
parent | 4e9be54b134165e8df51b749f78a66bd592944a6 (diff) |
Implement the fully link action in the OSX crosstool.
--
MOS_MIGRATED_REVID=130547971
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/objc/ObjcVariablesExtension.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/objc/ObjcVariablesExtension.java | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcVariablesExtension.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcVariablesExtension.java new file mode 100644 index 0000000000..70fc868af9 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcVariablesExtension.java @@ -0,0 +1,155 @@ +// Copyright 2016 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.devtools.build.lib.rules.objc; + +import static com.google.devtools.build.lib.rules.objc.ObjcProvider.IMPORTED_LIBRARY; + +import com.google.common.collect.ImmutableList; +import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; +import com.google.devtools.build.lib.analysis.RuleContext; +import com.google.devtools.build.lib.analysis.config.BuildConfiguration; +import com.google.devtools.build.lib.rules.apple.AppleConfiguration; +import com.google.devtools.build.lib.rules.apple.Platform; +import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures; +import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Variables.ValueSequence; +import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Variables.VariablesExtension; + +/** Build variable extensions for templating a toolchain for objc builds. */ +class ObjcVariablesExtension implements VariablesExtension { + + static final String PCH_FILE_VARIABLE_NAME = "pch_file"; + static final String FRAMEWORKS_VARIABLE_NAME = "framework_paths"; + static final String VERSION_MIN_VARIABLE_NAME = "version_min"; + static final String MODULES_MAPS_DIR_NAME = "module_maps_dir"; + static final String OBJC_MODULE_CACHE_DIR_NAME = "_objc_module_cache"; + static final String OBJC_MODULE_CACHE_KEY = "modules_cache_path"; + static final String OBJ_LIST_PATH_VARIABLE_NAME = "obj_list_path"; + static final String ARCHIVE_PATH_VARIABLE_NAME = "archive_path"; + static final String FULLY_LINKED_ARCHIVE_PATH_VARIABLE_NAME = "fully_linked_archive_path"; + static final String OBJC_LIBRARY_EXEC_PATHS_VARIABLE_NAME = "objc_library_exec_paths"; + static final String CC_LIBRARY_EXEC_PATHS_VARIABLE_NAME = "cc_library_exec_paths"; + static final String IMPORTED_LIBRARY_EXEC_PATHS_VARIABLE_NAME = "imported_library_exec_paths"; + + private final RuleContext ruleContext; + private final ObjcProvider objcProvider; + private final CompilationArtifacts compilationArtifacts; + private final Artifact fullyLinkArchive; + private final IntermediateArtifacts intermediateArtifacts; + + private final BuildConfiguration buildConfiguration; + private final AppleConfiguration appleConfiguration; + private final ObjcConfiguration objcConfiguration; + + public ObjcVariablesExtension( + RuleContext ruleContext, + ObjcProvider objcProvider, + CompilationArtifacts compilationArtifacts, + Artifact fullyLinkArchive, + IntermediateArtifacts intermediateArtifacts, + BuildConfiguration buildConfiguration) { + this.ruleContext = ruleContext; + this.objcProvider = objcProvider; + this.compilationArtifacts = compilationArtifacts; + this.fullyLinkArchive = fullyLinkArchive; + this.intermediateArtifacts = intermediateArtifacts; + this.buildConfiguration = buildConfiguration; + this.objcConfiguration = buildConfiguration.getFragment(ObjcConfiguration.class); + this.appleConfiguration = buildConfiguration.getFragment(AppleConfiguration.class); + } + + @Override + public void addVariables(CcToolchainFeatures.Variables.Builder builder) { + addPchVariables(builder); + addFrameworkVariables(builder); + addArchVariables(builder); + if (ObjcCommon.shouldUseObjcModules(ruleContext)) { + addModuleMapVariables(builder); + } + if (compilationArtifacts.getArchive().isPresent()) { + addArchiveVariables(builder); + } + addFullyLinkArchiveVariables(builder); + } + + private void addPchVariables(CcToolchainFeatures.Variables.Builder builder) { + if (ruleContext.getPrerequisiteArtifact("pch", Mode.TARGET) != null) { + builder.addVariable( + PCH_FILE_VARIABLE_NAME, + ruleContext.getPrerequisiteArtifact("pch", Mode.TARGET).getExecPathString()); + } + } + + private void addFrameworkVariables(CcToolchainFeatures.Variables.Builder builder) { + ValueSequence.Builder frameworkSequence = new ValueSequence.Builder(); + for (String framework : + CompilationSupport.commonFrameworkNames(objcProvider, appleConfiguration)) { + frameworkSequence.addValue(framework); + } + builder.addSequence(FRAMEWORKS_VARIABLE_NAME, frameworkSequence.build()); + } + + private void addModuleMapVariables(CcToolchainFeatures.Variables.Builder builder) { + builder.addVariable( + MODULES_MAPS_DIR_NAME, + intermediateArtifacts + .moduleMap() + .getArtifact() + .getExecPath() + .getParentDirectory() + .toString()); + builder.addVariable( + OBJC_MODULE_CACHE_KEY, + buildConfiguration.getGenfilesFragment() + "/" + OBJC_MODULE_CACHE_DIR_NAME); + } + + private void addArchVariables(CcToolchainFeatures.Variables.Builder builder) { + Platform platform = appleConfiguration.getSingleArchPlatform(); + switch (platform.getType()) { + case IOS: + builder.addVariable(VERSION_MIN_VARIABLE_NAME, objcConfiguration.getMinimumOs().toString()); + break; + case WATCHOS: + builder.addVariable( + VERSION_MIN_VARIABLE_NAME, + appleConfiguration.getSdkVersionForPlatform(platform).toString()); + break; + default: + throw new IllegalArgumentException("Unhandled platform: " + platform); + } + } + + private void addArchiveVariables(CcToolchainFeatures.Variables.Builder builder) { + builder.addVariable( + OBJ_LIST_PATH_VARIABLE_NAME, + ObjcRuleClasses.intermediateArtifacts(ruleContext).archiveObjList().getExecPathString()); + builder.addVariable( + ARCHIVE_PATH_VARIABLE_NAME, compilationArtifacts.getArchive().get().getExecPathString()); + } + + private void addFullyLinkArchiveVariables(CcToolchainFeatures.Variables.Builder builder) { + builder.addVariable( + FULLY_LINKED_ARCHIVE_PATH_VARIABLE_NAME, fullyLinkArchive.getExecPathString()); + builder.addSequenceVariable( + OBJC_LIBRARY_EXEC_PATHS_VARIABLE_NAME, + ImmutableList.copyOf(Artifact.toExecPaths(objcProvider.getObjcLibraries()))); + builder.addSequenceVariable( + CC_LIBRARY_EXEC_PATHS_VARIABLE_NAME, + ImmutableList.copyOf(Artifact.toExecPaths(objcProvider.getCcLibraries()))); + builder.addSequenceVariable( + IMPORTED_LIBRARY_EXEC_PATHS_VARIABLE_NAME, + ImmutableList.copyOf(Artifact.toExecPaths(objcProvider.get(IMPORTED_LIBRARY)))); + } +} |