aboutsummaryrefslogtreecommitdiff
path: root/libbuild2/recipe.hxx
blob: 7eca34af9db96ce840b29a512ef5210909466947 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// file      : libbuild2/recipe.hxx -*- C++ -*-
// license   : MIT; see accompanying LICENSE file

#ifndef LIBBUILD2_RECIPE_HXX
#define LIBBUILD2_RECIPE_HXX

#include <libbuild2/types.hxx>
#include <libbuild2/forward.hxx>
#include <libbuild2/utility.hxx>

#include <libbuild2/action.hxx>
#include <libbuild2/target-state.hxx>

#include <libbuild2/export.hxx>

namespace build2
{
  // The returned target state is normally changed or unchanged. If there is
  // an error, then the recipe should throw failed rather than returning (this
  // is the only exception that a recipe can throw).
  //
  // The return value of the recipe is used to update the target state. If it
  // is target_state::group then the target's state is the group's state.
  //
  // The recipe may also return postponed in which case the target state is
  // assumed to be unchanged (normally this means a prerequisite was postponed
  // and while the prerequisite will be re-examined via another dependency,
  // this target is done).
  //
  // Note that max size for the "small capture optimization" in std::function
  // ranges (in pointer sizes) from 0 (GCC prior to 5) to 2 (GCC 5) to 6 (VC
  // 14.2). With the size ranging (in bytes for 64-bit target) from 32 (GCC)
  // to 64 (VC).
  //
  using recipe_function = target_state (action, const target&);
  using recipe = function<recipe_function>;

  // Commonly-used recipes.
  //
  // The default recipe executes the action on all the prerequisites in a
  // loop, skipping ignored. Specifically, for actions with the "first"
  // execution mode, it calls execute_prerequisites() while for those with
  // "last" -- reverse_execute_prerequisites() (see <libbuild2/operation.hxx>,
  // <libbuild2/algorithm.hxx> for details). The group recipe calls the
  // group's recipe.
  //
  LIBBUILD2_SYMEXPORT extern const recipe empty_recipe;
  LIBBUILD2_SYMEXPORT extern const recipe noop_recipe;
  LIBBUILD2_SYMEXPORT extern const recipe default_recipe;
  LIBBUILD2_SYMEXPORT extern const recipe group_recipe;

  // Ad hoc recipe.
  //
  // A recipe is a fragment of a rule so we handle ad hoc recipies by
  // "completing" them to rules.
  //
  using adhoc_actions = small_vector<action, 1>;
  struct adhoc_recipe
  {
    adhoc_actions          actions;
    shared_ptr<adhoc_rule> rule;
  };
}

#endif // LIBBUILD2_RECIPE_HXX