Commit 32c0a939 authored by Matt T. Proud's avatar Matt T. Proud
Browse files

New self-sustaining, hermetic build system.

This should help us produce self-contained artifacts for users as
well as lower the hurdles for first-time contributors.
parent a13bc449
......@@ -22,7 +22,5 @@ _cgo_*
core
*-stamp
leveldb-1.7.0*
protobuf-2.4.1*
snappy-1.0.5*
prometheus.build
prometheus
......@@ -5,5 +5,4 @@ before_script:
- gvm use go1.0.3 || true
script:
- make -f Makefile.TRAVIS
- make
......@@ -11,22 +11,25 @@
# See the License for the specific language governing permissions and
# limitations under the License.
.SUFFIXES:
TEST_ARTIFACTS = prometheus prometheus.build search_index
all: test
include Makefile.INCLUDE
test: build
go test ./... $(GO_TEST_FLAGS)
all: test
build:
$(MAKE) -C model
$(MAKE) -C web
go build ./...
advice:
go tool vet .
binary: build
go build -o prometheus.build
build: preparation model web
go build .
clean:
$(MAKE) -C build clean
$(MAKE) -C model clean
$(MAKE) -C web clean
rm -rf $(TEST_ARTIFACTS)
......@@ -34,16 +37,46 @@ clean:
-find . -type f -iname '*#' -exec rm '{}' ';'
-find . -type f -iname '.#*' -exec rm '{}' ';'
documentation: search_index
godoc -http=:6060 -index -index_files='search_index'
format:
find . -iname '*.go' | egrep -v "generated|\.(l|y)\.go" | xargs -n1 gofmt -w -s=true
advice:
go tool vet .
model: preparation
$(MAKE) -C model
package: binary
cp prometheus.build build/package/prometheus
rsync -av build/root/lib/ build/package/lib/
preparation: source_path
$(MAKE) -C build
run: binary
./prometheus.build $(ARGUMENTS)
search_index:
godoc -index -write_index -index_files='search_index'
documentation: search_index
godoc -http=:6060 -index -index_files='search_index'
# source_path is responsible for ensuring that the builder has not done anything
# stupid like working on Prometheus outside of ${GOPATH}.
source_path:
-[ -d "$(FULL_GOPATH)" ] || { mkdir -vp $(FULL_GOPATH_BASE) ; ln -s "$(PWD)" "$(FULL_GOPATH)" ; }
[ -d "$(FULL_GOPATH)" ]
test: build
go test ./appstate/... $(GO_TEST_FLAGS)
go test ./coding/... $(GO_TEST_FLAGS)
go test ./config/... $(GO_TEST_FLAGS)
go test ./model/... $(GO_TEST_FLAGS)
go test ./retrieval/... $(GO_TEST_FLAGS)
go test ./rules/... $(GO_TEST_FLAGS)
go test ./storage/... $(GO_TEST_FLAGS)
go test ./utility/... $(GO_TEST_FLAGS)
go test ./web/... $(GO_TEST_FLAGS)
web: preparation
$(MAKE) -C web
.PHONY: advice binary build clean documentation format search_index test
.PHONY: advice binary build clean documentation format model package preparation run search_index source_path test
# Copyright 2013 Prometheus Team
# 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.
.SUFFIXES:
# Set this to "false" to provide verbose builds of third-party components,
# namely C and C++ dependencies.
export SILENCE_THIRD_PARTY_BUILDS := true
ifeq ($(SILENCE_THIRD_PARTY_BUILDS), true)
export THIRD_PARTY_BUILD_OUTPUT := >/dev/null 2>&1
else
export THIRD_PARTY_BUILD_OUTPUT :=
endif
GO_VERSION := 1.0.3
LEVELDB_VERSION := 1.7.0
PROTOCOL_BUFFERS_VERSION := 2.4.1
SNAPPY_VERSION := 1.0.5
UNAME := $(shell uname)
FIRST_GOPATH := $(shell echo $${GOPATH} | awk -F':' '{ print $$1 }')
FULL_GOPATH := $(FIRST_GOPATH)/src/github.com/prometheus/prometheus
FULL_GOPATH_BASE := $(FIRST_GOPATH)/src/github.com/prometheus
export PREFIX=$(PWD)/build/root
export PATH := $(PREFIX)/bin:$(GOPATH)/bin:$(PATH)
export LD_LIBRARY_PATH := $(PREFIX)/lib:$(LD_LIBRARY_PATH)
export CFLAGS := $(CFLAGS) -I$(PREFIX)/include
export CXXFLAGS := $(CXXFLAGS) -I$(PREFIX)/include
export CPPFLAGS := $(CPPFLAGS) -I$(PREFIX)/include
export LDFLAGS := $(LDFLAGS) -L$(PREFIX)/lib
export PKG_CONFIG_PATH := $(PREFIX)/lib/pkgconfig:$(PKG_CONFIG_PATH)
export GO_TEST_FLAGS := "-v"
GO_GET := go get -u -v -x
APT_GET_INSTALL := sudo apt-get install -y
BREW_INSTALL := brew install
# By default, wget sets the creation time to match the server's, which throws
# off Make. :-(
WGET := wget --no-use-server-timestamps -c
# Copyright 2013 Prometheus Team
# 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.
GO_VERSION := 1.0.3
LEVELDB_VERSION := 1.7.0
PROTOCOL_BUFFERS_VERSION := 2.4.1
SNAPPY_VERSION := 1.0.5
OVERLAY_ROOT := ${HOME}/overlay_root
export PATH := $(PATH):$(OVERLAY_ROOT)/bin
export LD_LIBRARY_PATH := $(LD_LIBRARY_PATH):$(OVERLAY_ROOT)/lib
export CFLAGS := $(CFLAGS) -I$(OVERLAY_ROOT)/include
export CXXFLAGS := $(CXXFLAGS) -I$(OVERLAY_ROOT)/include
export CPPFLAGS := $(CPPFLAGS) -I$(OVERLAY_ROOT)/include
export LDFLAGS := $(LDFLAGS) -L$(OVERLAY_ROOT)/lib
export CGO_CFLAGS := $(CFLAGS) -lsnappy
export CGO_LDFLAGS := $(LDFLAGS)
export GO_TEST_FLAGS := "-v"
GO_GET := go get -u -v -x
APT_GET_INSTALL := sudo apt-get install -y
WGET := wget -c
all: test
preparation: preparation-stamp
preparation-stamp: build-dependencies
touch $@
build-dependencies: build-dependencies-stamp
build-dependencies-stamp: bison cc go goprotobuf gorest goskiplist instrumentation leveldb levigo mercurial protoc
touch $@
overlay: overlay-stamp
overlay-stamp:
[ -d "$(OVERLAY_ROOT)" ] || mkdir -vp $(OVERLAY_ROOT)
touch $@
bison: bison-stamp
bison-stamp:
[ -x "$$(which bison)" ] || $(APT_GET_INSTALL) bison
cc: cc-stamp
cc-stamp:
[ -x "$$(which cc)" ] || $(APT_GET_INSTALL) build-essential
touch $@
go: go-stamp
go-stamp: bison
gvm install go$(GO_VERSION) || true
gvm use go$(GO_VERSION) || true
[ -x "$$(which go)" ]
touch $@
mercurial: mercurial-stamp
mercurial-stamp:
[ -x "$$(which hg)" ] || $(APT_GET_INSTALL) mercurial
touch $@
wget: wget-stamp
wget-stamp:
[ -x "$$(which wget)" ] || $(APT_GET_INSTALL) wget
touch $@
protobuf-$(PROTOCOL_BUFFERS_VERSION).tar.bz2: wget
$(WGET) http://protobuf.googlecode.com/files/$@
protoc: protoc-stamp
protoc-stamp: cc protobuf-$(PROTOCOL_BUFFERS_VERSION).tar.bz2 overlay
([ ! -x "$$(which protoc)" ] && tar xjvf protobuf-$(PROTOCOL_BUFFERS_VERSION).tar.bz2) || true
([ ! -x "$$(which protoc)" ] && cd protobuf-$(PROTOCOL_BUFFERS_VERSION) && ./configure --prefix="$(OVERLAY_ROOT)") || true
([ ! -x "$$(which protoc)" ] && $(MAKE) -C protobuf-$(PROTOCOL_BUFFERS_VERSION)) || true
([ ! -x "$$(which protoc)" ] && $(MAKE) -C protobuf-$(PROTOCOL_BUFFERS_VERSION) install) || true
[ -x "$$(which protoc)" ]
touch $@
gorest: gorest-stamp
gorest-stamp: go source
$(GO_GET) code.google.com/p/gorest
touch $@
goprotobuf: goprotobuf-stamp
goprotobuf-stamp: go protoc source
$(GO_GET) code.google.com/p/goprotobuf/proto
$(GO_GET) code.google.com/p/goprotobuf/protoc-gen-go
touch $@
instrumentation: instrumentation-stamp
instrumentation-stamp: go source
$(GO_GET) github.com/prometheus/client_golang
touch $@
leveldb: leveldb-stamp
leveldb-stamp: cc rsync leveldb-$(LEVELDB_VERSION).tar.gz snappy overlay
tar xzvf leveldb-$(LEVELDB_VERSION).tar.gz
$(MAKE) -C leveldb-$(LEVELDB_VERSION)
rsync -av "leveldb-$(LEVELDB_VERSION)/include/" "$(OVERLAY_ROOT)/include/"
-rsync -av "leveldb-$(LEVELDB_VERSION)/"*.*so* "$(OVERLAY_ROOT)/lib/"
-rsync -av "leveldb-$(LEVELDB_VERSION)/"*.*dylib* "$(OVERLAY_ROOT)/lib/"
rsync -av "leveldb-$(LEVELDB_VERSION)/"*.a "$(OVERLAY_ROOT)/lib/"
touch $@
leveldb-$(LEVELDB_VERSION).tar.gz: wget
$(WGET) http://leveldb.googlecode.com/files/leveldb-$(LEVELDB_VERSION).tar.gz
levigo: levigo-stamp
levigo-stamp: leveldb go snappy source
$(GO_GET) github.com/jmhodges/levigo
touch $@
goskiplist: goskiplist-stamp
goskiplist-stamp: go source
$(GO_GET) github.com/ryszard/goskiplist/skiplist
touch $@
rsync: rsync-stamp
rsync-stamp:
[ -x "$$(which rsync)" ] || $(APT_GET_INSTALL) rsync
vim-common: vim-common-stamp
vim-common-stamp:
$(APT_GET_INSTALL) vim-common
touch $@
test: test-stamp
test-stamp: preparation source
cd ${GOPATH}/src/github.com/prometheus
$(MAKE) build
$(MAKE) test
touch $@
snappy-$(SNAPPY_VERSION).tar.gz: wget
$(WGET) http://snappy.googlecode.com/files/snappy-$(SNAPPY_VERSION).tar.gz
tar xzvf snappy-$(SNAPPY_VERSION).tar.gz
cd snappy-$(SNAPPY_VERSION) && ./configure --prefix="$(OVERLAY_ROOT)"
$(MAKE) -C snappy-$(SNAPPY_VERSION)
$(MAKE) -C snappy-$(SNAPPY_VERSION) install
snappy: snappy-stamp
tar xzvf snappy-$(SNAPPY_VERSION).tar.gz
snappy-stamp: cc overlay rsync snappy-$(SNAPPY_VERSION).tar.gz
touch $@
source: source-stamp
source-stamp:
-mkdir -vp ${GOPATH}/src/github.com/prometheus
ln -sf $${PWD} ${GOPATH}/src/github.com/prometheus/prometheus
touch $@
clean:
-rm *-stamp
-rm -rf "$(OVERLAY_ROOT)"
-rm -rf leveldb-$(LEVELDB_VERSION)
-rm -rf protobuf-$(PROTOCOL_BUFFERS_VERSION)
-rm -rf snappy-$(SNAPPY_VERSION)
-rm leveldb-$(LEVELDB_VERSION).tar.gz
-rm protobuf-$(PROTOCOL_BUFFERS_VERSION).tar.bz2
-rm snappy-$(SNAPPY_VERSION).tar.gz
.PHONY: all bison build-dependencies cc clean go goprotobuf gorest instrumentation leveldb levigo mercurial overlay preparation protoc rsync snappy source test wget vim-common
......@@ -14,29 +14,121 @@ intervals, evaluate rule expressions, display the results, and trigger an
action if some condition is observed to be true.
## Prerequisites
If you read below in the _Getting Started_ section, the build infrastructure
will take care of the following things for you in most cases:
1. Go 1.0.X. [GVM](https://github.com/moovweb/gvm) is highly recommended as well.
2. LevelDB: (https://code.google.com/p/leveldb/).
3. Protocol Buffers Compiler: (http://code.google.com/p/protobuf/).
4. goprotobuf: the code generator and runtime library: (http://code.google.com/p/goprotobuf/).
5. Levigo, a Go-wrapper around LevelDB's C library: (https://github.com/jmhodges/levigo).
6. GoRest, a RESTful style web-services framework: (http://code.google.com/p/gorest/).
7. Prometheus Client, Prometheus in Prometheus (https://github.com/prometheus/client_golang).
8. Snappy, a compression library for LevelDB and Levigo (http://code.google.com/p/snappy/).
1. Go 1.0.3.
2. GVM: [https://github.com/moovweb/gvm](https://github.com/moovweb/gvm) is highly recommended as well.
3. LevelDB: [https://code.google.com/p/leveldb/](https://code.google.com/p/leveldb/).
4. Protocol Buffers Compiler: [http://code.google.com/p/protobuf/](http://code.google.com/p/protobuf/).
5. goprotobuf: the code generator and runtime library: [http://code.google.com/p/goprotobuf/](http://code.google.com/p/goprotobuf/).
6. Levigo, a Go-wrapper around LevelDB's C library: [https://github.com/jmhodges/levigo](https://github.com/jmhodges/levigo).
7. GoRest, a RESTful style web-services framework: [http://code.google.com/p/gorest/](http://code.google.com/p/gorest/).
8. Prometheus Client, Prometheus in Prometheus [https://github.com/prometheus/client_golang](https://github.com/prometheus/client_golang).
9. Snappy, a compression library for LevelDB and Levigo [http://code.google.com/p/snappy/](http://code.google.com/p/snappy/).
## Getting Started
For basic help how to get started:
* The source code is periodically indexed: [Prometheus Core](http://godoc.org/github.com/prometheus/prometheus).
* For Linux users, please consult the Travis CI configuration in _.travis.yml_ and _Makefile.TRAVIS_.
* [Getting started on Mac OSX](documentation/guides/getting-started-osx.md)
* For UNIX-like environment users users, please consult the Travis CI configuration in _.travis.yml_ and _Makefile_.
* All of the core developers are accessible via the [Prometheus Developers Mailinglist](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers).
### Working with GVM
Starting out, the following workflow is advised:
$ gvm install go1.0.3
$ gvm use go1.0.3
$ gvm pkgset create prometheus
$ gvm pkgset use prometheus
This is mainly due to the fact that it allows the user to partition the
compile-time side-effects from the rest of one's work environment, particularly
``${GOPATH}``.
Read below in the _General_ section.
### Not Using GVM
It is entirely possible to build Prometheus without ``gvm``. I presently do not
advise taking this route due to build environment pollution both against
Prometheus and from its build infrastructure onto the system---namely
``${GOPATH}``.
If you really want to avoid GVM, execute the following:
$ touch build/gvm-stamp
Read below in the _General_ section.
### General
For first time users, simply run the following:
$ make
If you run into problems, try the following:
$ SILENCE_THIRD_PARTY_BUILDS=false make
Upon having a satisfactory build, it's possible to create an artifact for
end-user distribution:
$ make package
$ find build/package
``build/package`` will be sufficient for whatever archiving mechanism you
choose. The important thing to note is that Go presently does not
staticly link against C dependency libraries, so including the ``lib``
directory is paramount. Providing ``LD_LIBRARY_PATH`` or
``DYLD_LIBRARY_PATH`` in a scaffolding shell script is advised.
Executing the following target will start up Prometheus for lazy users:
$ ARGUMENTS="-foo -bar -baz" make run
``${ARGUMENTS}`` is passed verbatim into the makefile and thusly Prometheus as
``$(ARGUMENTS)``. This is useful for quick one-off invocations and smoke
testing.
### Mac OS X
We have a handy [Getting started on Mac OS X](documentation/guides/getting-started-osx.md) guide.
### Problems
If at any point you run into an error with the ``make`` build system in terms of
its not properly scaffolding things on a given environment, please file a bug or
open a pull request with your changes if you can fix it yourself.
Please note that we're explicitly shooting for stable runtime environments and
not the latest-whiz bang releases; thusly, we ask you to provide ample
architecture and release identification remarks for us.
## Testing
$ make test
[![Build Status](https://travis-ci.org/prometheus/prometheus.png)](https://travis-ci.org/prometheus/prometheus)
## Contributing
1. To start, reach out via our mailing list (mentioned above) and ask us what
the current priorities are. We can find a good isolated starter project for
you.
2. Keeping code hygiene is important. We thusly have a practical preference
for the following:
1. Run ``make format`` to ensure the correctness of the Go code's layout.
2. Run ``make advice`` to find facial errors with a static analyzer.
3. Try to capture your changes in some form of a test. Go makes it easy to
write [Table Driven Tests](https://code.google.com/p/go-wiki/wiki/TableDrivenTests).
There is no mandate to use this said scaffolding mechanism, but it _can_
make your life easier in the right circumstances.
3. Welcome aboard!
## License
Apache License 2.0
# Copyright 2013 Prometheus Team
# 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.
.SUFFIXES:
include ../Makefile.INCLUDE
all: dependencies-stamp
bison-stamp: bison-implementation-$(UNAME)-stamp
[ -x "$$(which bison)" ] || { echo "bison not found." ; false ; }
touch $@
bison-implementation-Darwin-stamp:
[ -x "$$(which bison)" ] || $(BREW_INSTALL) bison
touch $@
bison-implementation-Linux-stamp:
[ -x "$$(which bison)" ] || $(APT_GET_INSTALL) bison
touch $@
cache-stamp:
$(MAKE) -C cache
touch $@
cc-stamp: cc-implementation-$(UNAME)-stamp
[ -x "$$(which cc)" ] || { echo "cc not found." ; false ; }
touch $@
cc-implementation-Darwin-stamp:
[ -x "$$(which cc)" ] || { echo "Install XCode?" ; false ; }
touch $@
cc-implementation-Linux-stamp:
[ -x "$$(which cc)" ] || $(APT_GET_INSTALL) build-essential
touch $@
dependencies-stamp: cache-stamp go-stamp goprotobuf-stamp gorest-stamp goskiplist-stamp instrumentation-stamp levigo-stamp
touch $@
go-stamp: gvm-stamp
[ -x "$$(which go)" ] || { echo "go not found." ; false ; }
touch $@
goprotobuf-stamp: go-stamp mercurial-stamp protoc-stamp
$(GO_GET) code.google.com/p/goprotobuf/proto $(THIRD_PARTY_BUILD_OUTPUT)
$(GO_GET) code.google.com/p/goprotobuf/protoc-gen-go $(THIRD_PARTY_BUILD_OUTPUT)
touch $@
gorest-stamp: go-stamp
$(GO_GET) code.google.com/p/gorest $(THIRD_PARTY_BUILD_OUTPUT)
touch $@
goskiplist-stamp: go-stamp
$(GO_GET) github.com/ryszard/goskiplist/skiplist $(THIRD_PARTY_BUILD_OUTPUT)
touch $@
gvm-stamp: bison-stamp cc-stamp mercurial-stamp
[ -x "$$(which gvm)" ] || { echo "gvm not found; install manually from https://github.com/moovweb/gvm." ; false ; }
-gvm install go$(GO_VERSION)
#
# ********** **********
# gvm installed go$(GO_VERSION) if it did not exist already.
#
# Prometheus expects go$(GO_VERSION) to be used for building.
# This can be achieved by running ``gvm use go$(GO_VERSION)`` before any
# other Prometheus make tools.
#
# Once this build finishes, $(GOPATH) will be mutated and
# contain some new packages. Here is an example workflow:
#
# $ gvm install go$(GO_VERSION)
# $ gvm use go$(GO_VERSION)
# $ gvm pkgset create prometheus
# $ gvm pkgset use prometheus
#
# ********** **********
#
-[ -z "${CI}" ] && read -p "Press [ENTER] upon reading." _
touch $@
instrumentation-stamp: go-stamp
$(GO_GET) github.com/prometheus/client_golang $(THIRD_PARTY_BUILD_OUTPUT)
touch $@
leveldb-stamp: cache-stamp cache/leveldb-$(LEVELDB_VERSION).tar.gz cc-stamp rsync-stamp snappy-stamp
tar xzvf cache/leveldb-$(LEVELDB_VERSION).tar.gz -C dirty $(THIRD_PARTY_BUILD_OUTPUT)
# The test that LevelDB uses to test for Snappy is naive and
# does not respect LDFLAGS. :-(
CXXFLAGS="$(CXXFLAGS) -lsnappy $(LDFLAGS)" LDFLAGS="-lsnappy $(LDFLAGS)" $(MAKE) -C dirty/leveldb-$(LEVELDB_VERSION) $(THIRD_PARTY_BUILD_OUTPUT)
rsync -av "dirty/leveldb-$(LEVELDB_VERSION)/include/" "$(PREFIX)/include/" $(THIRD_PARTY_BUILD_OUTPUT)
-[ "$(UNAME)" = "Linux" ] && { rsync -av "dirty/leveldb-$(LEVELDB_VERSION)/"*.*so* "$(PREFIX)/lib/" ; } $(THIRD_PARTY_BUILD_OUTPUT) $(THIRD_PARTY_BUILD_OUTPUT)
-[ "$(UNAME)" = "Darwin" ] && { rsync -av "dirty/leveldb-$(LEVELDB_VERSION)/"*.*dylib* "$(PREFIX)/lib/" ; } $(THIRD_PARTY_BUILD_OUTPUT)
rsync -av "dirty/leveldb-$(LEVELDB_VERSION)/"*.a "$(PREFIX)/lib/" $(THIRD_PARTY_BUILD_OUTPUT)
touch $@
levigo-stamp: cc-stamp go-stamp leveldb-stamp snappy-stamp
CGO_CFLAGS="-I$(PREFIX)/include" CGO_LDFLAGS="-L$(PREFIX)/lib" $(GO_GET) github.com/jmhodges/levigo $(THIRD_PARTY_BUILD_OUTPUT)
touch $@
libunwind-stamp:
$(APT_GET_INSTALL) libunwind7
$(APT_GET_INSTALL) libunwind7-dev
touch $@
mercurial-implementation-Darwin-stamp:
[ -x "$$(which hg)" ] || $(BREW_INSTALL) mercurial
touch $@
mercurial-implementation-Linux-stamp:
[ -x "$$(which hg)" ] || $(APT_GET_INSTALL) mercurial
touch $@
mercurial-stamp: mercurial-implementation-$(UNAME)-stamp
[ -x "$$(which hg)" ] || { echo "hg not found." ; false ; }
touch $@
noop-target-stamp:
echo "Not doing anything."
touch $@
protoc-stamp: cache-stamp cache/protobuf-$(PROTOCOL_BUFFERS_VERSION).tar.bz2 cc-stamp
tar xjvf cache/protobuf-$(PROTOCOL_BUFFERS_VERSION).tar.bz2 -C dirty $(THIRD_PARTY_BUILD_OUTPUT)
cd dirty/protobuf-$(PROTOCOL_BUFFERS_VERSION) && ./configure --prefix="$(PREFIX)" $(THIRD_PARTY_BUILD_OUTPUT)
$(MAKE) -C dirty/protobuf-$(PROTOCOL_BUFFERS_VERSION) $(THIRD_PARTY_BUILD_OUTPUT)
$(MAKE) -C dirty/protobuf-$(PROTOCOL_BUFFERS_VERSION) install $(THIRD_PARTY_BUILD_OUTPUT)
[ -x "$$(which protoc)" ] || { echo "protoc not found." ; false ; }
touch $@
rsync-implementation-Darwin-stamp:
[ -x "$$(which rsync)" ] || $(BREW_INSTALL) rsync
touch $@
rsync-implementation-Linux-stamp:
[ -x "$$(which rsync)" ] || $(APT_GET_INSTALL) rsync
rsync-stamp: rsync-implementation-$(UNAME)-stamp
[ -x "$$(which rsync)" ] || { echo "rsync not found." ; false ; }
touch $@
snappy-stamp: cache-stamp cache/snappy-$(SNAPPY_VERSION).tar.gz cc-stamp
tar xzvf cache/snappy-$(SNAPPY_VERSION).tar.gz -C dirty $(THIRD_PARTY_BUILD_OUTPUT)
cd dirty/snappy-$(SNAPPY_VERSION) && ./configure --prefix="$(PREFIX)" $(THIRD_PARTY_BUILD_OUTPUT)
$(MAKE) -C dirty/snappy-$(SNAPPY_VERSION) $(THIRD_PARTY_BUILD_OUTPUT)
$(MAKE) -C dirty/snappy-$(SNAPPY_VERSION) install $(THIRD_PARTY_BUILD_OUTPUT)
touch $@
ifeq ($(UNAME), Linux)
stack-unwind-support-stamp: libunwind-stamp