<html devsite>
<head>
  <meta name="project_path" value="/_project.yaml">
  <meta name="book_path" value="/versions/6.3.0/_book.yaml">
</head>
<body>

<h1 class="page-title" id="modules.CompilationContext">CompilationContext</h1>

<!-- {% raw %} -->

Immutable store of information needed for C++ compilation that is aggregated across dependencies.

<h2>Members</h2>
<ul>
    <li>
    <a href="#defines">defines</a>
  </li>
      <li>
    <a href="#direct_headers">direct_headers</a>
  </li>
      <li>
    <a href="#direct_private_headers">direct_private_headers</a>
  </li>
      <li>
    <a href="#direct_public_headers">direct_public_headers</a>
  </li>
      <li>
    <a href="#direct_textual_headers">direct_textual_headers</a>
  </li>
      <li>
    <a href="#framework_includes">framework_includes</a>
  </li>
      <li>
    <a href="#headers">headers</a>
  </li>
      <li>
    <a href="#includes">includes</a>
  </li>
      <li>
    <a href="#local_defines">local_defines</a>
  </li>
      <li>
    <a href="#quote_includes">quote_includes</a>
  </li>
      <li>
    <a href="#system_includes">system_includes</a>
  </li>
      <li>
    <a href="#validation_artifacts">validation_artifacts</a>
  </li>
  </ul>

      <h2 id="defines">defines</h2>
        <p><pre class="rule-signature"><a class="anchor" href="depset.html">depset</a> CompilationContext.defines</pre></p>

    Returns the set of defines needed to compile this target. Each define is a string. These values are propagated to the target's transitive dependents, that is, any rules that depend on this target.


        <h2 id="direct_headers">direct_headers</h2>
        <p><pre class="rule-signature"><a class="anchor" href="list.html">list</a> CompilationContext.direct_headers</pre></p>

    Returns the list of modular headers that are declared by this target. This includes both public headers (such as those listed in "hdrs") and private headers (such as those listed in "srcs").


        <h2 id="direct_private_headers">direct_private_headers</h2>
        <p><pre class="rule-signature"><a class="anchor" href="list.html">list</a> CompilationContext.direct_private_headers</pre></p>

    Returns the list of modular private headers (those listed in "srcs") that are declared by this target.


        <h2 id="direct_public_headers">direct_public_headers</h2>
        <p><pre class="rule-signature"><a class="anchor" href="list.html">list</a> CompilationContext.direct_public_headers</pre></p>

    Returns the list of modular public headers (those listed in "hdrs") that are declared by this target.


        <h2 id="direct_textual_headers">direct_textual_headers</h2>
        <p><pre class="rule-signature"><a class="anchor" href="list.html">list</a> CompilationContext.direct_textual_headers</pre></p>

    Returns the list of textual headers that are declared by this target.


        <h2 id="framework_includes">framework_includes</h2>
        <p><pre class="rule-signature"><a class="anchor" href="depset.html">depset</a> CompilationContext.framework_includes</pre></p>

    Returns the set of search paths (as strings) for framework header files. Usually passed with -F.


        <h2 id="headers">headers</h2>
        <p><pre class="rule-signature"><a class="anchor" href="depset.html">depset</a> CompilationContext.headers</pre></p>

    Returns the set of headers needed to compile this target.


        <h2 id="includes">includes</h2>
        <p><pre class="rule-signature"><a class="anchor" href="depset.html">depset</a> CompilationContext.includes</pre></p>

    Returns the set of search paths (as strings) for header files referenced both by angle bracket and quotes. Usually passed with -I.


        <h2 id="local_defines">local_defines</h2>
        <p><pre class="rule-signature"><a class="anchor" href="depset.html">depset</a> CompilationContext.local_defines</pre></p>

    Returns the set of defines needed to compile this target. Each define is a string. These values are not propagated to the target's transitive dependents.


        <h2 id="quote_includes">quote_includes</h2>
        <p><pre class="rule-signature"><a class="anchor" href="depset.html">depset</a> CompilationContext.quote_includes</pre></p>

    Returns the set of search paths (as strings) for header files referenced by quotes, e.g. #include "foo/bar/header.h". They can be either relative to the exec root or absolute. Usually passed with -iquote.


        <h2 id="system_includes">system_includes</h2>
        <p><pre class="rule-signature"><a class="anchor" href="depset.html">depset</a> CompilationContext.system_includes</pre></p>

    Returns the set of search paths (as strings) for header files referenced by angle brackets, e.g. #include &lt;foo/bar/header.h&gt;. They can be either relative to the exec root or absolute. Usually passed with -isystem.


        <h2 id="validation_artifacts">validation_artifacts</h2>
        <p><pre class="rule-signature"><a class="anchor" href="depset.html">depset</a> CompilationContext.validation_artifacts</pre></p>

    Returns the set of validation artifacts.



</body>
</html>

<!-- {% endraw %} -->
