aboutsummaryrefslogtreecommitdiffstats
path: root/build/external/packages.mk
blob: 005c2a958b2e159a945196560d1e9ac5fd324e55 (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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# Copyright (c) 2018 Cisco and/or its affiliates.
# 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.

define h1
	@echo "--- $(1)"
endef

define package
$1_tarball_strip_dirs ?= 0
$1_src_dir ?= $(B)/src-$1
$1_patch_dir ?= $(CURDIR)/patches/$1_$($1_version)
$1_build_dir ?= $(B)/build-$1
$1_install_dir ?= $(I)
$1_config_log ?= $(B)/$1.config.log
$1_build_log ?= $(B)/$1.build.log
$1_install_log ?= $(B)/$1.install.log

##############################################################################
# Download
##############################################################################
downloads/$($1_tarball):
	mkdir -p downloads
	@if [ -e $(DL_CACHE_DIR)/$($1_tarball) ] ; \
		then cp $(DL_CACHE_DIR)/$($1_tarball) $$@ ; \
	else \
		echo "Downloading $($1_url)" ; \
		curl -o $$@ -LO $($1_url) ; \
	fi
	@rm -f $(B)/.$1.download.ok

$(B)/.$1.download.ok: downloads/$($1_tarball)
	@mkdir -p $(B)
	$$(call h1,"validating $1 $($1_version) checksum")
	@SUM=$$(shell openssl md5 $$< | cut -f 2 -d " " -) ; \
	([ "$$$${SUM}" = "$($1_tarball_md5sum)" ] || \
	( echo "==========================================================" && \
	  echo "Bad Checksum!" && \
	  echo "Expected:   $($1_tarball_md5sum)" && \
	  echo "Calculated: $$$${SUM}" && \
	  echo "Please remove $$< and retry" && \
	  echo "==========================================================" && \
	  false ))
	@touch $$@

.PHONY: $1-download
$1-download: $(B)/.$1.download.ok

##############################################################################
# Extract
##############################################################################
$(B)/.$1.extract.ok: $(B)/.$1.download.ok
	$$(call h1,"extracting $1 $($1_version)")
	@mkdir -p $$($1_src_dir)
	@tar \
	  --directory $$($1_src_dir) \
	  --extract \
	  --strip-components=$$($1_tarball_strip_dirs) \
	  --file downloads/$($1_tarball)
	@touch $$@

.PHONY: $1-extract
$1-extract: $(B)/.$1.extract.ok

##############################################################################
# Patch
##############################################################################
$(B)/.$1.patch.ok: $(B)/.$1.extract.ok
	$$(call h1,"patching $1 $($1_version)")
ifneq ($$(wildcard $$($1_patch_dir)/*.patch),)
	@for f in $$($1_patch_dir)/*.patch ; do \
		echo "Applying patch: $$$$(basename $$$$f)" ; \
		patch -p1 -d $$($1_src_dir) < $$$$f ; \
	done
endif
	@touch $$@

.PHONY: $1-patch
$1-patch: $(B)/.$1.patch.ok

##############################################################################
# Config
##############################################################################

ifeq ($$(call $1_config_cmds),)
define $1_config_cmds
	@cd $$($1_build_dir) && \
	  CFLAGS="$$($1_cflags)" \
	  $$($1_src_dir)/configure \
	    --prefix=$$($1_install_dir) \
	    $$($1_configure_args) > $$($1_config_log)
endef
endif

$(B)/.$1.config.ok: $(B)/.$1.patch.ok $(addsuffix -install,$($1_depends))
	$$(call h1,"configuring $1 $($1_version) - log: $$($1_config_log)")
	@mkdir -p $$($1_build_dir)
	$$(call $1_config_cmds)
	@touch $$@

.PHONY: $1-config
$1-config: $(B)/.$1.config.ok

##############################################################################
# Build
##############################################################################

ifeq ($$(call $1_build_cmds),)
define $1_build_cmds
	@$(MAKE) $(MAKE_ARGS) -C $$($1_build_dir) > $$($1_build_log)
endef
endif

$(B)/.$1.build.ok: $(B)/.$1.config.ok
	$$(call h1,"building $1 $($1_version) - log: $$($1_build_log)")
	$$(call $1_build_cmds)
	@touch $$@

.PHONY: $1-build
$1-build: $(B)/.$1.build.ok

##############################################################################
# Install
##############################################################################

ifeq ($$(call $1_install_cmds),)
define $1_install_cmds
	@$(MAKE) $(MAKE_ARGS) -C $$($1_build_dir) install > $$($1_install_log)
endef
endif

$(B)/.$1.install.ok: $(B)/.$1.build.ok
	$$(call h1,"installing $1 $($1_version) - log: $$($1_install_log)")
	$$(call $1_install_cmds)
	@touch $$@

.PHONY: $1-install
$1-install: $(B)/.$1.install.ok

ALL_TARGETS += $1-install
endef
ointer @param index - (u32) index of the counter to clear */ always_inline void vlib_zero_simple_counter (vlib_simple_counter_main_t * cm, u32 index) { counter_t *my_counters; int i; ASSERT (index < vlib_simple_counter_n_counters (cm)); for (i = 0; i < vec_len (cm->counters); i++) { my_counters = cm->counters[i]; my_counters[index] = 0; } } /** Add two combined counters, results in the first counter @param [in,out] a - (vlib_counter_t *) dst counter @param b - (vlib_counter_t *) src counter */ always_inline void vlib_counter_add (vlib_counter_t * a, vlib_counter_t * b) { a->packets += b->packets; a->bytes += b->bytes; } /** Subtract combined counters, results in the first counter @param [in,out] a - (vlib_counter_t *) dst counter @param b - (vlib_counter_t *) src counter */ always_inline void vlib_counter_sub (vlib_counter_t * a, vlib_counter_t * b) { ASSERT (a->packets >= b->packets); ASSERT (a->bytes >= b->bytes); a->packets -= b->packets; a->bytes -= b->bytes; } /** Clear a combined counter @param a - (vlib_counter_t *) counter to clear */ always_inline void vlib_counter_zero (vlib_counter_t * a) { a->packets = a->bytes = 0; } /** A collection of combined counters */ typedef struct { vlib_counter_t **counters; /**< Per-thread u64 non-atomic counter pairs */ vlib_counter_t *value_at_last_serialize; /**< Counter values as of last serialize. */ u32 last_incremental_serialize_index; /**< Last counter index serialized incrementally. */ char *name; /**< The counter collection's name. */ char *stat_segment_name; /**< Name in stat segment directory */ } vlib_combined_counter_main_t; /** The number of counters (not the number of per-thread counters) */ u32 vlib_combined_counter_n_counters (const vlib_combined_counter_main_t * cm); /** Clear a collection of simple counters @param cm - (vlib_simple_counter_main_t *) collection to clear */ void vlib_clear_simple_counters (vlib_simple_counter_main_t * cm); /** Clear a collection of combined counters @param cm - (vlib_combined_counter_main_t *) collection to clear */ void vlib_clear_combined_counters (vlib_combined_counter_main_t * cm); /** Increment a combined counter @param cm - (vlib_combined_counter_main_t *) comined counter main pointer @param thread_index - (u32) the current cpu index @param index - (u32) index of the counter to increment @param packet_increment - (u64) number of packets to add to the counter @param byte_increment - (u64) number of bytes to add to the counter */ always_inline void vlib_increment_combined_counter (vlib_combined_counter_main_t * cm, u32 thread_index, u32 index, u64 n_packets, u64 n_bytes) { vlib_counter_t *my_counters; /* Use this CPU's counter array */ my_counters = cm->counters[thread_index]; my_counters[index].packets += n_packets; my_counters[index].bytes += n_bytes; } /** Pre-fetch a per-thread combined counter for the given object index */ always_inline void vlib_prefetch_combined_counter (const vlib_combined_counter_main_t * cm, u32 thread_index, u32 index) { vlib_counter_t *cpu_counters; /* * This CPU's index is assumed to already be in cache */ cpu_counters = cm->counters[thread_index]; CLIB_PREFETCH (cpu_counters + index, CLIB_CACHE_LINE_BYTES, STORE); } /** Get the value of a combined counter, never called in the speed path Scrapes the entire set of per-thread counters. Innacurate unless worker threads which might increment the counter are barrier-synchronized @param cm - (vlib_combined_counter_main_t *) combined counter main pointer @param index - (u32) index of the combined counter to fetch @param result [out] - (vlib_counter_t *) result stored here */ static inline void vlib_get_combined_counter (const vlib_combined_counter_main_t * cm, u32 index, vlib_counter_t * result) { vlib_counter_t *my_counters, *counter; int i; result->packets = 0; result->bytes = 0; for (i = 0; i < vec_len (cm->counters); i++) { my_counters = cm->counters[i]; counter = vec_elt_at_index (my_counters, index); result->packets += counter->packets; result->bytes += counter->bytes; } } /** Clear a combined counter Clears the set of per-thread counters. @param cm - (vlib_combined_counter_main_t *) combined counter main pointer @param index - (u32) index of the counter to clear */ always_inline void vlib_zero_combined_counter (vlib_combined_counter_main_t * cm, u32 index) { vlib_counter_t *my_counters, *counter; int i; for (i = 0; i < vec_len (cm->counters); i++) { my_counters = cm->counters[i]; counter = vec_elt_at_index (my_counters, index); counter->packets = 0; counter->bytes = 0; } } /** validate a simple counter @param cm - (vlib_simple_counter_main_t *) pointer to the counter collection @param index - (u32) index of the counter to validate */ void vlib_validate_simple_counter (vlib_simple_counter_main_t * cm, u32 index); /** validate a combined counter @param cm - (vlib_combined_counter_main_t *) pointer to the counter collection @param index - (u32) index of the counter to validate */ void vlib_validate_combined_counter (vlib_combined_counter_main_t * cm, u32 index); /** Obtain the number of simple or combined counters allocated. A macro which reduces to to vec_len(cm->maxi), the answer in either case. @param cm - (vlib_simple_counter_main_t) or (vlib_combined_counter_main_t) the counter collection to interrogate @returns vec_len(cm->maxi) */ #define vlib_counter_len(cm) vec_len((cm)->maxi) serialize_function_t serialize_vlib_simple_counter_main, unserialize_vlib_simple_counter_main; serialize_function_t serialize_vlib_combined_counter_main, unserialize_vlib_combined_counter_main; #endif /* included_vlib_counter_h */ /* * fd.io coding-style-patch-verification: ON * * Local Variables: * eval: (c-set-style "gnu") * End: */