| CFG_RELEASE_NUM=0.17.0 |
| CFG_RELEASE_LABEL= |
| |
| OPENSSL_VERS=1.0.2k |
| OPENSSL_SHA256=6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0 |
| |
| include config.mk |
| |
| export PATH := $(dir $(CFG_RUSTC)):$(PATH) |
| |
| ifeq ($(CFG_RELEASE_CHANNEL),stable) |
| CFG_RELEASE=$(CFG_RELEASE_NUM) |
| CFG_PACKAGE_VERS=$(CFG_RELEASE_NUM) |
| else ifeq ($(CFG_RELEASE_CHANNEL),beta) |
| CFG_RELEASE=$(CFG_RELEASE_NUM)-beta |
| CFG_PACKAGE_VERS=beta |
| else ifeq ($(CFG_RELEASE_CHANNEL),nightly) |
| CFG_RELEASE=$(CFG_RELEASE_NUM)-nightly |
| CFG_PACKAGE_VERS=nightly |
| else ifeq ($(CFG_RELEASE_CHANNEL),dev) |
| CFG_RELEASE=$(CFG_RELEASE_NUM)-dev |
| CFG_PACKAGE_VERS=$(CFG_RELEASE_NUM)-dev |
| endif |
| |
| # allow build systems to use a constant date instead of the current one |
| CFG_BUILD_DATE = $(shell SOURCE_DATE_EPOCH="$${SOURCE_DATE_EPOCH:-$$(date +%s)}" ; date -u -d "@$$SOURCE_DATE_EPOCH" +%F 2>/dev/null || date -u -r "$$SOURCE_DATE_EPOCH" +%F 2>/dev/null || date -u +%F) |
| |
| ifneq ($(wildcard $(CFG_SRC_DIR)/.git),) |
| CFG_COMMIT_DATE = $(shell git --git-dir='$(CFG_SRC_DIR).git' log -1 --date=short --pretty=format:'%cd') |
| CFG_SHORT_COMMIT_HASH = $(shell git --git-dir='$(CFG_SRC_DIR).git' rev-parse --short HEAD) |
| CFG_COMMIT_HASH = $(shell git --git-dir='$(CFG_SRC_DIR).git' rev-parse HEAD) |
| endif |
| PKG_NAME = cargo-$(CFG_PACKAGE_VERS) |
| |
| ifdef CFG_DISABLE_VERIFY_INSTALL |
| MAYBE_DISABLE_VERIFY=--disable-verify |
| else |
| MAYBE_DISABLE_VERIFY= |
| endif |
| |
| ifdef CFG_DISABLE_OPTIMIZE |
| OPT_FLAG= |
| else |
| OPT_FLAG=--release |
| endif |
| |
| ifdef VERBOSE |
| VERBOSE_FLAG=--verbose |
| else |
| VERBOSE_FLAG= |
| endif |
| |
| ifdef CFG_CUSTOM_BUILD_DIR |
| export CARGO_TARGET_DIR := $(CFG_CUSTOM_BUILD_DIR) |
| endif |
| |
| S := $(CFG_SRC_DIR)/ |
| |
| CFG_RELEASE_PARTS := $(subst ., ,$(CFG_RELEASE_NUM)) |
| CFG_VERSION_MAJOR := $(word 1,$(CFG_RELEASE_PARTS)) |
| CFG_VERSION_MINOR := $(word 2,$(CFG_RELEASE_PARTS)) |
| CFG_VERSION_PATCH := $(word 3,$(CFG_RELEASE_PARTS)) |
| |
| # This is output to the 'version' file during packaging |
| CFG_VERSION=$(CFG_RELEASE) |
| ifneq ($(CFG_COMMIT_HASH),) |
| CFG_VERSION=$(CFG_RELEASE) ($(CFG_SHORT_COMMIT_HASH) $(CFG_COMMIT_DATE)) |
| endif |
| |
| export CFG_VERSION_MAJOR |
| export CFG_VERSION_MINOR |
| export CFG_VERSION_PATCH |
| ifneq ($(CFG_COMMIT_HASH),) |
| export CFG_COMMIT_HASH |
| export CFG_COMMIT_DATE |
| export CFG_SHORT_COMMIT_HASH |
| endif |
| export CFG_BUILD_DATE |
| export CFG_RELEASE_CHANNEL |
| 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_DISABLE_OPTIMIZE |
| TARGET_$(1) = $$(TARGET_ROOT)/$(1)/debug |
| else |
| TARGET_$(1) = $$(TARGET_ROOT)/$(1)/release |
| endif |
| DISTDIR_$(1) = $$(TARGET_$(1))/dist |
| IMGDIR_$(1) = $$(DISTDIR_$(1))/$$(PKG_NAME)-$(1)-image |
| OVERLAYDIR_$(1) = $$(DISTDIR_$(1))/$$(PKG_NAME)-$(1)-overlay |
| 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 := $(CFG_CARGO) |
| endif |
| |
| all: $(foreach target,$(CFG_TARGET),cargo-$(target)) |
| |
| define CARGO_TARGET |
| cargo-$(1): target/openssl/$(1).stamp |
| $$(CFG_RUSTC) -V |
| $$(CARGO) --version |
| $$(CARGO) build --target $(1) \ |
| --manifest-path $(S)Cargo.toml \ |
| $$(OPT_FLAG) $$(CARGOFLAGS) $$(VERBOSE_FLAG) $$(ARGS) |
| |
| test-unit-$(1): target/openssl/$(1).stamp cargo-$(1) |
| @mkdir -p $$(CFG_BUILD_DIR)/target/$(1)/cit |
| $$(CARGO) test --target $(1) \ |
| --manifest-path $(S)Cargo.toml \ |
| $$(OPT_FLAG) $$(CARGOFLAGS) $$(VERBOSE_FLAG) $$(only) -- \ |
| --quiet |
| endef |
| $(foreach target,$(CFG_TARGET),$(eval $(call CARGO_TARGET,$(target)))) |
| |
| # === Tests |
| |
| test: style no-exes $(foreach target,$(CFG_TARGET),test-unit-$(target)) |
| |
| style: |
| (cd $(S) && sh tests/check-style.sh) |
| |
| ifeq ($(CFG_GIT),) |
| no-exes: |
| else |
| no-exes: |
| (cd $(S) && find $$($(CFG_GIT) ls-files) -type f \ |
| \( -perm -u+x -or -perm -g+x -or -perm -o+x \) \ |
| -not -name configure -not -name '*.sh' -not -name '*.rs' \ |
| -not -name '*.py' -not -wholename "*/rust-installer/*" | \ |
| grep '.*' \ |
| && exit 1 || exit 0) |
| endif |
| |
| # === Misc |
| |
| Makefile config.mk: config.stamp |
| config.stamp: $(CFG_SRC_DIR)configure $(CFG_SRC_DIR)Makefile.in |
| $(CFG_SRC_DIR)configure $(CFG_CONFIGURE_ARGS) |
| |
| clean-all: clean |
| clean: |
| rm -rf $(TARGET_ROOT) |
| |
| # === Documentation |
| |
| DOCS := index faq config guide manifest build-script pkgid-spec crates-io \ |
| environment-variables specifying-dependencies source-replacement \ |
| policies machine-readable-output |
| 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-in-header $(S)src/doc/html-headers.html \ |
| --html-before-content $(S)src/doc/header.html \ |
| --html-after-content $(S)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 images/circle-with-i.png \ |
| images/search.png images/org-level-acl.png images/auth-level-acl.png \ |
| favicon.ico |
| |
| doc: $(foreach doc,$(DOCS),target/doc/$(doc).html) \ |
| $(foreach asset,$(ASSETS),target/doc/$(asset)) \ |
| target/doc/cargo/index.html |
| |
| target/doc/cargo/index.html: target/openssl/$(CFG_BUILD).stamp cargo-$(CFG_BUILD) |
| $(CARGO) doc --no-deps --target $(CFG_BUILD) \ |
| --manifest-path $(S)Cargo.toml $(OPT_FLAG) |
| |
| $(DOC_DIR)/%.html: \ |
| $(S)src/doc/%.md \ |
| $(S)src/doc/html-headers.html \ |
| $(S)src/doc/header.html \ |
| $(S)src/doc/footer.html |
| @mkdir -p $(@D) |
| $(CFG_RUSTDOC) $< -o $(@D) $(DOC_OPTS) |
| |
| $(DOC_DIR)/%: $(S)src/doc/% |
| @mkdir -p $(@D) |
| cp $< $@ |
| |
| OPENSSL_OS_aarch64-unknown-linux-gnu := linux-aarch64 |
| OPENSSL_OS_arm-unknown-linux-gnueabi := linux-armv4 |
| OPENSSL_OS_arm-unknown-linux-gnueabihf := linux-armv4 |
| OPENSSL_OS_armv7-unknown-linux-gnueabihf := linux-armv4 |
| OPENSSL_OS_i686-apple-darwin := darwin-i386-cc |
| OPENSSL_OS_i686-unknown-freebsd := BSD-x86-elf |
| OPENSSL_OS_i686-unknown-linux-gnu := linux-elf |
| OPENSSL_OS_i686-unknown-linux-musl := linux-elf |
| OPENSSL_OS_mips-unknown-linux-gnu := linux-mips32 |
| OPENSSL_OS_mips64-unknown-linux-gnuabi64 := linux64-mips64 |
| OPENSSL_OS_mips64el-unknown-linux-gnuabi64 := linux64-mips64 |
| OPENSSL_OS_mipsel-unknown-linux-gnu := linux-mips32 |
| OPENSSL_OS_powerpc-unknown-linux-gnu := linux-ppc |
| OPENSSL_OS_powerpc64-unknown-linux-gnu := linux-ppc64 |
| OPENSSL_OS_powerpc64le-unknown-linux-gnu := linux-ppc64le |
| OPENSSL_OS_s390x-unknown-linux-gnu := linux64-s390x |
| OPENSSL_OS_x86_64-apple-darwin := darwin64-x86_64-cc |
| OPENSSL_OS_x86_64-unknown-freebsd := BSD-x86_64 |
| OPENSSL_OS_x86_64-unknown-linux-gnu := linux-x86_64 |
| OPENSSL_OS_x86_64-unknown-linux-musl := linux-x86_64 |
| OPENSSL_OS_x86_64-unknown-netbsd := BSD-x86_64 |
| |
| OPENSSL_AR_aarch64-unknown-linux-gnu := aarch64-linux-gnu-ar |
| OPENSSL_AR_arm-unknown-linux-gnueabi := arm-linux-gnueabi-ar |
| OPENSSL_AR_arm-unknown-linux-gnueabihf := arm-linux-gnueabihf-ar |
| OPENSSL_AR_armv7-unknown-linux-gnueabihf := armv7-linux-gnueabihf-ar |
| OPENSSL_AR_i686-apple-darwin := ar |
| OPENSSL_AR_i686-unknown-freebsd := i686-unknown-freebsd10-ar |
| OPENSSL_AR_i686-unknown-linux-gnu := ar |
| OPENSSL_AR_i686-unknown-linux-musl := ar |
| OPENSSL_AR_mips-unknown-linux-gnu := mips-linux-gnu-ar |
| OPENSSL_AR_mips64-unknown-linux-gnuabi64 := mips64-linux-gnuabi64-ar |
| OPENSSL_AR_mips64el-unknown-linux-gnuabi64 := mips64el-linux-gnuabi64-ar |
| OPENSSL_AR_mipsel-unknown-linux-gnu := mipsel-linux-gnu-ar |
| OPENSSL_AR_powerpc-unknown-linux-gnu := powerpc-linux-gnu-ar |
| OPENSSL_AR_powerpc64-unknown-linux-gnu := powerpc64-linux-gnu-ar |
| OPENSSL_AR_powerpc64le-unknown-linux-gnu := powerpc64le-linux-gnu-ar |
| OPENSSL_AR_s390x-unknown-linux-gnu := s390x-linux-gnu-ar |
| OPENSSL_AR_x86_64-apple-darwin := ar |
| OPENSSL_AR_x86_64-unknown-freebsd := x86_64-unknown-freebsd10-ar |
| OPENSSL_AR_x86_64-unknown-linux-gnu := ar |
| OPENSSL_AR_x86_64-unknown-linux-musl := ar |
| OPENSSL_AR_x86_64-unknown-netbsd := x86_64-unknown-netbsd-ar |
| OPENSSL_CC_aarch64-unknown-linux-gnu := aarch64-linux-gnu-gcc |
| OPENSSL_CC_arm-unknown-linux-gnueabi := arm-linux-gnueabi-gcc |
| OPENSSL_CC_arm-unknown-linux-gnueabihf := arm-linux-gnueabihf-gcc |
| OPENSSL_CC_armv7-unknown-linux-gnueabihf := armv7-linux-gnueabihf-gcc |
| OPENSSL_CC_i686-apple-darwin := clang |
| OPENSSL_CC_i686-unknown-freebsd := i686-unknown-freebsd10-gcc |
| OPENSSL_CC_i686-unknown-linux-gnu := gcc |
| OPENSSL_CC_i686-unknown-linux-musl := musl-gcc |
| OPENSSL_CC_mips-unknown-linux-gnu := mips-linux-gnu-gcc |
| OPENSSL_CC_mips64-unknown-linux-gnuabi64 := mips64-linux-gnuabi64-gcc |
| OPENSSL_CC_mips64el-unknown-linux-gnuabi64 := mips64el-linux-gnuabi64-gcc |
| OPENSSL_CC_mipsel-unknown-linux-gnu := mipsel-linux-gnu-gcc |
| OPENSSL_CC_powerpc-unknown-linux-gnu := powerpc-linux-gnu-gcc |
| OPENSSL_CC_powerpc64-unknown-linux-gnu := powerpc64-linux-gnu-gcc |
| OPENSSL_CC_powerpc64le-unknown-linux-gnu := powerpc64le-linux-gnu-gcc |
| OPENSSL_CC_s390x-unknown-linux-gnu := s390x-linux-gnu-gcc |
| OPENSSL_CC_x86_64-apple-darwin := clang |
| OPENSSL_CC_x86_64-unknown-freebsd := x86_64-unknown-freebsd10-gcc |
| OPENSSL_CC_x86_64-unknown-linux-gnu := gcc |
| OPENSSL_CC_x86_64-unknown-linux-musl := musl-gcc |
| OPENSSL_CC_x86_64-unknown-netbsd := x86_64-unknown-netbsd-gcc |
| |
| SETARCH_i686-unknown-linux-gnu := setarch i386 |
| OPENSSL_CFLAGS_i686-apple-darwin := -m32 |
| OPENSSL_CFLAGS_i686-unknown-linux-gnu := -m32 |
| OPENSSL_CFLAGS_i686-unknown-linux-musl := -m32 |
| |
| define BUILD_OPENSSL |
| |
| ifdef CFG_ENABLE_BUILD_OPENSSL |
| |
| cargo-$(1): export OPENSSL_STATIC := 1 |
| test-unit-$(1): export OPENSSL_STATIC := 1 |
| |
| OPENSSL_INSTALL_$(1) := $$(CFG_BUILD_DIR)/target/openssl/$(1)-install |
| |
| ifdef OPENSSL_OS_$(1) |
| |
| target/openssl/$(1).stamp: target/openssl/openssl-$$(OPENSSL_VERS).tar.gz \ |
| | target/openssl/ |
| rm -rf target/openssl/$(1) |
| mkdir -p target/openssl/$(1) |
| tar xf $$< -C target/openssl/$(1) --strip-components 1 |
| (cd target/openssl/$(1) && \ |
| CC=$$(OPENSSL_CC_$(1)) \ |
| AR=$$(OPENSSL_AR_$(1)) \ |
| $$(SETARCH_$(1)) ./Configure --prefix=$$(OPENSSL_INSTALL_$(1)) \ |
| no-dso $$(OPENSSL_OS_$(1)) -fPIC $$(OPENSSL_CFLAGS_$(1))&& \ |
| $(MAKE) -j1 && \ |
| $(MAKE) install) |
| touch $$@ |
| |
| # variables read by various build scripts to find openssl |
| cargo-$(1): export OPENSSL_DIR := $$(OPENSSL_INSTALL_$(1)) |
| test-unit-$(1): export OPENSSL_DIR := $$(OPENSSL_INSTALL_$(1)) |
| |
| # build libz statically into the cargo we're producing |
| cargo-$(1): export LIBZ_SYS_STATIC := 1 |
| |
| else # !OPENSSL_OS_$(1) |
| target/openssl/$(1).stamp: |
| |
| endif |
| |
| else # !CFG_ENABLE_BUILD_OPENSSL |
| target/openssl/$(1).stamp: |
| endif |
| |
| endef |
| |
| $(foreach target,$(CFG_TARGET),$(eval $(call BUILD_OPENSSL,$(target)))) |
| |
| ifeq ($(shell uname),Darwin) |
| SHASUM := shasum -a 256 |
| else |
| SHASUM := sha256sum |
| endif |
| |
| target/openssl/openssl-$(OPENSSL_VERS).tar.gz: | target/openssl/ |
| curl -o $(@).tmp https://www.openssl.org/source/openssl-$(OPENSSL_VERS).tar.gz |
| $(SHASUM) $(@).tmp > $(@).sha256 |
| test $(OPENSSL_SHA256) = `cut -d ' ' -f 1 $(@).sha256` |
| mv $(@).tmp $(@) |
| |
| target/openssl/: |
| mkdir -p $(@) |
| |
| # === 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 |
| |
| prepare-image-$(1): |
| @[ -f $$(TARGET_$(1))/cargo$$(X) ] || echo 'Please run `make` first' |
| @[ -f $$(TARGET_$(1))/cargo$$(X) ] |
| rm -rf $$(IMGDIR_$(1)) |
| mkdir -p $$(IMGDIR_$(1))/bin $$(IMGDIR_$(1))/$(CFG_LIBDIR)/cargo \ |
| $$(IMGDIR_$(1))$(CFG_MANDIR)/man1 \ |
| $$(IMGDIR_$(1))$(CFG_DOCDIR) \ |
| $$(IMGDIR_$(1))$(CFG_DATADIR)/zsh/site-functions \ |
| $$(IMGDIR_$(1))$(CFG_SYSCONFDIR)/bash_completion.d |
| cp $$(TARGET_$(1))/cargo$$(X) $$(IMGDIR_$(1))/bin |
| cp $(S)src/etc/man/*.1 $$(IMGDIR_$(1))$(CFG_MANDIR)/man1 |
| cp $(S)src/etc/_cargo $$(IMGDIR_$(1))$(CFG_DATADIR)/zsh/site-functions/_cargo |
| cp $(S)src/etc/cargo.bashcomp.sh $$(IMGDIR_$(1))$(CFG_SYSCONFDIR)/bash_completion.d/cargo |
| cp $(S)README.md $(S)LICENSE-MIT $(S)LICENSE-APACHE \ |
| $(S)LICENSE-THIRD-PARTY \ |
| $$(IMGDIR_$(1))$(CFG_DOCDIR) |
| |
| prepare-overlay-$(1): |
| rm -Rf $$(OVERLAYDIR_$(1)) |
| mkdir -p $$(OVERLAYDIR_$(1)) |
| cp $(S)README.md $(S)LICENSE-MIT $(S)LICENSE-APACHE \ |
| $(S)LICENSE-THIRD-PARTY \ |
| $$(OVERLAYDIR_$(1)) |
| echo "$(CFG_VERSION)" > $$(OVERLAYDIR_$(1))/version |
| |
| $$(DISTDIR_$(1))/$$(PKG_NAME)-$(1).tar.gz: prepare-image-$(1) prepare-overlay-$(1) |
| sh $(S)src/rust-installer/gen-installer.sh \ |
| --product-name=Rust \ |
| --rel-manifest-dir=rustlib \ |
| --success-message=Rust-is-ready-to-roll. \ |
| --image-dir=$$(IMGDIR_$(1)) \ |
| --work-dir=./$$(DISTDIR_$(1)) \ |
| --output-dir=./$$(DISTDIR_$(1)) \ |
| --non-installed-overlay=$$(OVERLAYDIR_$(1)) \ |
| --package-name=$$(PKG_NAME)-$(1) \ |
| --component-name=cargo \ |
| --legacy-manifest-dirs=rustlib,cargo |
| rm -Rf $$(IMGDIR_$(1)) |
| |
| install-$(1): $$(DISTDIR_$(1))/$$(PKG_NAME)-$(1).tar.gz |
| $$(PKGDIR_$(1))/install.sh \ |
| --prefix="$$(CFG_PREFIX)" \ |
| --destdir="$$(DESTDIR)" $$(MAYBE_DISABLE_VERIFY) |
| |
| uninstall-$(1): $$(DISTDIR_$(1))/$$(PKG_NAME)-$(1).tar.gz |
| $$(PKGDIR_$(1))/install.sh \ |
| --prefix="$$(CFG_PREFIX)" \ |
| --destdir="$$(DESTDIR)" \ |
| --uninstall |
| 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)) |
| uninstall: $(foreach target,$(CFG_TARGET), uninstall-$(target)) |
| |
| |
| # Setup phony tasks |
| .PHONY: all clean clean-all dist distcheck install uninstall test test-unit style |
| |
| # Disable unnecessary built-in rules |
| .SUFFIXES: |
| |