blob: daae7b6f6792f4c247a759dca2d6e8a7dfeeff20 [file] [log] [blame]
// Copyright 2014 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.cpp;
import static com.google.devtools.build.lib.packages.ImplicitOutputsFunction.fromTemplates;
import static com.google.devtools.build.lib.rules.cpp.CppFileTypes.ALWAYS_LINK_LIBRARY;
import static com.google.devtools.build.lib.rules.cpp.CppFileTypes.ALWAYS_LINK_PIC_LIBRARY;
import static com.google.devtools.build.lib.rules.cpp.CppFileTypes.ARCHIVE;
import static com.google.devtools.build.lib.rules.cpp.CppFileTypes.ASSEMBLER;
import static com.google.devtools.build.lib.rules.cpp.CppFileTypes.ASSEMBLER_WITH_C_PREPROCESSOR;
import static com.google.devtools.build.lib.rules.cpp.CppFileTypes.CPP_HEADER;
import static com.google.devtools.build.lib.rules.cpp.CppFileTypes.CPP_SOURCE;
import static com.google.devtools.build.lib.rules.cpp.CppFileTypes.C_SOURCE;
import static com.google.devtools.build.lib.rules.cpp.CppFileTypes.INTERFACE_SHARED_LIBRARY;
import static com.google.devtools.build.lib.rules.cpp.CppFileTypes.OBJECT_FILE;
import static com.google.devtools.build.lib.rules.cpp.CppFileTypes.PIC_ARCHIVE;
import static com.google.devtools.build.lib.rules.cpp.CppFileTypes.PIC_OBJECT_FILE;
import static com.google.devtools.build.lib.rules.cpp.CppFileTypes.SHARED_LIBRARY;
import static com.google.devtools.build.lib.rules.cpp.CppFileTypes.VERSIONED_SHARED_LIBRARY;
import com.google.devtools.build.lib.analysis.LanguageDependentFragment.LibraryLanguage;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.packages.Attribute.LateBoundLabel;
import com.google.devtools.build.lib.packages.Attribute.Transition;
import com.google.devtools.build.lib.packages.AttributeMap;
import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction;
import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.rules.test.InstrumentedFilesCollector.InstrumentationSpec;
import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.util.FileTypeSet;
import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.LipoMode;
/**
* Rule class definitions for C++ rules.
*/
public class CppRuleClasses {
/** Returns true if this rule should create a dynamic library. */
public static boolean shouldCreateDynamicLibrary(AttributeMap rule) {
return !rule.get("linkstatic", Type.BOOLEAN) && CcLibrary.appearsToHaveObjectFiles(rule);
}
/**
* Implementation for the :lipo_context_collector attribute.
*/
public static final LateBoundLabel<BuildConfiguration> LIPO_CONTEXT_COLLECTOR =
new LateBoundLabel<BuildConfiguration>() {
@Override
public Label resolve(Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
// This attribute connects a target to the LIPO context target configured with the
// lipo input collector configuration.
CppConfiguration cppConfiguration = configuration.getFragment(CppConfiguration.class);
return !cppConfiguration.isLipoContextCollector()
&& (cppConfiguration.getLipoMode() == LipoMode.BINARY)
? cppConfiguration.getLipoContextLabel()
: null;
}
};
/**
* Configuration transitions required by LIPO.
*/
public enum LipoTransition implements Transition {
/**
* LIPO context collector.
*
* <p>This configuration transition leads into a configuration that is used for collecting
* C++ compilation contexts for LIPO builds so that e.g. an include path entry required by an
* inlined function is there when the place is compiled where it is inlined at.
*/
LIPO_COLLECTOR,
/**
* Transition used for switching back to the LIPO-optimized configuration.
*/
TARGET_CONFIG_FOR_LIPO;
@Override
public boolean defaultsToSelf() {
return true;
}
}
// Artifacts of these types are discarded from the 'hdrs' attribute in cc rules
static final FileTypeSet DISALLOWED_HDRS_FILES = FileTypeSet.of(
ARCHIVE,
PIC_ARCHIVE,
ALWAYS_LINK_LIBRARY,
ALWAYS_LINK_PIC_LIBRARY,
SHARED_LIBRARY,
INTERFACE_SHARED_LIBRARY,
VERSIONED_SHARED_LIBRARY,
OBJECT_FILE,
PIC_OBJECT_FILE);
/**
* The set of instrumented source file types; keep this in sync with the list above. Note that
* extension-less header files cannot currently be declared, so we cannot collect coverage for
* those.
*/
static final InstrumentationSpec INSTRUMENTATION_SPEC = new InstrumentationSpec(
FileTypeSet.of(CPP_SOURCE, C_SOURCE, CPP_HEADER, ASSEMBLER_WITH_C_PREPROCESSOR,
ASSEMBLER))
.withSourceAttributes("srcs", "hdrs")
.withDependencyAttributes("deps", "data");
public static final LibraryLanguage LANGUAGE = new LibraryLanguage("C++");
/**
* Implicit outputs for cc_binary rules.
*/
public static final SafeImplicitOutputsFunction CC_BINARY_STRIPPED =
fromTemplates("%{name}.stripped");
// Used for requesting dwp "debug packages".
public static final SafeImplicitOutputsFunction CC_BINARY_DEBUG_PACKAGE =
fromTemplates("%{name}.dwp");
/**
* Path of the build_interface_so script in the Blaze binary.
*/
public static final String BUILD_INTERFACE_SO = "build_interface_so";
/**
* A string constant for the parse_headers feature.
*/
public static final String PARSE_HEADERS = "parse_headers";
/**
* A string constant for the preprocess_headers feature.
*/
public static final String PREPROCESS_HEADERS = "preprocess_headers";
/**
* A string constant for the module_maps feature; this is a precondition to the layering_check and
* header_modules features.
*/
public static final String MODULE_MAPS = "module_maps";
/**
* A string constant for the random_seed feature. This is used by gcc and Clangfor the
* randomization of symbol names that are in the anonymous namespace but have external linkage.
*/
public static final String RANDOM_SEED = "random_seed";
/**
* A string constant for the compile_action_flags_in_flag_set feature. This feature is just a
* transitional feature which helps telling whether -c and -o options are already in flag_set of
* action_config in CROSSTOOL file. Once the transition is done, it should be removed.
*/
public static final String COMPILE_ACTION_FLAGS_IN_FLAG_SET = "compile_action_flags_in_flag_set";
/**
* A string constant for the dependency_file feature. This feature generates the .d file.
*/
public static final String DEPENDENCY_FILE = "dependency_file";
/**
* A string constant for the module_map_home_cwd feature.
*/
public static final String MODULE_MAP_HOME_CWD = "module_map_home_cwd";
/**
* A string constant for the module_map_without_extern_module feature.
*
* <p>This features is a transitional feature; enabling it means that generated module maps
* will not have "extern module" declarations inside them; instead, the module maps need
* to be passed via the dependent_module_map_files build variable.
*
* <p>This variable is phrased negatively to aid the roll-out: currently, the default is that
* "extern module" declarations are generated.
*/
public static final String MODULE_MAP_WITHOUT_EXTERN_MODULE = "module_map_without_extern_module";
/**
* A string constant for the layering_check feature.
*/
public static final String LAYERING_CHECK = "layering_check";
/**
* A string constant for the header_modules feature.
*/
public static final String HEADER_MODULES = "header_modules";
/**
* A string constant for the use_header_modules feature.
*
* <p>This feature is only used during rollout; we expect to default enable this once we
* have verified that module-enabled compilation is stable enough.
*/
public static final String USE_HEADER_MODULES = "use_header_modules";
/**
* A string constant for the generate_submodules feature.
*
* <p>This feature is only used temporarily to make the switch to using submodules easier. With
* submodules, each header of a cc_library is placed into a submodule of the module generated for
* the appropriate target. As this influences the layering_check semantics and needs to be synced
* with a clang release, we want to be able to switch back and forth easily.
*/
public static final String GENERATE_SUBMODULES = "generate_submodules";
/**
* A string constant for the transitive_module_maps feature.
*
* <p>This feature is used temporarily to switch between adding transitive module maps to a
* modules enabled build or only adding module maps from direct dependencies.
*/
public static final String TRANSITIVE_MODULE_MAPS = "transitive_module_maps";
/**
* A string constant for switching on that a header module file includes information about
* all its dependencies, so we do not need to pass all transitive dependent header modules on
* the command line.
*/
public static final String HEADER_MODULE_INCLUDES_DEPENDENCIES =
"header_module_includes_dependencies";
/**
* A string constant for switching on that header modules are pruned based on the results of
* include scanning.
*/
public static final String PRUNE_HEADER_MODULES = "prune_header_modules";
/**
* A string constant for the no_legacy_features feature.
*
* <p>If this feature is enabled, Bazel will not extend the crosstool configuration with the
* default legacy feature set.
*/
public static final String NO_LEGACY_FEATURES = "no_legacy_features";
/**
* A string constant for the feature that makes us build per-object debug info files.
*/
public static final String PER_OBJECT_DEBUG_INFO = "per_object_debug_info";
/**
* A string constant for the PIC feature.
*
* <p>If this feature is active (currently it cannot be switched off) and PIC compilation is
* requested, the "pic" build variable will be defined with an empty string as its value.
*/
public static final String PIC = "pic";
/**
* A string constant for the feature the represents preprocessor defines.
*/
public static final String PREPROCESSOR_DEFINES = "preprocessor_defines";
/**
* A string constant for the include_paths feature.
*/
public static final String INCLUDE_PATHS = "include_paths";
/**
* A string constant for the ThinLTO feature.
*/
public static final String THIN_LTO = "thin_lto";
/*
* A string constant for the fdo_instrument feature.
*/
public static final String FDO_INSTRUMENT = "fdo_instrument";
/**
* A string constant for the fdo_optimize feature.
*/
public static final String FDO_OPTIMIZE = "fdo_optimize";
/**
* A string constant for the autofdo feature.
*/
public static final String AUTOFDO = "autofdo";
/**
* A string constant for the lipo feature.
*/
public static final String LIPO = "lipo";
/**
* A string constant for the coverage feature.
*/
public static final String COVERAGE = "coverage";
/** A string constant for the match-clif feature. */
public static final String MATCH_CLIF = "match_clif";
}