cargo/Makefile.in
Alex Crichton 2b46d039c0 Implement features
This feature was outlined in #385 [1], and documentation has been included as
part of this commit.

[1]: https://github.com/rust-lang/cargo/issues/385#issuecomment-53917539
2014-09-22 18:52:53 -07:00

192 lines
5.5 KiB
Makefile

CFG_RELEASE_NUM=0.0.1
CFG_RELEASE_LABEL=-pre
include config.mk
ifneq ($(CFG_LOCAL_RUST_ROOT),)
export LD_LIBRARY_PATH := $(CFG_LOCAL_RUST_ROOT)/lib:$(LD_LIBRARY_PATH)
export DYLD_LIBRARY_PATH := $(CFG_LOCAL_RUST_ROOT)/lib:$(DYLD_LIBRARY_PATH)
endif
export PATH := $(dir $(CFG_RUSTC)):$(PATH)
ifdef CFG_ENABLE_NIGHTLY
CFG_RELEASE=$(CFG_RELEASE_NUM)$(CFG_RELEASE_LABEL)-nightly
CFG_PACKAGE_VERS = nightly
else
CFG_RELEASE=$(CFG_RELEASE_NUM)$(CFG_RELEASE_LABEL)
CFG_PACKAGE_VERS=$(CFG_RELEASE)
endif
CFG_VER_DATE = $(shell git log -1 --pretty=format:'%ai')
CFG_VER_HASH = $(shell git rev-parse --short HEAD)
CFG_VERSION = $(CFG_RELEASE) ($(CFG_VER_HASH) $(CFG_VER_DATE))
PKG_NAME = cargo-$(CFG_PACKAGE_VERS)
ifdef CFG_DISABLE_VERIFY_INSTALL
MAYBE_DISABLE_VERIFY=--disable-verify
else
MAYBE_DISABLE_VERIFY=
endif
ifdef CFG_ENABLE_OPTIMIZE
OPT_FLAG=--release
else
OPT_FLAG=
endif
export CFG_VERSION
export CFG_DISABLE_CROSS_TESTS
ifeq ($(OS),Windows_NT)
X = .exe
endif
TARGET_ROOT = target
BIN_TARGETS := cargo
BIN_TARGETS := $(BIN_TARGETS:src/bin/%.rs=%)
BIN_TARGETS := $(filter-out cargo,$(BIN_TARGETS))
define DIST_TARGET
ifdef CFG_ENABLE_OPTIMIZE
TARGET_$(1) = $$(TARGET_ROOT)/$(1)/release
else
TARGET_$(1) = $$(TARGET_ROOT)/$(1)
endif
DISTDIR_$(1) = $$(TARGET_$(1))/dist
PKGDIR_$(1) = $$(DISTDIR_$(1))/$$(PKG_NAME)-$(1)
BIN_TARGETS_$(1) := $$(BIN_TARGETS:%=$$(TARGET_$(1))/%$$(X))
endef
$(foreach target,$(CFG_TARGET),$(eval $(call DIST_TARGET,$(target))))
ifdef CFG_LOCAL_CARGO
CARGO := $(CFG_LOCAL_CARGO)
else
CARGO := $(TARGET_ROOT)/snapshot/bin/cargo$(X)
endif
all: $(foreach target,$(CFG_TARGET),cargo-$(target))
define CARGO_TARGET
cargo-$(1): $$(CARGO)
"$$(CFG_RUSTC)" -v
$$(CARGO) build --target $(1) $$(OPT_FLAG) $$(ARGS)
test-unit-$(1): $$(CARGO)
$$(CARGO) test --target $(1) $$(only)
endef
$(foreach target,$(CFG_TARGET),$(eval $(call CARGO_TARGET,$(target))))
$(TARGET_ROOT)/snapshot/bin/cargo$(X): src/snapshots.txt
$(CFG_PYTHON) src/etc/dl-snapshot.py $(CFG_BUILD)
touch $@
# === Tests
test: style no-exes $(foreach target,$(CFG_TARGET),test-unit-$(target))
style:
sh tests/check-style.sh
no-exes:
find $$(git ls-files | grep -v ttf) -perm +111 -type f \
-not -name configure -not -name '*.sh' -not -name '*.rs' | \
grep '.*' \
&& exit 1 || exit 0
# === Misc
clean-all: clean
clean:
rm -rf $(TARGET_ROOT)
# === Documentation
DOCS := index faq config guide manifest native-build pkgid-spec
DOC_DIR := target/doc
DOC_OPTS := --markdown-no-toc \
--markdown-css stylesheets/normalize.css \
--markdown-css stylesheets/all.css \
--markdown-css stylesheets/prism.css \
--html-before-content src/doc/header.html \
--html-after-content src/doc/footer.html
ASSETS := CNAME images/noise.png images/forkme.png images/Cargo-Logo-Small.png \
stylesheets/all.css stylesheets/normalize.css javascripts/prism.js \
javascripts/all.js stylesheets/prism.css
doc: $(foreach doc,$(DOCS),target/doc/$(doc).html) \
$(foreach asset,$(ASSETS),target/doc/$(asset))
$(DOC_DIR)/%.html: src/doc/%.md src/doc/header.html src/doc/footer.html
@mkdir -p $(@D)
"$(CFG_RUSTDOC)" $< -o $(@D) $(DOC_OPTS)
$(DOC_DIR)/%: src/doc/%
@mkdir -p $(@D)
cp $< $@
# === Distribution
define DO_DIST_TARGET
dist-$(1): $$(DISTDIR_$(1))/$$(PKG_NAME)-$(1).tar.gz
# One may wonder why some of the commands here are prefixed with `cd -P .`, and
# that's a good question! On some of the windows bots, PWD has a windows-style
# path, and that ends up choking the installation script in various ways.
# Prefixing commands with this `cd -P .` helps the bots to set the right PWD env
# var.
distcheck-$(1): dist-$(1)
rm -rf $$(TARGET_$(1))/distcheck
mkdir -p $$(TARGET_$(1))/distcheck
(cd $$(TARGET_$(1))/distcheck && tar xf ../dist/$$(PKG_NAME)-$(1).tar.gz)
cd -P . && $$(TARGET_$(1))/distcheck/$$(PKG_NAME)-$(1)/install.sh \
--prefix=$$(TARGET_$(1))/distcheck/install
$$(TARGET_$(1))/distcheck/install/bin/cargo -V > /dev/null
cd -P . && $$(TARGET_$(1))/distcheck/$$(PKG_NAME)-$(1)/install.sh \
--prefix=$$(TARGET_$(1))/distcheck/install --uninstall
[ -f $$(TARGET_$(1))/distcheck/install/bin/cargo$(X) ] && exit 1 || exit 0
$$(DISTDIR_$(1))/$$(PKG_NAME)-$(1).tar.gz: prepare-manifest-$(1)
tar -czvf $$@ -C $$(@D) $$(PKG_NAME)-$(1)
ifeq (root user, $$(USER) $$(patsubst %,user,$$(SUDO_USER)))
prepare-manifest-$(1):
@sudo -u "$$$$SUDO_USER" $$(MAKE) prepare-manifest-$(1)
else
prepare-manifest-$(1):
@[ -f $$(TARGET_$(1))/cargo$$(X) ] || echo 'Please run `make` first'
@[ -f $$(TARGET_$(1))/cargo$$(X) ]
rm -rf $$(PKGDIR_$(1))
mkdir -p $$(PKGDIR_$(1))/bin $$(PKGDIR_$(1))/lib/cargo \
$$(PKGDIR_$(1))/share/man/man1
cp $$(TARGET_$(1))/cargo$$(X) $$(PKGDIR_$(1))/bin
cp src/etc/cargo.1 $$(PKGDIR_$(1))/share/man/man1
#cp $$(BIN_TARGETS_$(1)) $$(PKGDIR_$(1))/lib/cargo
(cd $$(PKGDIR_$(1)) && find . -type f | sed 's/^\.\///') \
> $$(DISTDIR_$(1))/manifest-$$(PKG_NAME).in
cp src/etc/install.sh $$(PKGDIR_$(1))
cp README.md LICENSE-MIT LICENSE-APACHE $$(PKGDIR_$(1))
cp LICENSE-MIT $$(PKGDIR_$(1))
mv $$(DISTDIR_$(1))/manifest-$$(PKG_NAME).in \
$$(PKGDIR_$(1))/lib/cargo/manifest.in
endif
install-$(1): prepare-manifest-$(1)
$$(PKGDIR_$(1))/install.sh \
--prefix="$$(CFG_PREFIX)" \
--destdir="$$(DESTDIR)" $$(MAYBE_DISABLE_VERIFY)
endef
$(foreach target,$(CFG_TARGET),$(eval $(call DO_DIST_TARGET,$(target))))
dist: $(foreach target,$(CFG_TARGET),dist-$(target))
distcheck: $(foreach target,$(CFG_TARGET),distcheck-$(target))
install: $(foreach target,$(CFG_TARGET),install-$(target))
# Setup phony tasks
.PHONY: all clean clean-all dist distcheck install test test-unit style
# Disable unnecessary built-in rules
.SUFFIXES: