2014-12-13 00:39:27 +01:00
|
|
|
# Copyright 2014-2015 The Rust Project Developers. See the COPYRIGHT
|
2014-02-14 08:55:49 +01:00
|
|
|
# file at the top-level directory of this distribution and at
|
|
|
|
# http://rust-lang.org/COPYRIGHT.
|
|
|
|
#
|
|
|
|
# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
|
|
# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
|
|
# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
|
|
# option. This file may not be copied, modified, or distributed
|
|
|
|
# except according to those terms.
|
|
|
|
|
2014-02-14 20:24:22 +01:00
|
|
|
######################################################################
|
|
|
|
# Version numbers and strings
|
|
|
|
######################################################################
|
|
|
|
|
|
|
|
# The version number
|
2016-03-01 19:34:26 +01:00
|
|
|
CFG_RELEASE_NUM=1.9.0
|
2014-02-14 20:24:22 +01:00
|
|
|
|
2015-01-09 00:33:31 +01:00
|
|
|
# An optional number to put after the label, e.g. '.2' -> '-beta.2'
|
|
|
|
# NB Make sure it starts with a dot to conform to semver pre-release
|
|
|
|
# versions (section 9)
|
2015-04-21 19:51:53 +02:00
|
|
|
CFG_PRERELEASE_VERSION=.1
|
2014-12-30 05:16:39 +01:00
|
|
|
|
2015-05-08 12:26:26 +02:00
|
|
|
# Append a version-dependent hash to each library, so we can install different
|
|
|
|
# versions in the same place
|
2015-12-29 01:11:42 +01:00
|
|
|
CFG_FILENAME_EXTRA=$(shell printf '%s' $(CFG_RELEASE)$(CFG_EXTRA_FILENAME) | $(CFG_HASH_COMMAND))
|
2014-07-01 16:57:07 +02:00
|
|
|
|
mk: Update how the build deals with version labels. #16677
Adds a new configure flag, --release-channel, which determines how the version
number should be augmented with a release label, as well as how the distribution
artifacts will be named. This is entirely for use by the build automation.
--release-channel can be either 'source', 'nightly', 'beta', or 'stable'.
Here's a summary of the affect of these values on version number and
artifact naming, respectively:
* source - '0.12.0-pre', 'rust-0.12.0-pre-...'
* nightly - '0.12.0-nightly', 'rust-nightly-...'
* beta - '0.12.0-beta', 'rust-beta-...'
* stable - '0.12.0', 'rust-0.12.0-...'
Per http://discuss.rust-lang.org/t/rfc-impending-changes-to-the-release-process/508/1
2014-09-15 22:40:30 +02:00
|
|
|
ifeq ($(CFG_RELEASE_CHANNEL),stable)
|
|
|
|
# This is the normal semver version string, e.g. "0.12.0", "0.12.0-nightly"
|
|
|
|
CFG_RELEASE=$(CFG_RELEASE_NUM)
|
|
|
|
# This is the string used in dist artifact file names, e.g. "0.12.0", "nightly"
|
|
|
|
CFG_PACKAGE_VERS=$(CFG_RELEASE_NUM)
|
Preliminary feature staging
This partially implements the feature staging described in the
[release channel RFC][rc]. It does not yet fully conform to the RFC as
written, but does accomplish its goals sufficiently for the 1.0 alpha
release.
It has three primary user-visible effects:
* On the nightly channel, use of unstable APIs generates a warning.
* On the beta channel, use of unstable APIs generates a warning.
* On the beta channel, use of feature gates generates a warning.
Code that does not trigger these warnings is considered 'stable',
modulo pre-1.0 bugs.
Disabling the warnings for unstable APIs continues to be done in the
existing (i.e. old) style, via `#[allow(...)]`, not that specified in
the RFC. I deem this marginally acceptable since any code that must do
this is not using the stable dialect of Rust.
Use of feature gates is itself gated with the new 'unstable_features'
lint, on nightly set to 'allow', and on beta 'warn'.
The attribute scheme used here corresponds to an older version of the
RFC, with the `#[staged_api]` crate attribute toggling the staging
behavior of the stability attributes, but the user impact is only
in-tree so I'm not concerned about having to make design changes later
(and I may ultimately prefer the scheme here after all, with the
`#[staged_api]` crate attribute).
Since the Rust codebase itself makes use of unstable features the
compiler and build system to a midly elaborate dance to allow it to
bootstrap while disobeying these lints (which would otherwise be
errors because Rust builds with `-D warnings`).
This patch includes one significant hack that causes a
regression. Because the `format_args!` macro emits calls to unstable
APIs it would trigger the lint. I added a hack to the lint to make it
not trigger, but this in turn causes arguments to `println!` not to be
checked for feature gates. I don't presently understand macro
expansion well enough to fix. This is bug #20661.
Closes #16678
[rc]: https://github.com/rust-lang/rfcs/blob/master/text/0507-release-channels.md
2015-01-06 15:26:08 +01:00
|
|
|
CFG_DISABLE_UNSTABLE_FEATURES=1
|
mk: Update how the build deals with version labels. #16677
Adds a new configure flag, --release-channel, which determines how the version
number should be augmented with a release label, as well as how the distribution
artifacts will be named. This is entirely for use by the build automation.
--release-channel can be either 'source', 'nightly', 'beta', or 'stable'.
Here's a summary of the affect of these values on version number and
artifact naming, respectively:
* source - '0.12.0-pre', 'rust-0.12.0-pre-...'
* nightly - '0.12.0-nightly', 'rust-nightly-...'
* beta - '0.12.0-beta', 'rust-beta-...'
* stable - '0.12.0', 'rust-0.12.0-...'
Per http://discuss.rust-lang.org/t/rfc-impending-changes-to-the-release-process/508/1
2014-09-15 22:40:30 +02:00
|
|
|
endif
|
|
|
|
ifeq ($(CFG_RELEASE_CHANNEL),beta)
|
2015-05-19 20:34:34 +02:00
|
|
|
CFG_RELEASE=$(CFG_RELEASE_NUM)-beta$(CFG_PRERELEASE_VERSION)
|
2015-04-22 17:51:39 +02:00
|
|
|
# When building beta distributables just reuse the same "beta" name
|
|
|
|
# so when we upload we'll always override the previous beta. This
|
|
|
|
# doesn't actually impact the version reported by rustc - it's just
|
|
|
|
# for file naming.
|
|
|
|
CFG_PACKAGE_VERS=beta
|
Preliminary feature staging
This partially implements the feature staging described in the
[release channel RFC][rc]. It does not yet fully conform to the RFC as
written, but does accomplish its goals sufficiently for the 1.0 alpha
release.
It has three primary user-visible effects:
* On the nightly channel, use of unstable APIs generates a warning.
* On the beta channel, use of unstable APIs generates a warning.
* On the beta channel, use of feature gates generates a warning.
Code that does not trigger these warnings is considered 'stable',
modulo pre-1.0 bugs.
Disabling the warnings for unstable APIs continues to be done in the
existing (i.e. old) style, via `#[allow(...)]`, not that specified in
the RFC. I deem this marginally acceptable since any code that must do
this is not using the stable dialect of Rust.
Use of feature gates is itself gated with the new 'unstable_features'
lint, on nightly set to 'allow', and on beta 'warn'.
The attribute scheme used here corresponds to an older version of the
RFC, with the `#[staged_api]` crate attribute toggling the staging
behavior of the stability attributes, but the user impact is only
in-tree so I'm not concerned about having to make design changes later
(and I may ultimately prefer the scheme here after all, with the
`#[staged_api]` crate attribute).
Since the Rust codebase itself makes use of unstable features the
compiler and build system to a midly elaborate dance to allow it to
bootstrap while disobeying these lints (which would otherwise be
errors because Rust builds with `-D warnings`).
This patch includes one significant hack that causes a
regression. Because the `format_args!` macro emits calls to unstable
APIs it would trigger the lint. I added a hack to the lint to make it
not trigger, but this in turn causes arguments to `println!` not to be
checked for feature gates. I don't presently understand macro
expansion well enough to fix. This is bug #20661.
Closes #16678
[rc]: https://github.com/rust-lang/rfcs/blob/master/text/0507-release-channels.md
2015-01-06 15:26:08 +01:00
|
|
|
CFG_DISABLE_UNSTABLE_FEATURES=1
|
mk: Update how the build deals with version labels. #16677
Adds a new configure flag, --release-channel, which determines how the version
number should be augmented with a release label, as well as how the distribution
artifacts will be named. This is entirely for use by the build automation.
--release-channel can be either 'source', 'nightly', 'beta', or 'stable'.
Here's a summary of the affect of these values on version number and
artifact naming, respectively:
* source - '0.12.0-pre', 'rust-0.12.0-pre-...'
* nightly - '0.12.0-nightly', 'rust-nightly-...'
* beta - '0.12.0-beta', 'rust-beta-...'
* stable - '0.12.0', 'rust-0.12.0-...'
Per http://discuss.rust-lang.org/t/rfc-impending-changes-to-the-release-process/508/1
2014-09-15 22:40:30 +02:00
|
|
|
endif
|
|
|
|
ifeq ($(CFG_RELEASE_CHANNEL),nightly)
|
|
|
|
CFG_RELEASE=$(CFG_RELEASE_NUM)-nightly
|
2015-01-05 19:28:18 +01:00
|
|
|
# When building nightly distributables just reuse the same "nightly" name
|
2015-01-05 19:25:49 +01:00
|
|
|
# so when we upload we'll always override the previous nighly. This
|
|
|
|
# doesn't actually impact the version reported by rustc - it's just
|
|
|
|
# for file naming.
|
2014-03-21 20:50:29 +01:00
|
|
|
CFG_PACKAGE_VERS=nightly
|
|
|
|
endif
|
2014-09-26 00:28:00 +02:00
|
|
|
ifeq ($(CFG_RELEASE_CHANNEL),dev)
|
|
|
|
CFG_RELEASE=$(CFG_RELEASE_NUM)-dev
|
|
|
|
CFG_PACKAGE_VERS=$(CFG_RELEASE_NUM)-dev
|
mk: Update how the build deals with version labels. #16677
Adds a new configure flag, --release-channel, which determines how the version
number should be augmented with a release label, as well as how the distribution
artifacts will be named. This is entirely for use by the build automation.
--release-channel can be either 'source', 'nightly', 'beta', or 'stable'.
Here's a summary of the affect of these values on version number and
artifact naming, respectively:
* source - '0.12.0-pre', 'rust-0.12.0-pre-...'
* nightly - '0.12.0-nightly', 'rust-nightly-...'
* beta - '0.12.0-beta', 'rust-beta-...'
* stable - '0.12.0', 'rust-0.12.0-...'
Per http://discuss.rust-lang.org/t/rfc-impending-changes-to-the-release-process/508/1
2014-09-15 22:40:30 +02:00
|
|
|
endif
|
|
|
|
|
2014-03-21 20:50:29 +01:00
|
|
|
# The name of the package to use for creating tarballs, installers etc.
|
2015-01-02 22:36:51 +01:00
|
|
|
CFG_PACKAGE_NAME=rustc-$(CFG_PACKAGE_VERS)
|
2014-03-21 20:50:29 +01:00
|
|
|
|
|
|
|
# The version string plus commit information - this is what rustc reports
|
2014-02-14 20:24:22 +01:00
|
|
|
CFG_VERSION = $(CFG_RELEASE)
|
|
|
|
CFG_GIT_DIR := $(CFG_SRC_DIR).git
|
|
|
|
# since $(CFG_GIT) may contain spaces (especially on Windows),
|
|
|
|
# we need to escape them. (" " to r"\ ")
|
|
|
|
# Note that $(subst ...) ignores space after `subst`,
|
|
|
|
# so we use a hack: define $(SPACE) which contains space character.
|
|
|
|
SPACE :=
|
|
|
|
SPACE +=
|
2014-11-10 18:54:25 +01:00
|
|
|
ifneq ($(CFG_GIT),)
|
2014-02-14 20:24:22 +01:00
|
|
|
ifneq ($(wildcard $(subst $(SPACE),\$(SPACE),$(CFG_GIT_DIR))),)
|
2015-02-12 01:48:16 +01:00
|
|
|
CFG_VER_DATE = $(shell git --git-dir='$(CFG_GIT_DIR)' log -1 --date=short --pretty=format:'%cd')
|
2014-02-14 20:24:22 +01:00
|
|
|
CFG_VER_HASH = $(shell git --git-dir='$(CFG_GIT_DIR)' rev-parse HEAD)
|
2014-07-18 06:34:41 +02:00
|
|
|
CFG_SHORT_VER_HASH = $(shell git --git-dir='$(CFG_GIT_DIR)' rev-parse --short=9 HEAD)
|
|
|
|
CFG_VERSION += ($(CFG_SHORT_VER_HASH) $(CFG_VER_DATE))
|
2014-02-14 20:24:22 +01:00
|
|
|
endif
|
|
|
|
endif
|
|
|
|
|
2014-03-21 20:50:29 +01:00
|
|
|
# Windows exe's need numeric versions - don't use anything but
|
2014-02-14 20:24:22 +01:00
|
|
|
# numbers and dots here
|
2014-03-21 20:50:29 +01:00
|
|
|
CFG_VERSION_WIN = $(CFG_RELEASE_NUM)
|
2014-02-14 20:24:22 +01:00
|
|
|
|
2015-01-25 10:48:38 +01:00
|
|
|
CFG_INFO := $(info cfg: version $(CFG_VERSION))
|
2014-02-14 20:24:22 +01:00
|
|
|
|
|
|
|
######################################################################
|
|
|
|
# More configuration
|
|
|
|
######################################################################
|
|
|
|
|
2014-03-21 23:15:45 +01:00
|
|
|
MKFILE_DEPS := config.stamp $(call rwildcard,$(CFG_SRC_DIR)mk/,*)
|
|
|
|
MKFILES_FOR_TARBALL:=$(MKFILE_DEPS)
|
2016-02-02 08:27:04 +01:00
|
|
|
ifneq ($(NO_MKFILE_DEPS),)
|
2014-02-14 09:10:06 +01:00
|
|
|
MKFILE_DEPS :=
|
|
|
|
endif
|
2014-02-14 08:55:49 +01:00
|
|
|
NON_BUILD_HOST = $(filter-out $(CFG_BUILD),$(CFG_HOST))
|
|
|
|
NON_BUILD_TARGET = $(filter-out $(CFG_BUILD),$(CFG_TARGET))
|
|
|
|
|
2016-02-02 08:27:04 +01:00
|
|
|
ifneq ($(MAKE_RESTARTS),)
|
2014-02-14 08:55:49 +01:00
|
|
|
CFG_INFO := $(info cfg: make restarts: $(MAKE_RESTARTS))
|
|
|
|
endif
|
|
|
|
|
|
|
|
CFG_INFO := $(info cfg: build triple $(CFG_BUILD))
|
|
|
|
CFG_INFO := $(info cfg: host triples $(CFG_HOST))
|
|
|
|
CFG_INFO := $(info cfg: target triples $(CFG_TARGET))
|
|
|
|
|
|
|
|
ifneq ($(wildcard $(NON_BUILD_HOST)),)
|
|
|
|
CFG_INFO := $(info cfg: non-build host triples $(NON_BUILD_HOST))
|
|
|
|
endif
|
|
|
|
ifneq ($(wildcard $(NON_BUILD_TARGET)),)
|
|
|
|
CFG_INFO := $(info cfg: non-build target triples $(NON_BUILD_TARGET))
|
|
|
|
endif
|
|
|
|
|
2016-02-02 08:27:04 +01:00
|
|
|
CFG_RUSTC_FLAGS := $(RUSTFLAGS)
|
2014-02-14 08:55:49 +01:00
|
|
|
CFG_GCCISH_CFLAGS :=
|
|
|
|
CFG_GCCISH_LINK_FLAGS :=
|
2014-11-03 00:48:09 +01:00
|
|
|
|
2015-11-02 13:56:09 +01:00
|
|
|
CFG_JEMALLOC_FLAGS :=
|
2014-02-14 08:55:49 +01:00
|
|
|
|
|
|
|
ifdef CFG_DISABLE_OPTIMIZE
|
|
|
|
$(info cfg: disabling rustc optimization (CFG_DISABLE_OPTIMIZE))
|
2016-02-02 08:27:04 +01:00
|
|
|
CFG_RUSTC_FLAGS +=
|
2014-09-07 20:05:32 +02:00
|
|
|
CFG_JEMALLOC_FLAGS += --enable-debug
|
2014-02-14 08:55:49 +01:00
|
|
|
else
|
|
|
|
# The rtopt cfg turns off runtime sanity checks
|
|
|
|
CFG_RUSTC_FLAGS += -O --cfg rtopt
|
|
|
|
endif
|
|
|
|
|
2016-02-02 08:27:04 +01:00
|
|
|
CFG_JEMALLOC_FLAGS += $(JEMALLOC_FLAGS)
|
|
|
|
|
2015-04-08 22:23:44 +02:00
|
|
|
ifdef CFG_ENABLE_DEBUG_ASSERTIONS
|
2015-04-08 22:31:26 +02:00
|
|
|
$(info cfg: enabling debug assertions (CFG_ENABLE_DEBUG_ASSERTIONS))
|
2015-06-01 23:01:13 +02:00
|
|
|
CFG_RUSTC_FLAGS += -C debug-assertions=on
|
2014-02-14 08:55:49 +01:00
|
|
|
endif
|
|
|
|
|
2015-04-08 22:57:37 +02:00
|
|
|
ifdef CFG_ENABLE_DEBUGINFO
|
|
|
|
$(info cfg: enabling debuginfo (CFG_ENABLE_DEBUGINFO))
|
2015-12-11 22:07:11 +01:00
|
|
|
CFG_RUSTC_FLAGS += -g
|
2015-04-08 22:57:37 +02:00
|
|
|
endif
|
|
|
|
|
2016-03-09 21:46:00 +01:00
|
|
|
ifdef CFG_ENABLE_ORBIT
|
|
|
|
$(info cfg: launching MIR (CFG_ENABLE_ORBIT))
|
|
|
|
CFG_RUSTC_FLAGS += -Z orbit
|
|
|
|
endif
|
|
|
|
|
2014-02-14 08:55:49 +01:00
|
|
|
ifdef SAVE_TEMPS
|
|
|
|
CFG_RUSTC_FLAGS += --save-temps
|
|
|
|
endif
|
|
|
|
ifdef ASM_COMMENTS
|
|
|
|
CFG_RUSTC_FLAGS += -Z asm-comments
|
|
|
|
endif
|
|
|
|
ifdef TIME_PASSES
|
|
|
|
CFG_RUSTC_FLAGS += -Z time-passes
|
|
|
|
endif
|
|
|
|
ifdef TIME_LLVM_PASSES
|
|
|
|
CFG_RUSTC_FLAGS += -Z time-llvm-passes
|
|
|
|
endif
|
|
|
|
ifdef TRACE
|
|
|
|
CFG_RUSTC_FLAGS += -Z trace
|
|
|
|
endif
|
2016-01-06 16:24:18 +01:00
|
|
|
ifndef CFG_DISABLE_RPATH
|
2014-06-11 23:52:38 +02:00
|
|
|
CFG_RUSTC_FLAGS += -C rpath
|
2014-02-14 08:55:49 +01:00
|
|
|
endif
|
|
|
|
|
|
|
|
# The executables crated during this compilation process have no need to include
|
|
|
|
# static copies of libstd and libextra. We also generate dynamic versions of all
|
|
|
|
# libraries, so in the interest of space, prefer dynamic linking throughout the
|
|
|
|
# compilation process.
|
|
|
|
#
|
2014-11-03 08:02:53 +01:00
|
|
|
# Note though that these flags are omitted for the *bins* in stage2+. This means
|
|
|
|
# that the snapshot will be generated with a statically linked rustc so we only
|
|
|
|
# have to worry about the distribution of one file (with its native dynamic
|
2014-02-14 08:55:49 +01:00
|
|
|
# dependencies)
|
2015-07-27 22:41:35 +02:00
|
|
|
RUSTFLAGS_STAGE0 += -C prefer-dynamic -C no-stack-check
|
2014-02-14 08:55:49 +01:00
|
|
|
RUSTFLAGS_STAGE1 += -C prefer-dynamic
|
2014-11-03 08:02:53 +01:00
|
|
|
RUST_LIB_FLAGS_ST2 += -C prefer-dynamic
|
2014-11-06 20:29:49 +01:00
|
|
|
RUST_LIB_FLAGS_ST3 += -C prefer-dynamic
|
2014-02-14 08:55:49 +01:00
|
|
|
|
2014-08-09 01:54:26 +02:00
|
|
|
# Landing pads require a lot of codegen. We can get through bootstrapping faster
|
|
|
|
# by not emitting them.
|
2015-09-29 00:01:48 +02:00
|
|
|
|
|
|
|
ifdef CFG_DISABLE_STAGE0_LANDING_PADS
|
|
|
|
RUSTFLAGS_STAGE0 += -Z no-landing-pads
|
|
|
|
endif
|
2014-08-09 01:54:26 +02:00
|
|
|
|
2014-02-14 08:55:49 +01:00
|
|
|
# platform-specific auto-configuration
|
|
|
|
include $(CFG_SRC_DIR)mk/platform.mk
|
|
|
|
|
|
|
|
# Run the stage1/2 compilers under valgrind
|
|
|
|
ifdef VALGRIND_COMPILE
|
2015-11-02 13:56:22 +01:00
|
|
|
CFG_VALGRIND_COMPILE := $(CFG_VALGRIND)
|
2014-02-14 08:55:49 +01:00
|
|
|
else
|
|
|
|
CFG_VALGRIND_COMPILE :=
|
|
|
|
endif
|
|
|
|
|
2014-10-09 01:11:37 +02:00
|
|
|
|
|
|
|
ifndef CFG_DISABLE_VALGRIND_RPASS
|
2016-02-02 08:27:04 +01:00
|
|
|
$(info cfg: enabling valgrind run-pass tests (CFG_ENABLE_VALGRIND_RPASS))
|
2015-01-25 00:53:11 +01:00
|
|
|
$(info cfg: valgrind-rpass command set to $(CFG_VALGRIND))
|
2016-02-02 08:27:04 +01:00
|
|
|
CFG_VALGRIND_RPASS :=$(CFG_VALGRIND)
|
2014-10-09 01:11:37 +02:00
|
|
|
else
|
2015-05-08 19:47:28 +02:00
|
|
|
$(info cfg: disabling valgrind run-pass tests)
|
2014-10-09 01:11:37 +02:00
|
|
|
CFG_VALGRIND_RPASS :=
|
|
|
|
endif
|
|
|
|
|
2014-10-07 09:00:26 +02:00
|
|
|
|
2014-02-14 08:55:49 +01:00
|
|
|
ifdef CFG_ENABLE_VALGRIND
|
|
|
|
$(info cfg: enabling valgrind (CFG_ENABLE_VALGRIND))
|
2015-11-02 16:39:46 +01:00
|
|
|
CFG_JEMALLOC_FLAGS += --enable-valgrind
|
2014-02-14 08:55:49 +01:00
|
|
|
else
|
|
|
|
CFG_VALGRIND :=
|
|
|
|
endif
|
|
|
|
|
|
|
|
######################################################################
|
|
|
|
# Target-and-rule "utility variables"
|
|
|
|
######################################################################
|
|
|
|
|
2014-11-20 21:56:58 +01:00
|
|
|
define DEF_FOR_TARGET
|
2014-02-14 08:55:49 +01:00
|
|
|
X_$(1) := $(CFG_EXE_SUFFIX_$(1))
|
2014-11-20 21:56:58 +01:00
|
|
|
ifndef CFG_LLVM_TARGET_$(1)
|
|
|
|
CFG_LLVM_TARGET_$(1) := $(1)
|
|
|
|
endif
|
2014-02-14 08:55:49 +01:00
|
|
|
endef
|
2014-07-23 06:45:08 +02:00
|
|
|
$(foreach target,$(CFG_TARGET), \
|
2014-11-20 21:56:58 +01:00
|
|
|
$(eval $(call DEF_FOR_TARGET,$(target))))
|
2014-02-14 08:55:49 +01:00
|
|
|
|
|
|
|
# "Source" files we generate in builddir along the way.
|
|
|
|
GENERATED :=
|
|
|
|
|
|
|
|
# Delete the built-in rules.
|
|
|
|
.SUFFIXES:
|
|
|
|
%:: %,v
|
|
|
|
%:: RCS/%,v
|
|
|
|
%:: RCS/%
|
|
|
|
%:: s.%
|
|
|
|
%:: SCCS/s.%
|
|
|
|
|
|
|
|
|
|
|
|
######################################################################
|
|
|
|
# Cleaning out old crates
|
|
|
|
######################################################################
|
|
|
|
|
|
|
|
# $(1) is the path for directory to match against
|
|
|
|
# $(2) is the glob to use in the match
|
|
|
|
#
|
|
|
|
# Note that a common bug is to accidentally construct the glob denoted
|
|
|
|
# by $(2) with a space character prefix, which invalidates the
|
|
|
|
# construction $(1)$(2).
|
|
|
|
define CHECK_FOR_OLD_GLOB_MATCHES
|
|
|
|
$(Q)MATCHES="$(wildcard $(1))"; if [ -n "$$MATCHES" ] ; then echo "warning: there are previous" \'$(notdir $(2))\' "libraries:" $$MATCHES; fi
|
|
|
|
endef
|
|
|
|
|
|
|
|
# Same interface as above, but deletes rather than just listing the files.
|
|
|
|
ifdef VERBOSE
|
|
|
|
define REMOVE_ALL_OLD_GLOB_MATCHES
|
|
|
|
$(Q)MATCHES="$(wildcard $(1))"; if [ -n "$$MATCHES" ] ; then echo "warning: removing previous" \'$(notdir $(1))\' "libraries:" $$MATCHES; rm $$MATCHES ; fi
|
|
|
|
endef
|
|
|
|
else
|
|
|
|
define REMOVE_ALL_OLD_GLOB_MATCHES
|
|
|
|
$(Q)MATCHES="$(wildcard $(1))"; if [ -n "$$MATCHES" ] ; then rm $$MATCHES ; fi
|
|
|
|
endef
|
|
|
|
endif
|
|
|
|
|
|
|
|
# We use a different strategy for LIST_ALL_OLD_GLOB_MATCHES_EXCEPT
|
|
|
|
# than in the macros above because it needs the result of running the
|
|
|
|
# `ls` command after other rules in the command list have run; the
|
|
|
|
# macro-expander for $(wildcard ...) would deliver its results too
|
|
|
|
# soon. (This is in contrast to the macros above, which are meant to
|
|
|
|
# be run at the outset of a command list in a rule.)
|
|
|
|
ifdef VERBOSE
|
|
|
|
define LIST_ALL_OLD_GLOB_MATCHES
|
|
|
|
@echo "info: now are following matches for" '$(notdir $(1))' "libraries:"
|
|
|
|
@( ls $(1) 2>/dev/null || true )
|
|
|
|
endef
|
|
|
|
else
|
|
|
|
define LIST_ALL_OLD_GLOB_MATCHES
|
|
|
|
endef
|
|
|
|
endif
|
|
|
|
|
|
|
|
######################################################################
|
|
|
|
# LLVM macros
|
|
|
|
######################################################################
|
|
|
|
|
2015-12-15 22:34:06 +01:00
|
|
|
LLVM_OPTIONAL_COMPONENTS=x86 arm aarch64 mips powerpc pnacl
|
2015-08-22 06:43:56 +02:00
|
|
|
LLVM_REQUIRED_COMPONENTS=ipo bitreader bitwriter linker asmparser mcjit \
|
2014-02-14 08:55:49 +01:00
|
|
|
interpreter instrumentation
|
|
|
|
|
2015-08-22 06:43:56 +02:00
|
|
|
ifneq ($(CFG_LLVM_ROOT),)
|
|
|
|
# Ensure we only try to link targets that the installed LLVM actually has:
|
|
|
|
LLVM_COMPONENTS := $(filter $(shell $(CFG_LLVM_ROOT)/bin/llvm-config$(X_$(CFG_BUILD)) --components),\
|
|
|
|
$(LLVM_OPTIONAL_COMPONENTS)) $(LLVM_REQUIRED_COMPONENTS)
|
|
|
|
else
|
|
|
|
LLVM_COMPONENTS := $(LLVM_OPTIONAL_COMPONENTS) $(LLVM_REQUIRED_COMPONENTS)
|
|
|
|
endif
|
|
|
|
|
2014-02-14 08:55:49 +01:00
|
|
|
# Only build these LLVM tools
|
|
|
|
LLVM_TOOLS=bugpoint llc llvm-ar llvm-as llvm-dis llvm-mc opt llvm-extract
|
|
|
|
|
|
|
|
define DEF_LLVM_VARS
|
|
|
|
# The configure script defines these variables with the target triples
|
|
|
|
# separated by Z. This defines new ones with the expected format.
|
2014-02-21 03:07:33 +01:00
|
|
|
ifeq ($$(CFG_LLVM_ROOT),)
|
2014-02-14 08:55:49 +01:00
|
|
|
CFG_LLVM_BUILD_DIR_$(1):=$$(CFG_LLVM_BUILD_DIR_$(subst -,_,$(1)))
|
|
|
|
CFG_LLVM_INST_DIR_$(1):=$$(CFG_LLVM_INST_DIR_$(subst -,_,$(1)))
|
2014-02-21 03:07:33 +01:00
|
|
|
else
|
|
|
|
CFG_LLVM_INST_DIR_$(1):=$$(CFG_LLVM_ROOT)
|
|
|
|
endif
|
2014-02-14 08:55:49 +01:00
|
|
|
|
|
|
|
# Any rules that depend on LLVM should depend on LLVM_CONFIG
|
|
|
|
LLVM_CONFIG_$(1):=$$(CFG_LLVM_INST_DIR_$(1))/bin/llvm-config$$(X_$(1))
|
|
|
|
LLVM_MC_$(1):=$$(CFG_LLVM_INST_DIR_$(1))/bin/llvm-mc$$(X_$(1))
|
2015-05-11 23:14:11 +02:00
|
|
|
LLVM_AR_$(1):=$$(CFG_LLVM_INST_DIR_$(1))/bin/llvm-ar$$(X_$(1))
|
2014-02-14 08:55:49 +01:00
|
|
|
LLVM_VERSION_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --version)
|
|
|
|
LLVM_BINDIR_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --bindir)
|
|
|
|
LLVM_INCDIR_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --includedir)
|
|
|
|
LLVM_LIBDIR_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --libdir)
|
2015-08-26 17:21:36 +02:00
|
|
|
LLVM_LIBDIR_RUSTFLAGS_$(1)=-L native="$$(LLVM_LIBDIR_$(1))"
|
2014-02-14 08:55:49 +01:00
|
|
|
LLVM_LDFLAGS_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --ldflags)
|
2015-05-11 23:03:45 +02:00
|
|
|
ifeq ($$(findstring freebsd,$(1)),freebsd)
|
2014-02-14 08:55:49 +01:00
|
|
|
# On FreeBSD, it may search wrong headers (that are for pre-installed LLVM),
|
|
|
|
# so we replace -I with -iquote to ensure that it searches bundled LLVM first.
|
|
|
|
LLVM_CXXFLAGS_$(1)=$$(subst -I, -iquote , $$(shell "$$(LLVM_CONFIG_$(1))" --cxxflags))
|
2015-05-11 23:03:45 +02:00
|
|
|
else
|
|
|
|
LLVM_CXXFLAGS_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --cxxflags)
|
|
|
|
endif
|
2014-02-14 08:55:49 +01:00
|
|
|
LLVM_HOST_TRIPLE_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --host-target)
|
|
|
|
|
|
|
|
LLVM_AS_$(1)=$$(CFG_LLVM_INST_DIR_$(1))/bin/llvm-as$$(X_$(1))
|
|
|
|
LLC_$(1)=$$(CFG_LLVM_INST_DIR_$(1))/bin/llc$$(X_$(1))
|
|
|
|
|
2015-08-22 06:43:56 +02:00
|
|
|
LLVM_ALL_COMPONENTS_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --components)
|
|
|
|
|
2014-02-14 08:55:49 +01:00
|
|
|
endef
|
|
|
|
|
|
|
|
$(foreach host,$(CFG_HOST), \
|
|
|
|
$(eval $(call DEF_LLVM_VARS,$(host))))
|
|
|
|
|
|
|
|
######################################################################
|
|
|
|
# Exports for sub-utilities
|
|
|
|
######################################################################
|
|
|
|
|
|
|
|
# Note that any variable that re-configure should pick up needs to be
|
|
|
|
# exported
|
|
|
|
|
|
|
|
export CFG_SRC_DIR
|
2015-06-12 19:40:07 +02:00
|
|
|
export CFG_SRC_DIR_RELATIVE
|
2014-02-14 08:55:49 +01:00
|
|
|
export CFG_BUILD_DIR
|
2014-05-19 05:37:07 +02:00
|
|
|
ifdef CFG_VER_DATE
|
|
|
|
export CFG_VER_DATE
|
|
|
|
endif
|
|
|
|
ifdef CFG_VER_HASH
|
|
|
|
export CFG_VER_HASH
|
|
|
|
endif
|
2014-02-14 08:55:49 +01:00
|
|
|
export CFG_VERSION
|
|
|
|
export CFG_VERSION_WIN
|
|
|
|
export CFG_RELEASE
|
2014-03-21 20:50:29 +01:00
|
|
|
export CFG_PACKAGE_NAME
|
2014-02-14 08:55:49 +01:00
|
|
|
export CFG_BUILD
|
Preliminary feature staging
This partially implements the feature staging described in the
[release channel RFC][rc]. It does not yet fully conform to the RFC as
written, but does accomplish its goals sufficiently for the 1.0 alpha
release.
It has three primary user-visible effects:
* On the nightly channel, use of unstable APIs generates a warning.
* On the beta channel, use of unstable APIs generates a warning.
* On the beta channel, use of feature gates generates a warning.
Code that does not trigger these warnings is considered 'stable',
modulo pre-1.0 bugs.
Disabling the warnings for unstable APIs continues to be done in the
existing (i.e. old) style, via `#[allow(...)]`, not that specified in
the RFC. I deem this marginally acceptable since any code that must do
this is not using the stable dialect of Rust.
Use of feature gates is itself gated with the new 'unstable_features'
lint, on nightly set to 'allow', and on beta 'warn'.
The attribute scheme used here corresponds to an older version of the
RFC, with the `#[staged_api]` crate attribute toggling the staging
behavior of the stability attributes, but the user impact is only
in-tree so I'm not concerned about having to make design changes later
(and I may ultimately prefer the scheme here after all, with the
`#[staged_api]` crate attribute).
Since the Rust codebase itself makes use of unstable features the
compiler and build system to a midly elaborate dance to allow it to
bootstrap while disobeying these lints (which would otherwise be
errors because Rust builds with `-D warnings`).
This patch includes one significant hack that causes a
regression. Because the `format_args!` macro emits calls to unstable
APIs it would trigger the lint. I added a hack to the lint to make it
not trigger, but this in turn causes arguments to `println!` not to be
checked for feature gates. I don't presently understand macro
expansion well enough to fix. This is bug #20661.
Closes #16678
[rc]: https://github.com/rust-lang/rfcs/blob/master/text/0507-release-channels.md
2015-01-06 15:26:08 +01:00
|
|
|
export CFG_RELEASE_CHANNEL
|
2014-02-14 08:55:49 +01:00
|
|
|
export CFG_LLVM_ROOT
|
|
|
|
export CFG_PREFIX
|
|
|
|
export CFG_LIBDIR
|
|
|
|
export CFG_LIBDIR_RELATIVE
|
|
|
|
export CFG_DISABLE_INJECT_STD_VERSION
|
Preliminary feature staging
This partially implements the feature staging described in the
[release channel RFC][rc]. It does not yet fully conform to the RFC as
written, but does accomplish its goals sufficiently for the 1.0 alpha
release.
It has three primary user-visible effects:
* On the nightly channel, use of unstable APIs generates a warning.
* On the beta channel, use of unstable APIs generates a warning.
* On the beta channel, use of feature gates generates a warning.
Code that does not trigger these warnings is considered 'stable',
modulo pre-1.0 bugs.
Disabling the warnings for unstable APIs continues to be done in the
existing (i.e. old) style, via `#[allow(...)]`, not that specified in
the RFC. I deem this marginally acceptable since any code that must do
this is not using the stable dialect of Rust.
Use of feature gates is itself gated with the new 'unstable_features'
lint, on nightly set to 'allow', and on beta 'warn'.
The attribute scheme used here corresponds to an older version of the
RFC, with the `#[staged_api]` crate attribute toggling the staging
behavior of the stability attributes, but the user impact is only
in-tree so I'm not concerned about having to make design changes later
(and I may ultimately prefer the scheme here after all, with the
`#[staged_api]` crate attribute).
Since the Rust codebase itself makes use of unstable features the
compiler and build system to a midly elaborate dance to allow it to
bootstrap while disobeying these lints (which would otherwise be
errors because Rust builds with `-D warnings`).
This patch includes one significant hack that causes a
regression. Because the `format_args!` macro emits calls to unstable
APIs it would trigger the lint. I added a hack to the lint to make it
not trigger, but this in turn causes arguments to `println!` not to be
checked for feature gates. I don't presently understand macro
expansion well enough to fix. This is bug #20661.
Closes #16678
[rc]: https://github.com/rust-lang/rfcs/blob/master/text/0507-release-channels.md
2015-01-06 15:26:08 +01:00
|
|
|
ifdef CFG_DISABLE_UNSTABLE_FEATURES
|
|
|
|
CFG_INFO := $(info cfg: disabling unstable features (CFG_DISABLE_UNSTABLE_FEATURES))
|
|
|
|
# Turn on feature-staging
|
|
|
|
export CFG_DISABLE_UNSTABLE_FEATURES
|
|
|
|
# Subvert unstable feature lints to do the self-build
|
2015-01-17 07:31:31 +01:00
|
|
|
export RUSTC_BOOTSTRAP_KEY:=$(CFG_BOOTSTRAP_KEY)
|
2015-01-17 07:33:00 +01:00
|
|
|
endif
|
|
|
|
export CFG_BOOTSTRAP_KEY
|
2015-12-29 23:33:58 +01:00
|
|
|
ifdef CFG_MUSL_ROOT
|
|
|
|
export CFG_MUSL_ROOT
|
|
|
|
endif
|
2014-02-14 08:55:49 +01:00
|
|
|
|
|
|
|
######################################################################
|
|
|
|
# Per-stage targets and runner
|
|
|
|
######################################################################
|
|
|
|
|
2014-12-03 23:48:18 +01:00
|
|
|
# Valid setting-strings are 'all', 'none', 'gdb', 'lldb'
|
|
|
|
# This 'function' will determine which debugger scripts to copy based on a
|
|
|
|
# target triple. See debuggers.mk for more information.
|
|
|
|
TRIPLE_TO_DEBUGGER_SCRIPT_SETTING=\
|
|
|
|
$(if $(findstring windows,$(1)),none,$(if $(findstring darwin,$(1)),lldb,gdb))
|
|
|
|
|
2016-02-02 08:27:04 +01:00
|
|
|
STAGES = 0 1 2 3
|
|
|
|
|
2014-02-14 08:55:49 +01:00
|
|
|
define SREQ
|
|
|
|
# $(1) is the stage number
|
|
|
|
# $(2) is the target triple
|
|
|
|
# $(3) is the host triple
|
|
|
|
|
|
|
|
# Destinations of artifacts for the host compiler
|
|
|
|
HROOT$(1)_H_$(3) = $(3)/stage$(1)
|
|
|
|
HBIN$(1)_H_$(3) = $$(HROOT$(1)_H_$(3))/bin
|
2015-11-01 07:26:12 +01:00
|
|
|
|
2014-08-17 08:23:36 +02:00
|
|
|
ifeq ($$(CFG_WINDOWSY_$(3)),1)
|
2015-11-01 07:26:12 +01:00
|
|
|
# On Windows we always store host runtime libraries in the 'bin' directory because
|
|
|
|
# there's no rpath. Target libraries go under $CFG_LIBDIR_RELATIVE (usually 'lib').
|
2015-11-15 05:59:35 +01:00
|
|
|
HLIB_RELATIVE$(1)_H_$(3) = bin
|
2015-11-01 07:26:12 +01:00
|
|
|
TROOT$(1)_T_$(2)_H_$(3) = $$(HROOT$(1)_H_$(3))/$$(CFG_LIBDIR_RELATIVE)/rustlib/$(2)
|
|
|
|
# Remove the next 3 lines after a snapshot
|
|
|
|
ifeq ($(1),0)
|
|
|
|
RUSTFLAGS_STAGE0 += -L $$(TROOT$(1)_T_$(2)_H_$(3))/lib
|
|
|
|
endif
|
|
|
|
|
2014-08-17 08:23:36 +02:00
|
|
|
else
|
2015-11-01 07:26:12 +01:00
|
|
|
|
2014-08-17 08:23:36 +02:00
|
|
|
ifeq ($(1),0)
|
2015-11-15 05:59:35 +01:00
|
|
|
HLIB_RELATIVE$(1)_H_$(3) = lib
|
2014-08-17 08:23:36 +02:00
|
|
|
else
|
2015-11-15 05:59:35 +01:00
|
|
|
HLIB_RELATIVE$(1)_H_$(3) = $$(CFG_LIBDIR_RELATIVE)
|
2014-08-17 08:23:36 +02:00
|
|
|
endif
|
2015-11-01 07:26:12 +01:00
|
|
|
TROOT$(1)_T_$(2)_H_$(3) = $$(HLIB$(1)_H_$(3))/rustlib/$(2)
|
|
|
|
|
2014-08-17 08:23:36 +02:00
|
|
|
endif
|
2015-11-15 05:59:35 +01:00
|
|
|
HLIB$(1)_H_$(3) = $$(HROOT$(1)_H_$(3))/$$(HLIB_RELATIVE$(1)_H_$(3))
|
2014-02-14 08:55:49 +01:00
|
|
|
|
|
|
|
# Destinations of artifacts for target architectures
|
|
|
|
TBIN$(1)_T_$(2)_H_$(3) = $$(TROOT$(1)_T_$(2)_H_$(3))/bin
|
|
|
|
TLIB$(1)_T_$(2)_H_$(3) = $$(TROOT$(1)_T_$(2)_H_$(3))/lib
|
|
|
|
|
|
|
|
# Preqrequisites for using the stageN compiler
|
|
|
|
ifeq ($(1),0)
|
|
|
|
HSREQ$(1)_H_$(3) = $$(HBIN$(1)_H_$(3))/rustc$$(X_$(3))
|
|
|
|
else
|
|
|
|
HSREQ$(1)_H_$(3) = \
|
|
|
|
$$(HBIN$(1)_H_$(3))/rustc$$(X_$(3)) \
|
2014-11-13 17:25:15 +01:00
|
|
|
$$(MKFILE_DEPS) \
|
2014-12-03 23:48:18 +01:00
|
|
|
tmp/install-debugger-scripts$(1)_H_$(3)-$$(call TRIPLE_TO_DEBUGGER_SCRIPT_SETTING,$(3)).done
|
2014-02-14 08:55:49 +01:00
|
|
|
endif
|
|
|
|
|
|
|
|
# Prerequisites for using the stageN compiler to build target artifacts
|
|
|
|
TSREQ$(1)_T_$(2)_H_$(3) = \
|
|
|
|
$$(HSREQ$(1)_H_$(3)) \
|
2015-11-08 02:44:44 +01:00
|
|
|
$$(foreach obj,$$(REQUIRED_OBJECTS_$(2)),\
|
2015-04-22 00:42:05 +02:00
|
|
|
$$(TLIB$(1)_T_$(2)_H_$(3))/$$(obj))
|
2014-02-14 08:55:49 +01:00
|
|
|
|
|
|
|
# Prerequisites for a working stageN compiler and libraries, for a specific
|
|
|
|
# target
|
|
|
|
SREQ$(1)_T_$(2)_H_$(3) = \
|
|
|
|
$$(TSREQ$(1)_T_$(2)_H_$(3)) \
|
2016-02-08 19:57:41 +01:00
|
|
|
$$(foreach dep,$$(TARGET_CRATES_$(2)), \
|
2014-11-13 17:25:15 +01:00
|
|
|
$$(TLIB$(1)_T_$(2)_H_$(3))/stamp.$$(dep)) \
|
2014-12-03 23:48:18 +01:00
|
|
|
tmp/install-debugger-scripts$(1)_T_$(2)_H_$(3)-$$(call TRIPLE_TO_DEBUGGER_SCRIPT_SETTING,$(2)).done
|
2014-02-14 08:55:49 +01:00
|
|
|
|
|
|
|
# Prerequisites for a working stageN compiler and complete set of target
|
|
|
|
# libraries
|
|
|
|
CSREQ$(1)_T_$(2)_H_$(3) = \
|
|
|
|
$$(TSREQ$(1)_T_$(2)_H_$(3)) \
|
|
|
|
$$(HBIN$(1)_H_$(3))/rustdoc$$(X_$(3)) \
|
2016-02-08 19:57:41 +01:00
|
|
|
$$(foreach dep,$$(HOST_CRATES),$$(TLIB$(1)_T_$(2)_H_$(3))/stamp.$$(dep))
|
2014-02-14 08:55:49 +01:00
|
|
|
|
|
|
|
ifeq ($(1),0)
|
2014-03-06 08:35:12 +01:00
|
|
|
# Don't run the stage0 compiler under valgrind - that ship has sailed
|
2014-02-14 08:55:49 +01:00
|
|
|
CFG_VALGRIND_COMPILE$(1) =
|
|
|
|
else
|
|
|
|
CFG_VALGRIND_COMPILE$(1) = $$(CFG_VALGRIND_COMPILE)
|
|
|
|
endif
|
|
|
|
|
|
|
|
# Add RUSTFLAGS_STAGEN values to the build command
|
|
|
|
EXTRAFLAGS_STAGE$(1) = $$(RUSTFLAGS_STAGE$(1))
|
|
|
|
|
|
|
|
CFGFLAG$(1)_T_$(2)_H_$(3) = stage$(1)
|
|
|
|
|
2014-04-11 19:52:01 +02:00
|
|
|
endef
|
|
|
|
|
|
|
|
# Same macro/variables as above, but defined in a separate loop so it can use
|
Refactoring: Introduce distinct host and target rpath var setters.
Two line summary: Distinguish HOST_RPATH and TARGET_RPATH; added
RPATH_LINK_SEARCH; skip tests broken in stage1; general cleanup.
`HOST_RPATH_VAR$(1)_T_$(2)_H_$(3)` and `TARGET_RPATH_VAR$(1)_T_$(2)_H_$(3)`
both match the format of the old `RPATH_VAR$(1)_T_$(2)_H_$(3)` (which
is still being set the same way that it was before, to one of either
HOST/TARGET depending on what stage we are building). Namely, the format
is <XXX>_RPATH_VAR = "<LD_LIB_PATH_ENVVAR>=<COLON_SEP_PATH_ENTRIES>"
What this commit does:
* Pass both of the (newly introduced) HOST and TARGET rpath setup vars
to `maketest.py`
* Update `maketest.py` to no longer update the LD_LIBRARY_PATH itself
Instead, it passes along the HOST and TARGET rpath setup vars in
environment variables `HOST_RPATH_ENV` and `TARGET_RPATH_ENV`
* Also, pass the current stage number to maketest.py; it in turn
passes it (via an env var) to run-make tests.
This allows the run-make tests to selectively change behavior
(e.g. turn themselves off) to deal with incompatibilities with
e.g. stage1.
* Cleanup: Distinguish in tools.mk between the command to run (`RUN`)
and the file to generate to drive that command (`RUN_BINFILE`). The
main thing this enables is that `RUN` can now setup the
`TARGET_RPATH_ENV` without having to dirty up the runner code in
each of the `run-make` Makefiles.
* Cleanup: Factored out commands to delete dylib/rlib into
REMOVE_DYLIBS/REMOVE_RLIBS.
There were places where we were only calling `rm $(call DYLIB,foo)`
even though we really needed to get rid of the whole glob (at least
based on alex's findings on #13753 that removing the symlink does not
suffice).
Therefore rather than peppering the code with the awkward
`rm $(TMPDIR)/$(call DYLIB_GLOB,foo)`, I instead introduced a common
`REMOVE_DYLIBS` user function that expands into that when called.
After I adding an analogous `REMOVE_RLIBS`, I changed all of the
existing calls that rm dylibs or rlibs to use these routines
instead.
Note that the latter is not a true refactoring since I may have
changed cases where it was our intent to only remove the sym-link.
(But if that is the case, then we need to more deeply investigate
alex's findings on #13753 where the system was still dynamically
loading up the non-symlinked libraries that it finds on the load
path.)
* Added RPATH_LINK_SEARCH command and use it on Linux.
On some platforms, namely Linux, when you have libboot.so that has
its internal rpath set (to e.g. $(ORIGIN)/path/to/HOSTDIR), the
linker still complains when you do the link step and it does not
know where to find libraries that libboot.so depends upon that live
in HOSTDIR (think e.g. librustuv.so).
As far as I can tell, the GNU linker will consult the
LD_LIBRARY_PATH as part of the linking process to find such
libraries. But if you want to be more careful and not override
LD_LIBRARY_PATH for the `gcc` invocation, then you need some other
way to tell the linker where it can find the libraries that
libboot.so needs. The solution to this on Linux is the
`-Wl,-rpath-link` command line option.
However, this command line option does not exist on Mac OS X, (which
appears to be figuring out how to resolve the libboot.dylib
dependency by some other means, perhaps by consulting the rpath
setting within libboot.dylib).
So, in order to abstract over this distinction, I added the
RPATH_LINK_SEARCH macro to the run-make infrastructure and added
calls to it where necessary to get Linux working. On architectures
other than Linux, the macro expands to nothing.
* Disable miscellaneous tests atop stage1.
* An especially interesting instance of the previous bullet point:
Excuse regex from doing rustdoc tests atop stage1.
This was a (nearly-) final step to get `make check-stage1` working
again.
The use of a special-case check for regex here is ugly but is
analogous other similar checks for regex such as the one that landed
in PR #13844.
The way this is written, the user will get a reminder that
doc-crate-regex is being skipped whenever their rules attempt to do
the crate documentation tests. This is deliberate: I want people
running `make check-stage1` to be reminded about which cases are
being skipped. (But if such echo noise is considered offensive, it
can obviously be removed.)
* Got windows working with the above changes.
This portion of the commit is a cleanup revision of the (previously
mentioned on try builds) re-architecting of how the LD_LIBRARY_PATH
setup and extension is handled in order to accommodate Windows' (1.)
use of `$PATH` for that purpose and (2.) use of spaces in `$PATH`
entries (problematic for make and for interoperation with tools at
the shell).
* In addition, since the code has been rearchitected to pass the
HOST_RPATH_DIR/TARGET_RPATH_DIR rather than a whole sh
environment-variable setting command, there is no need to for the
convert_path_spec calls in maketest.py, which in fact were put in
place to placate Windows but were now causing the Windows builds to
fail. Instead we just convert the paths to absolute paths just like
all of the other path arguments.
Also, note for makefile hackers: apparently you cannot quote operands
to `ifeq` in Makefile (or at least, you need to be careful about
adding them, e.g. to only one side).
2014-04-25 18:22:23 +02:00
|
|
|
# all the variables above for all archs. The RPATH_VAR setup sometimes needs to
|
2014-04-11 19:52:01 +02:00
|
|
|
# reach across triples to get things in order.
|
Refactoring: Introduce distinct host and target rpath var setters.
Two line summary: Distinguish HOST_RPATH and TARGET_RPATH; added
RPATH_LINK_SEARCH; skip tests broken in stage1; general cleanup.
`HOST_RPATH_VAR$(1)_T_$(2)_H_$(3)` and `TARGET_RPATH_VAR$(1)_T_$(2)_H_$(3)`
both match the format of the old `RPATH_VAR$(1)_T_$(2)_H_$(3)` (which
is still being set the same way that it was before, to one of either
HOST/TARGET depending on what stage we are building). Namely, the format
is <XXX>_RPATH_VAR = "<LD_LIB_PATH_ENVVAR>=<COLON_SEP_PATH_ENTRIES>"
What this commit does:
* Pass both of the (newly introduced) HOST and TARGET rpath setup vars
to `maketest.py`
* Update `maketest.py` to no longer update the LD_LIBRARY_PATH itself
Instead, it passes along the HOST and TARGET rpath setup vars in
environment variables `HOST_RPATH_ENV` and `TARGET_RPATH_ENV`
* Also, pass the current stage number to maketest.py; it in turn
passes it (via an env var) to run-make tests.
This allows the run-make tests to selectively change behavior
(e.g. turn themselves off) to deal with incompatibilities with
e.g. stage1.
* Cleanup: Distinguish in tools.mk between the command to run (`RUN`)
and the file to generate to drive that command (`RUN_BINFILE`). The
main thing this enables is that `RUN` can now setup the
`TARGET_RPATH_ENV` without having to dirty up the runner code in
each of the `run-make` Makefiles.
* Cleanup: Factored out commands to delete dylib/rlib into
REMOVE_DYLIBS/REMOVE_RLIBS.
There were places where we were only calling `rm $(call DYLIB,foo)`
even though we really needed to get rid of the whole glob (at least
based on alex's findings on #13753 that removing the symlink does not
suffice).
Therefore rather than peppering the code with the awkward
`rm $(TMPDIR)/$(call DYLIB_GLOB,foo)`, I instead introduced a common
`REMOVE_DYLIBS` user function that expands into that when called.
After I adding an analogous `REMOVE_RLIBS`, I changed all of the
existing calls that rm dylibs or rlibs to use these routines
instead.
Note that the latter is not a true refactoring since I may have
changed cases where it was our intent to only remove the sym-link.
(But if that is the case, then we need to more deeply investigate
alex's findings on #13753 where the system was still dynamically
loading up the non-symlinked libraries that it finds on the load
path.)
* Added RPATH_LINK_SEARCH command and use it on Linux.
On some platforms, namely Linux, when you have libboot.so that has
its internal rpath set (to e.g. $(ORIGIN)/path/to/HOSTDIR), the
linker still complains when you do the link step and it does not
know where to find libraries that libboot.so depends upon that live
in HOSTDIR (think e.g. librustuv.so).
As far as I can tell, the GNU linker will consult the
LD_LIBRARY_PATH as part of the linking process to find such
libraries. But if you want to be more careful and not override
LD_LIBRARY_PATH for the `gcc` invocation, then you need some other
way to tell the linker where it can find the libraries that
libboot.so needs. The solution to this on Linux is the
`-Wl,-rpath-link` command line option.
However, this command line option does not exist on Mac OS X, (which
appears to be figuring out how to resolve the libboot.dylib
dependency by some other means, perhaps by consulting the rpath
setting within libboot.dylib).
So, in order to abstract over this distinction, I added the
RPATH_LINK_SEARCH macro to the run-make infrastructure and added
calls to it where necessary to get Linux working. On architectures
other than Linux, the macro expands to nothing.
* Disable miscellaneous tests atop stage1.
* An especially interesting instance of the previous bullet point:
Excuse regex from doing rustdoc tests atop stage1.
This was a (nearly-) final step to get `make check-stage1` working
again.
The use of a special-case check for regex here is ugly but is
analogous other similar checks for regex such as the one that landed
in PR #13844.
The way this is written, the user will get a reminder that
doc-crate-regex is being skipped whenever their rules attempt to do
the crate documentation tests. This is deliberate: I want people
running `make check-stage1` to be reminded about which cases are
being skipped. (But if such echo noise is considered offensive, it
can obviously be removed.)
* Got windows working with the above changes.
This portion of the commit is a cleanup revision of the (previously
mentioned on try builds) re-architecting of how the LD_LIBRARY_PATH
setup and extension is handled in order to accommodate Windows' (1.)
use of `$PATH` for that purpose and (2.) use of spaces in `$PATH`
entries (problematic for make and for interoperation with tools at
the shell).
* In addition, since the code has been rearchitected to pass the
HOST_RPATH_DIR/TARGET_RPATH_DIR rather than a whole sh
environment-variable setting command, there is no need to for the
convert_path_spec calls in maketest.py, which in fact were put in
place to placate Windows but were now causing the Windows builds to
fail. Instead we just convert the paths to absolute paths just like
all of the other path arguments.
Also, note for makefile hackers: apparently you cannot quote operands
to `ifeq` in Makefile (or at least, you need to be careful about
adding them, e.g. to only one side).
2014-04-25 18:22:23 +02:00
|
|
|
#
|
|
|
|
# Defines (with the standard $(1)_T_$(2)_H_$(3) suffix):
|
|
|
|
# * `LD_LIBRARY_PATH_ENV_NAME`: the name for the key to use in the OS
|
|
|
|
# environment to access or extend the lookup path for dynamic
|
|
|
|
# libraries. Note on Windows, that key is `$PATH`, and thus not
|
|
|
|
# only conflates programs with dynamic libraries, but also often
|
|
|
|
# contains spaces which confuse make.
|
|
|
|
# * `LD_LIBRARY_PATH_ENV_HOSTDIR`: the entry to add to lookup path for the host
|
|
|
|
# * `LD_LIBRARY_PATH_ENV_TARGETDIR`: the entry to add to lookup path for target
|
2014-06-11 23:52:38 +02:00
|
|
|
#
|
Refactoring: Introduce distinct host and target rpath var setters.
Two line summary: Distinguish HOST_RPATH and TARGET_RPATH; added
RPATH_LINK_SEARCH; skip tests broken in stage1; general cleanup.
`HOST_RPATH_VAR$(1)_T_$(2)_H_$(3)` and `TARGET_RPATH_VAR$(1)_T_$(2)_H_$(3)`
both match the format of the old `RPATH_VAR$(1)_T_$(2)_H_$(3)` (which
is still being set the same way that it was before, to one of either
HOST/TARGET depending on what stage we are building). Namely, the format
is <XXX>_RPATH_VAR = "<LD_LIB_PATH_ENVVAR>=<COLON_SEP_PATH_ENTRIES>"
What this commit does:
* Pass both of the (newly introduced) HOST and TARGET rpath setup vars
to `maketest.py`
* Update `maketest.py` to no longer update the LD_LIBRARY_PATH itself
Instead, it passes along the HOST and TARGET rpath setup vars in
environment variables `HOST_RPATH_ENV` and `TARGET_RPATH_ENV`
* Also, pass the current stage number to maketest.py; it in turn
passes it (via an env var) to run-make tests.
This allows the run-make tests to selectively change behavior
(e.g. turn themselves off) to deal with incompatibilities with
e.g. stage1.
* Cleanup: Distinguish in tools.mk between the command to run (`RUN`)
and the file to generate to drive that command (`RUN_BINFILE`). The
main thing this enables is that `RUN` can now setup the
`TARGET_RPATH_ENV` without having to dirty up the runner code in
each of the `run-make` Makefiles.
* Cleanup: Factored out commands to delete dylib/rlib into
REMOVE_DYLIBS/REMOVE_RLIBS.
There were places where we were only calling `rm $(call DYLIB,foo)`
even though we really needed to get rid of the whole glob (at least
based on alex's findings on #13753 that removing the symlink does not
suffice).
Therefore rather than peppering the code with the awkward
`rm $(TMPDIR)/$(call DYLIB_GLOB,foo)`, I instead introduced a common
`REMOVE_DYLIBS` user function that expands into that when called.
After I adding an analogous `REMOVE_RLIBS`, I changed all of the
existing calls that rm dylibs or rlibs to use these routines
instead.
Note that the latter is not a true refactoring since I may have
changed cases where it was our intent to only remove the sym-link.
(But if that is the case, then we need to more deeply investigate
alex's findings on #13753 where the system was still dynamically
loading up the non-symlinked libraries that it finds on the load
path.)
* Added RPATH_LINK_SEARCH command and use it on Linux.
On some platforms, namely Linux, when you have libboot.so that has
its internal rpath set (to e.g. $(ORIGIN)/path/to/HOSTDIR), the
linker still complains when you do the link step and it does not
know where to find libraries that libboot.so depends upon that live
in HOSTDIR (think e.g. librustuv.so).
As far as I can tell, the GNU linker will consult the
LD_LIBRARY_PATH as part of the linking process to find such
libraries. But if you want to be more careful and not override
LD_LIBRARY_PATH for the `gcc` invocation, then you need some other
way to tell the linker where it can find the libraries that
libboot.so needs. The solution to this on Linux is the
`-Wl,-rpath-link` command line option.
However, this command line option does not exist on Mac OS X, (which
appears to be figuring out how to resolve the libboot.dylib
dependency by some other means, perhaps by consulting the rpath
setting within libboot.dylib).
So, in order to abstract over this distinction, I added the
RPATH_LINK_SEARCH macro to the run-make infrastructure and added
calls to it where necessary to get Linux working. On architectures
other than Linux, the macro expands to nothing.
* Disable miscellaneous tests atop stage1.
* An especially interesting instance of the previous bullet point:
Excuse regex from doing rustdoc tests atop stage1.
This was a (nearly-) final step to get `make check-stage1` working
again.
The use of a special-case check for regex here is ugly but is
analogous other similar checks for regex such as the one that landed
in PR #13844.
The way this is written, the user will get a reminder that
doc-crate-regex is being skipped whenever their rules attempt to do
the crate documentation tests. This is deliberate: I want people
running `make check-stage1` to be reminded about which cases are
being skipped. (But if such echo noise is considered offensive, it
can obviously be removed.)
* Got windows working with the above changes.
This portion of the commit is a cleanup revision of the (previously
mentioned on try builds) re-architecting of how the LD_LIBRARY_PATH
setup and extension is handled in order to accommodate Windows' (1.)
use of `$PATH` for that purpose and (2.) use of spaces in `$PATH`
entries (problematic for make and for interoperation with tools at
the shell).
* In addition, since the code has been rearchitected to pass the
HOST_RPATH_DIR/TARGET_RPATH_DIR rather than a whole sh
environment-variable setting command, there is no need to for the
convert_path_spec calls in maketest.py, which in fact were put in
place to placate Windows but were now causing the Windows builds to
fail. Instead we just convert the paths to absolute paths just like
all of the other path arguments.
Also, note for makefile hackers: apparently you cannot quote operands
to `ifeq` in Makefile (or at least, you need to be careful about
adding them, e.g. to only one side).
2014-04-25 18:22:23 +02:00
|
|
|
# Below that, HOST_RPATH_VAR and TARGET_RPATH_VAR are defined in terms of the
|
|
|
|
# above settings.
|
2014-06-11 23:52:38 +02:00
|
|
|
#
|
2014-04-11 19:52:01 +02:00
|
|
|
define SREQ_CMDS
|
|
|
|
|
|
|
|
ifeq ($$(OSTYPE_$(3)),apple-darwin)
|
Refactoring: Introduce distinct host and target rpath var setters.
Two line summary: Distinguish HOST_RPATH and TARGET_RPATH; added
RPATH_LINK_SEARCH; skip tests broken in stage1; general cleanup.
`HOST_RPATH_VAR$(1)_T_$(2)_H_$(3)` and `TARGET_RPATH_VAR$(1)_T_$(2)_H_$(3)`
both match the format of the old `RPATH_VAR$(1)_T_$(2)_H_$(3)` (which
is still being set the same way that it was before, to one of either
HOST/TARGET depending on what stage we are building). Namely, the format
is <XXX>_RPATH_VAR = "<LD_LIB_PATH_ENVVAR>=<COLON_SEP_PATH_ENTRIES>"
What this commit does:
* Pass both of the (newly introduced) HOST and TARGET rpath setup vars
to `maketest.py`
* Update `maketest.py` to no longer update the LD_LIBRARY_PATH itself
Instead, it passes along the HOST and TARGET rpath setup vars in
environment variables `HOST_RPATH_ENV` and `TARGET_RPATH_ENV`
* Also, pass the current stage number to maketest.py; it in turn
passes it (via an env var) to run-make tests.
This allows the run-make tests to selectively change behavior
(e.g. turn themselves off) to deal with incompatibilities with
e.g. stage1.
* Cleanup: Distinguish in tools.mk between the command to run (`RUN`)
and the file to generate to drive that command (`RUN_BINFILE`). The
main thing this enables is that `RUN` can now setup the
`TARGET_RPATH_ENV` without having to dirty up the runner code in
each of the `run-make` Makefiles.
* Cleanup: Factored out commands to delete dylib/rlib into
REMOVE_DYLIBS/REMOVE_RLIBS.
There were places where we were only calling `rm $(call DYLIB,foo)`
even though we really needed to get rid of the whole glob (at least
based on alex's findings on #13753 that removing the symlink does not
suffice).
Therefore rather than peppering the code with the awkward
`rm $(TMPDIR)/$(call DYLIB_GLOB,foo)`, I instead introduced a common
`REMOVE_DYLIBS` user function that expands into that when called.
After I adding an analogous `REMOVE_RLIBS`, I changed all of the
existing calls that rm dylibs or rlibs to use these routines
instead.
Note that the latter is not a true refactoring since I may have
changed cases where it was our intent to only remove the sym-link.
(But if that is the case, then we need to more deeply investigate
alex's findings on #13753 where the system was still dynamically
loading up the non-symlinked libraries that it finds on the load
path.)
* Added RPATH_LINK_SEARCH command and use it on Linux.
On some platforms, namely Linux, when you have libboot.so that has
its internal rpath set (to e.g. $(ORIGIN)/path/to/HOSTDIR), the
linker still complains when you do the link step and it does not
know where to find libraries that libboot.so depends upon that live
in HOSTDIR (think e.g. librustuv.so).
As far as I can tell, the GNU linker will consult the
LD_LIBRARY_PATH as part of the linking process to find such
libraries. But if you want to be more careful and not override
LD_LIBRARY_PATH for the `gcc` invocation, then you need some other
way to tell the linker where it can find the libraries that
libboot.so needs. The solution to this on Linux is the
`-Wl,-rpath-link` command line option.
However, this command line option does not exist on Mac OS X, (which
appears to be figuring out how to resolve the libboot.dylib
dependency by some other means, perhaps by consulting the rpath
setting within libboot.dylib).
So, in order to abstract over this distinction, I added the
RPATH_LINK_SEARCH macro to the run-make infrastructure and added
calls to it where necessary to get Linux working. On architectures
other than Linux, the macro expands to nothing.
* Disable miscellaneous tests atop stage1.
* An especially interesting instance of the previous bullet point:
Excuse regex from doing rustdoc tests atop stage1.
This was a (nearly-) final step to get `make check-stage1` working
again.
The use of a special-case check for regex here is ugly but is
analogous other similar checks for regex such as the one that landed
in PR #13844.
The way this is written, the user will get a reminder that
doc-crate-regex is being skipped whenever their rules attempt to do
the crate documentation tests. This is deliberate: I want people
running `make check-stage1` to be reminded about which cases are
being skipped. (But if such echo noise is considered offensive, it
can obviously be removed.)
* Got windows working with the above changes.
This portion of the commit is a cleanup revision of the (previously
mentioned on try builds) re-architecting of how the LD_LIBRARY_PATH
setup and extension is handled in order to accommodate Windows' (1.)
use of `$PATH` for that purpose and (2.) use of spaces in `$PATH`
entries (problematic for make and for interoperation with tools at
the shell).
* In addition, since the code has been rearchitected to pass the
HOST_RPATH_DIR/TARGET_RPATH_DIR rather than a whole sh
environment-variable setting command, there is no need to for the
convert_path_spec calls in maketest.py, which in fact were put in
place to placate Windows but were now causing the Windows builds to
fail. Instead we just convert the paths to absolute paths just like
all of the other path arguments.
Also, note for makefile hackers: apparently you cannot quote operands
to `ifeq` in Makefile (or at least, you need to be careful about
adding them, e.g. to only one side).
2014-04-25 18:22:23 +02:00
|
|
|
LD_LIBRARY_PATH_ENV_NAME$(1)_T_$(2)_H_$(3) := DYLD_LIBRARY_PATH
|
|
|
|
else
|
2014-07-14 10:45:06 +02:00
|
|
|
ifeq ($$(CFG_WINDOWSY_$(3)),1)
|
Refactoring: Introduce distinct host and target rpath var setters.
Two line summary: Distinguish HOST_RPATH and TARGET_RPATH; added
RPATH_LINK_SEARCH; skip tests broken in stage1; general cleanup.
`HOST_RPATH_VAR$(1)_T_$(2)_H_$(3)` and `TARGET_RPATH_VAR$(1)_T_$(2)_H_$(3)`
both match the format of the old `RPATH_VAR$(1)_T_$(2)_H_$(3)` (which
is still being set the same way that it was before, to one of either
HOST/TARGET depending on what stage we are building). Namely, the format
is <XXX>_RPATH_VAR = "<LD_LIB_PATH_ENVVAR>=<COLON_SEP_PATH_ENTRIES>"
What this commit does:
* Pass both of the (newly introduced) HOST and TARGET rpath setup vars
to `maketest.py`
* Update `maketest.py` to no longer update the LD_LIBRARY_PATH itself
Instead, it passes along the HOST and TARGET rpath setup vars in
environment variables `HOST_RPATH_ENV` and `TARGET_RPATH_ENV`
* Also, pass the current stage number to maketest.py; it in turn
passes it (via an env var) to run-make tests.
This allows the run-make tests to selectively change behavior
(e.g. turn themselves off) to deal with incompatibilities with
e.g. stage1.
* Cleanup: Distinguish in tools.mk between the command to run (`RUN`)
and the file to generate to drive that command (`RUN_BINFILE`). The
main thing this enables is that `RUN` can now setup the
`TARGET_RPATH_ENV` without having to dirty up the runner code in
each of the `run-make` Makefiles.
* Cleanup: Factored out commands to delete dylib/rlib into
REMOVE_DYLIBS/REMOVE_RLIBS.
There were places where we were only calling `rm $(call DYLIB,foo)`
even though we really needed to get rid of the whole glob (at least
based on alex's findings on #13753 that removing the symlink does not
suffice).
Therefore rather than peppering the code with the awkward
`rm $(TMPDIR)/$(call DYLIB_GLOB,foo)`, I instead introduced a common
`REMOVE_DYLIBS` user function that expands into that when called.
After I adding an analogous `REMOVE_RLIBS`, I changed all of the
existing calls that rm dylibs or rlibs to use these routines
instead.
Note that the latter is not a true refactoring since I may have
changed cases where it was our intent to only remove the sym-link.
(But if that is the case, then we need to more deeply investigate
alex's findings on #13753 where the system was still dynamically
loading up the non-symlinked libraries that it finds on the load
path.)
* Added RPATH_LINK_SEARCH command and use it on Linux.
On some platforms, namely Linux, when you have libboot.so that has
its internal rpath set (to e.g. $(ORIGIN)/path/to/HOSTDIR), the
linker still complains when you do the link step and it does not
know where to find libraries that libboot.so depends upon that live
in HOSTDIR (think e.g. librustuv.so).
As far as I can tell, the GNU linker will consult the
LD_LIBRARY_PATH as part of the linking process to find such
libraries. But if you want to be more careful and not override
LD_LIBRARY_PATH for the `gcc` invocation, then you need some other
way to tell the linker where it can find the libraries that
libboot.so needs. The solution to this on Linux is the
`-Wl,-rpath-link` command line option.
However, this command line option does not exist on Mac OS X, (which
appears to be figuring out how to resolve the libboot.dylib
dependency by some other means, perhaps by consulting the rpath
setting within libboot.dylib).
So, in order to abstract over this distinction, I added the
RPATH_LINK_SEARCH macro to the run-make infrastructure and added
calls to it where necessary to get Linux working. On architectures
other than Linux, the macro expands to nothing.
* Disable miscellaneous tests atop stage1.
* An especially interesting instance of the previous bullet point:
Excuse regex from doing rustdoc tests atop stage1.
This was a (nearly-) final step to get `make check-stage1` working
again.
The use of a special-case check for regex here is ugly but is
analogous other similar checks for regex such as the one that landed
in PR #13844.
The way this is written, the user will get a reminder that
doc-crate-regex is being skipped whenever their rules attempt to do
the crate documentation tests. This is deliberate: I want people
running `make check-stage1` to be reminded about which cases are
being skipped. (But if such echo noise is considered offensive, it
can obviously be removed.)
* Got windows working with the above changes.
This portion of the commit is a cleanup revision of the (previously
mentioned on try builds) re-architecting of how the LD_LIBRARY_PATH
setup and extension is handled in order to accommodate Windows' (1.)
use of `$PATH` for that purpose and (2.) use of spaces in `$PATH`
entries (problematic for make and for interoperation with tools at
the shell).
* In addition, since the code has been rearchitected to pass the
HOST_RPATH_DIR/TARGET_RPATH_DIR rather than a whole sh
environment-variable setting command, there is no need to for the
convert_path_spec calls in maketest.py, which in fact were put in
place to placate Windows but were now causing the Windows builds to
fail. Instead we just convert the paths to absolute paths just like
all of the other path arguments.
Also, note for makefile hackers: apparently you cannot quote operands
to `ifeq` in Makefile (or at least, you need to be careful about
adding them, e.g. to only one side).
2014-04-25 18:22:23 +02:00
|
|
|
LD_LIBRARY_PATH_ENV_NAME$(1)_T_$(2)_H_$(3) := PATH
|
2014-04-11 19:52:01 +02:00
|
|
|
else
|
Refactoring: Introduce distinct host and target rpath var setters.
Two line summary: Distinguish HOST_RPATH and TARGET_RPATH; added
RPATH_LINK_SEARCH; skip tests broken in stage1; general cleanup.
`HOST_RPATH_VAR$(1)_T_$(2)_H_$(3)` and `TARGET_RPATH_VAR$(1)_T_$(2)_H_$(3)`
both match the format of the old `RPATH_VAR$(1)_T_$(2)_H_$(3)` (which
is still being set the same way that it was before, to one of either
HOST/TARGET depending on what stage we are building). Namely, the format
is <XXX>_RPATH_VAR = "<LD_LIB_PATH_ENVVAR>=<COLON_SEP_PATH_ENTRIES>"
What this commit does:
* Pass both of the (newly introduced) HOST and TARGET rpath setup vars
to `maketest.py`
* Update `maketest.py` to no longer update the LD_LIBRARY_PATH itself
Instead, it passes along the HOST and TARGET rpath setup vars in
environment variables `HOST_RPATH_ENV` and `TARGET_RPATH_ENV`
* Also, pass the current stage number to maketest.py; it in turn
passes it (via an env var) to run-make tests.
This allows the run-make tests to selectively change behavior
(e.g. turn themselves off) to deal with incompatibilities with
e.g. stage1.
* Cleanup: Distinguish in tools.mk between the command to run (`RUN`)
and the file to generate to drive that command (`RUN_BINFILE`). The
main thing this enables is that `RUN` can now setup the
`TARGET_RPATH_ENV` without having to dirty up the runner code in
each of the `run-make` Makefiles.
* Cleanup: Factored out commands to delete dylib/rlib into
REMOVE_DYLIBS/REMOVE_RLIBS.
There were places where we were only calling `rm $(call DYLIB,foo)`
even though we really needed to get rid of the whole glob (at least
based on alex's findings on #13753 that removing the symlink does not
suffice).
Therefore rather than peppering the code with the awkward
`rm $(TMPDIR)/$(call DYLIB_GLOB,foo)`, I instead introduced a common
`REMOVE_DYLIBS` user function that expands into that when called.
After I adding an analogous `REMOVE_RLIBS`, I changed all of the
existing calls that rm dylibs or rlibs to use these routines
instead.
Note that the latter is not a true refactoring since I may have
changed cases where it was our intent to only remove the sym-link.
(But if that is the case, then we need to more deeply investigate
alex's findings on #13753 where the system was still dynamically
loading up the non-symlinked libraries that it finds on the load
path.)
* Added RPATH_LINK_SEARCH command and use it on Linux.
On some platforms, namely Linux, when you have libboot.so that has
its internal rpath set (to e.g. $(ORIGIN)/path/to/HOSTDIR), the
linker still complains when you do the link step and it does not
know where to find libraries that libboot.so depends upon that live
in HOSTDIR (think e.g. librustuv.so).
As far as I can tell, the GNU linker will consult the
LD_LIBRARY_PATH as part of the linking process to find such
libraries. But if you want to be more careful and not override
LD_LIBRARY_PATH for the `gcc` invocation, then you need some other
way to tell the linker where it can find the libraries that
libboot.so needs. The solution to this on Linux is the
`-Wl,-rpath-link` command line option.
However, this command line option does not exist on Mac OS X, (which
appears to be figuring out how to resolve the libboot.dylib
dependency by some other means, perhaps by consulting the rpath
setting within libboot.dylib).
So, in order to abstract over this distinction, I added the
RPATH_LINK_SEARCH macro to the run-make infrastructure and added
calls to it where necessary to get Linux working. On architectures
other than Linux, the macro expands to nothing.
* Disable miscellaneous tests atop stage1.
* An especially interesting instance of the previous bullet point:
Excuse regex from doing rustdoc tests atop stage1.
This was a (nearly-) final step to get `make check-stage1` working
again.
The use of a special-case check for regex here is ugly but is
analogous other similar checks for regex such as the one that landed
in PR #13844.
The way this is written, the user will get a reminder that
doc-crate-regex is being skipped whenever their rules attempt to do
the crate documentation tests. This is deliberate: I want people
running `make check-stage1` to be reminded about which cases are
being skipped. (But if such echo noise is considered offensive, it
can obviously be removed.)
* Got windows working with the above changes.
This portion of the commit is a cleanup revision of the (previously
mentioned on try builds) re-architecting of how the LD_LIBRARY_PATH
setup and extension is handled in order to accommodate Windows' (1.)
use of `$PATH` for that purpose and (2.) use of spaces in `$PATH`
entries (problematic for make and for interoperation with tools at
the shell).
* In addition, since the code has been rearchitected to pass the
HOST_RPATH_DIR/TARGET_RPATH_DIR rather than a whole sh
environment-variable setting command, there is no need to for the
convert_path_spec calls in maketest.py, which in fact were put in
place to placate Windows but were now causing the Windows builds to
fail. Instead we just convert the paths to absolute paths just like
all of the other path arguments.
Also, note for makefile hackers: apparently you cannot quote operands
to `ifeq` in Makefile (or at least, you need to be careful about
adding them, e.g. to only one side).
2014-04-25 18:22:23 +02:00
|
|
|
LD_LIBRARY_PATH_ENV_NAME$(1)_T_$(2)_H_$(3) := LD_LIBRARY_PATH
|
|
|
|
endif
|
2014-04-11 19:52:01 +02:00
|
|
|
endif
|
|
|
|
|
Refactoring: Introduce distinct host and target rpath var setters.
Two line summary: Distinguish HOST_RPATH and TARGET_RPATH; added
RPATH_LINK_SEARCH; skip tests broken in stage1; general cleanup.
`HOST_RPATH_VAR$(1)_T_$(2)_H_$(3)` and `TARGET_RPATH_VAR$(1)_T_$(2)_H_$(3)`
both match the format of the old `RPATH_VAR$(1)_T_$(2)_H_$(3)` (which
is still being set the same way that it was before, to one of either
HOST/TARGET depending on what stage we are building). Namely, the format
is <XXX>_RPATH_VAR = "<LD_LIB_PATH_ENVVAR>=<COLON_SEP_PATH_ENTRIES>"
What this commit does:
* Pass both of the (newly introduced) HOST and TARGET rpath setup vars
to `maketest.py`
* Update `maketest.py` to no longer update the LD_LIBRARY_PATH itself
Instead, it passes along the HOST and TARGET rpath setup vars in
environment variables `HOST_RPATH_ENV` and `TARGET_RPATH_ENV`
* Also, pass the current stage number to maketest.py; it in turn
passes it (via an env var) to run-make tests.
This allows the run-make tests to selectively change behavior
(e.g. turn themselves off) to deal with incompatibilities with
e.g. stage1.
* Cleanup: Distinguish in tools.mk between the command to run (`RUN`)
and the file to generate to drive that command (`RUN_BINFILE`). The
main thing this enables is that `RUN` can now setup the
`TARGET_RPATH_ENV` without having to dirty up the runner code in
each of the `run-make` Makefiles.
* Cleanup: Factored out commands to delete dylib/rlib into
REMOVE_DYLIBS/REMOVE_RLIBS.
There were places where we were only calling `rm $(call DYLIB,foo)`
even though we really needed to get rid of the whole glob (at least
based on alex's findings on #13753 that removing the symlink does not
suffice).
Therefore rather than peppering the code with the awkward
`rm $(TMPDIR)/$(call DYLIB_GLOB,foo)`, I instead introduced a common
`REMOVE_DYLIBS` user function that expands into that when called.
After I adding an analogous `REMOVE_RLIBS`, I changed all of the
existing calls that rm dylibs or rlibs to use these routines
instead.
Note that the latter is not a true refactoring since I may have
changed cases where it was our intent to only remove the sym-link.
(But if that is the case, then we need to more deeply investigate
alex's findings on #13753 where the system was still dynamically
loading up the non-symlinked libraries that it finds on the load
path.)
* Added RPATH_LINK_SEARCH command and use it on Linux.
On some platforms, namely Linux, when you have libboot.so that has
its internal rpath set (to e.g. $(ORIGIN)/path/to/HOSTDIR), the
linker still complains when you do the link step and it does not
know where to find libraries that libboot.so depends upon that live
in HOSTDIR (think e.g. librustuv.so).
As far as I can tell, the GNU linker will consult the
LD_LIBRARY_PATH as part of the linking process to find such
libraries. But if you want to be more careful and not override
LD_LIBRARY_PATH for the `gcc` invocation, then you need some other
way to tell the linker where it can find the libraries that
libboot.so needs. The solution to this on Linux is the
`-Wl,-rpath-link` command line option.
However, this command line option does not exist on Mac OS X, (which
appears to be figuring out how to resolve the libboot.dylib
dependency by some other means, perhaps by consulting the rpath
setting within libboot.dylib).
So, in order to abstract over this distinction, I added the
RPATH_LINK_SEARCH macro to the run-make infrastructure and added
calls to it where necessary to get Linux working. On architectures
other than Linux, the macro expands to nothing.
* Disable miscellaneous tests atop stage1.
* An especially interesting instance of the previous bullet point:
Excuse regex from doing rustdoc tests atop stage1.
This was a (nearly-) final step to get `make check-stage1` working
again.
The use of a special-case check for regex here is ugly but is
analogous other similar checks for regex such as the one that landed
in PR #13844.
The way this is written, the user will get a reminder that
doc-crate-regex is being skipped whenever their rules attempt to do
the crate documentation tests. This is deliberate: I want people
running `make check-stage1` to be reminded about which cases are
being skipped. (But if such echo noise is considered offensive, it
can obviously be removed.)
* Got windows working with the above changes.
This portion of the commit is a cleanup revision of the (previously
mentioned on try builds) re-architecting of how the LD_LIBRARY_PATH
setup and extension is handled in order to accommodate Windows' (1.)
use of `$PATH` for that purpose and (2.) use of spaces in `$PATH`
entries (problematic for make and for interoperation with tools at
the shell).
* In addition, since the code has been rearchitected to pass the
HOST_RPATH_DIR/TARGET_RPATH_DIR rather than a whole sh
environment-variable setting command, there is no need to for the
convert_path_spec calls in maketest.py, which in fact were put in
place to placate Windows but were now causing the Windows builds to
fail. Instead we just convert the paths to absolute paths just like
all of the other path arguments.
Also, note for makefile hackers: apparently you cannot quote operands
to `ifeq` in Makefile (or at least, you need to be careful about
adding them, e.g. to only one side).
2014-04-25 18:22:23 +02:00
|
|
|
LD_LIBRARY_PATH_ENV_HOSTDIR$(1)_T_$(2)_H_$(3) := \
|
2015-08-22 06:43:56 +02:00
|
|
|
$$(CURDIR)/$$(HLIB$(1)_H_$(3)):$$(CFG_LLVM_INST_DIR_$(3))/lib
|
Refactoring: Introduce distinct host and target rpath var setters.
Two line summary: Distinguish HOST_RPATH and TARGET_RPATH; added
RPATH_LINK_SEARCH; skip tests broken in stage1; general cleanup.
`HOST_RPATH_VAR$(1)_T_$(2)_H_$(3)` and `TARGET_RPATH_VAR$(1)_T_$(2)_H_$(3)`
both match the format of the old `RPATH_VAR$(1)_T_$(2)_H_$(3)` (which
is still being set the same way that it was before, to one of either
HOST/TARGET depending on what stage we are building). Namely, the format
is <XXX>_RPATH_VAR = "<LD_LIB_PATH_ENVVAR>=<COLON_SEP_PATH_ENTRIES>"
What this commit does:
* Pass both of the (newly introduced) HOST and TARGET rpath setup vars
to `maketest.py`
* Update `maketest.py` to no longer update the LD_LIBRARY_PATH itself
Instead, it passes along the HOST and TARGET rpath setup vars in
environment variables `HOST_RPATH_ENV` and `TARGET_RPATH_ENV`
* Also, pass the current stage number to maketest.py; it in turn
passes it (via an env var) to run-make tests.
This allows the run-make tests to selectively change behavior
(e.g. turn themselves off) to deal with incompatibilities with
e.g. stage1.
* Cleanup: Distinguish in tools.mk between the command to run (`RUN`)
and the file to generate to drive that command (`RUN_BINFILE`). The
main thing this enables is that `RUN` can now setup the
`TARGET_RPATH_ENV` without having to dirty up the runner code in
each of the `run-make` Makefiles.
* Cleanup: Factored out commands to delete dylib/rlib into
REMOVE_DYLIBS/REMOVE_RLIBS.
There were places where we were only calling `rm $(call DYLIB,foo)`
even though we really needed to get rid of the whole glob (at least
based on alex's findings on #13753 that removing the symlink does not
suffice).
Therefore rather than peppering the code with the awkward
`rm $(TMPDIR)/$(call DYLIB_GLOB,foo)`, I instead introduced a common
`REMOVE_DYLIBS` user function that expands into that when called.
After I adding an analogous `REMOVE_RLIBS`, I changed all of the
existing calls that rm dylibs or rlibs to use these routines
instead.
Note that the latter is not a true refactoring since I may have
changed cases where it was our intent to only remove the sym-link.
(But if that is the case, then we need to more deeply investigate
alex's findings on #13753 where the system was still dynamically
loading up the non-symlinked libraries that it finds on the load
path.)
* Added RPATH_LINK_SEARCH command and use it on Linux.
On some platforms, namely Linux, when you have libboot.so that has
its internal rpath set (to e.g. $(ORIGIN)/path/to/HOSTDIR), the
linker still complains when you do the link step and it does not
know where to find libraries that libboot.so depends upon that live
in HOSTDIR (think e.g. librustuv.so).
As far as I can tell, the GNU linker will consult the
LD_LIBRARY_PATH as part of the linking process to find such
libraries. But if you want to be more careful and not override
LD_LIBRARY_PATH for the `gcc` invocation, then you need some other
way to tell the linker where it can find the libraries that
libboot.so needs. The solution to this on Linux is the
`-Wl,-rpath-link` command line option.
However, this command line option does not exist on Mac OS X, (which
appears to be figuring out how to resolve the libboot.dylib
dependency by some other means, perhaps by consulting the rpath
setting within libboot.dylib).
So, in order to abstract over this distinction, I added the
RPATH_LINK_SEARCH macro to the run-make infrastructure and added
calls to it where necessary to get Linux working. On architectures
other than Linux, the macro expands to nothing.
* Disable miscellaneous tests atop stage1.
* An especially interesting instance of the previous bullet point:
Excuse regex from doing rustdoc tests atop stage1.
This was a (nearly-) final step to get `make check-stage1` working
again.
The use of a special-case check for regex here is ugly but is
analogous other similar checks for regex such as the one that landed
in PR #13844.
The way this is written, the user will get a reminder that
doc-crate-regex is being skipped whenever their rules attempt to do
the crate documentation tests. This is deliberate: I want people
running `make check-stage1` to be reminded about which cases are
being skipped. (But if such echo noise is considered offensive, it
can obviously be removed.)
* Got windows working with the above changes.
This portion of the commit is a cleanup revision of the (previously
mentioned on try builds) re-architecting of how the LD_LIBRARY_PATH
setup and extension is handled in order to accommodate Windows' (1.)
use of `$PATH` for that purpose and (2.) use of spaces in `$PATH`
entries (problematic for make and for interoperation with tools at
the shell).
* In addition, since the code has been rearchitected to pass the
HOST_RPATH_DIR/TARGET_RPATH_DIR rather than a whole sh
environment-variable setting command, there is no need to for the
convert_path_spec calls in maketest.py, which in fact were put in
place to placate Windows but were now causing the Windows builds to
fail. Instead we just convert the paths to absolute paths just like
all of the other path arguments.
Also, note for makefile hackers: apparently you cannot quote operands
to `ifeq` in Makefile (or at least, you need to be careful about
adding them, e.g. to only one side).
2014-04-25 18:22:23 +02:00
|
|
|
LD_LIBRARY_PATH_ENV_TARGETDIR$(1)_T_$(2)_H_$(3) := \
|
|
|
|
$$(CURDIR)/$$(TLIB1_T_$(2)_H_$(CFG_BUILD))
|
|
|
|
|
|
|
|
HOST_RPATH_VAR$(1)_T_$(2)_H_$(3) := \
|
2014-06-11 23:52:38 +02:00
|
|
|
$$(LD_LIBRARY_PATH_ENV_NAME$(1)_T_$(2)_H_$(3))=$$(LD_LIBRARY_PATH_ENV_HOSTDIR$(1)_T_$(2)_H_$(3)):$$$$$$(LD_LIBRARY_PATH_ENV_NAME$(1)_T_$(2)_H_$(3))
|
Refactoring: Introduce distinct host and target rpath var setters.
Two line summary: Distinguish HOST_RPATH and TARGET_RPATH; added
RPATH_LINK_SEARCH; skip tests broken in stage1; general cleanup.
`HOST_RPATH_VAR$(1)_T_$(2)_H_$(3)` and `TARGET_RPATH_VAR$(1)_T_$(2)_H_$(3)`
both match the format of the old `RPATH_VAR$(1)_T_$(2)_H_$(3)` (which
is still being set the same way that it was before, to one of either
HOST/TARGET depending on what stage we are building). Namely, the format
is <XXX>_RPATH_VAR = "<LD_LIB_PATH_ENVVAR>=<COLON_SEP_PATH_ENTRIES>"
What this commit does:
* Pass both of the (newly introduced) HOST and TARGET rpath setup vars
to `maketest.py`
* Update `maketest.py` to no longer update the LD_LIBRARY_PATH itself
Instead, it passes along the HOST and TARGET rpath setup vars in
environment variables `HOST_RPATH_ENV` and `TARGET_RPATH_ENV`
* Also, pass the current stage number to maketest.py; it in turn
passes it (via an env var) to run-make tests.
This allows the run-make tests to selectively change behavior
(e.g. turn themselves off) to deal with incompatibilities with
e.g. stage1.
* Cleanup: Distinguish in tools.mk between the command to run (`RUN`)
and the file to generate to drive that command (`RUN_BINFILE`). The
main thing this enables is that `RUN` can now setup the
`TARGET_RPATH_ENV` without having to dirty up the runner code in
each of the `run-make` Makefiles.
* Cleanup: Factored out commands to delete dylib/rlib into
REMOVE_DYLIBS/REMOVE_RLIBS.
There were places where we were only calling `rm $(call DYLIB,foo)`
even though we really needed to get rid of the whole glob (at least
based on alex's findings on #13753 that removing the symlink does not
suffice).
Therefore rather than peppering the code with the awkward
`rm $(TMPDIR)/$(call DYLIB_GLOB,foo)`, I instead introduced a common
`REMOVE_DYLIBS` user function that expands into that when called.
After I adding an analogous `REMOVE_RLIBS`, I changed all of the
existing calls that rm dylibs or rlibs to use these routines
instead.
Note that the latter is not a true refactoring since I may have
changed cases where it was our intent to only remove the sym-link.
(But if that is the case, then we need to more deeply investigate
alex's findings on #13753 where the system was still dynamically
loading up the non-symlinked libraries that it finds on the load
path.)
* Added RPATH_LINK_SEARCH command and use it on Linux.
On some platforms, namely Linux, when you have libboot.so that has
its internal rpath set (to e.g. $(ORIGIN)/path/to/HOSTDIR), the
linker still complains when you do the link step and it does not
know where to find libraries that libboot.so depends upon that live
in HOSTDIR (think e.g. librustuv.so).
As far as I can tell, the GNU linker will consult the
LD_LIBRARY_PATH as part of the linking process to find such
libraries. But if you want to be more careful and not override
LD_LIBRARY_PATH for the `gcc` invocation, then you need some other
way to tell the linker where it can find the libraries that
libboot.so needs. The solution to this on Linux is the
`-Wl,-rpath-link` command line option.
However, this command line option does not exist on Mac OS X, (which
appears to be figuring out how to resolve the libboot.dylib
dependency by some other means, perhaps by consulting the rpath
setting within libboot.dylib).
So, in order to abstract over this distinction, I added the
RPATH_LINK_SEARCH macro to the run-make infrastructure and added
calls to it where necessary to get Linux working. On architectures
other than Linux, the macro expands to nothing.
* Disable miscellaneous tests atop stage1.
* An especially interesting instance of the previous bullet point:
Excuse regex from doing rustdoc tests atop stage1.
This was a (nearly-) final step to get `make check-stage1` working
again.
The use of a special-case check for regex here is ugly but is
analogous other similar checks for regex such as the one that landed
in PR #13844.
The way this is written, the user will get a reminder that
doc-crate-regex is being skipped whenever their rules attempt to do
the crate documentation tests. This is deliberate: I want people
running `make check-stage1` to be reminded about which cases are
being skipped. (But if such echo noise is considered offensive, it
can obviously be removed.)
* Got windows working with the above changes.
This portion of the commit is a cleanup revision of the (previously
mentioned on try builds) re-architecting of how the LD_LIBRARY_PATH
setup and extension is handled in order to accommodate Windows' (1.)
use of `$PATH` for that purpose and (2.) use of spaces in `$PATH`
entries (problematic for make and for interoperation with tools at
the shell).
* In addition, since the code has been rearchitected to pass the
HOST_RPATH_DIR/TARGET_RPATH_DIR rather than a whole sh
environment-variable setting command, there is no need to for the
convert_path_spec calls in maketest.py, which in fact were put in
place to placate Windows but were now causing the Windows builds to
fail. Instead we just convert the paths to absolute paths just like
all of the other path arguments.
Also, note for makefile hackers: apparently you cannot quote operands
to `ifeq` in Makefile (or at least, you need to be careful about
adding them, e.g. to only one side).
2014-04-25 18:22:23 +02:00
|
|
|
TARGET_RPATH_VAR$(1)_T_$(2)_H_$(3) := \
|
2014-06-11 23:52:38 +02:00
|
|
|
$$(LD_LIBRARY_PATH_ENV_NAME$(1)_T_$(2)_H_$(3))=$$(LD_LIBRARY_PATH_ENV_TARGETDIR$(1)_T_$(2)_H_$(3)):$$$$$$(LD_LIBRARY_PATH_ENV_NAME$(1)_T_$(2)_H_$(3))
|
Refactoring: Introduce distinct host and target rpath var setters.
Two line summary: Distinguish HOST_RPATH and TARGET_RPATH; added
RPATH_LINK_SEARCH; skip tests broken in stage1; general cleanup.
`HOST_RPATH_VAR$(1)_T_$(2)_H_$(3)` and `TARGET_RPATH_VAR$(1)_T_$(2)_H_$(3)`
both match the format of the old `RPATH_VAR$(1)_T_$(2)_H_$(3)` (which
is still being set the same way that it was before, to one of either
HOST/TARGET depending on what stage we are building). Namely, the format
is <XXX>_RPATH_VAR = "<LD_LIB_PATH_ENVVAR>=<COLON_SEP_PATH_ENTRIES>"
What this commit does:
* Pass both of the (newly introduced) HOST and TARGET rpath setup vars
to `maketest.py`
* Update `maketest.py` to no longer update the LD_LIBRARY_PATH itself
Instead, it passes along the HOST and TARGET rpath setup vars in
environment variables `HOST_RPATH_ENV` and `TARGET_RPATH_ENV`
* Also, pass the current stage number to maketest.py; it in turn
passes it (via an env var) to run-make tests.
This allows the run-make tests to selectively change behavior
(e.g. turn themselves off) to deal with incompatibilities with
e.g. stage1.
* Cleanup: Distinguish in tools.mk between the command to run (`RUN`)
and the file to generate to drive that command (`RUN_BINFILE`). The
main thing this enables is that `RUN` can now setup the
`TARGET_RPATH_ENV` without having to dirty up the runner code in
each of the `run-make` Makefiles.
* Cleanup: Factored out commands to delete dylib/rlib into
REMOVE_DYLIBS/REMOVE_RLIBS.
There were places where we were only calling `rm $(call DYLIB,foo)`
even though we really needed to get rid of the whole glob (at least
based on alex's findings on #13753 that removing the symlink does not
suffice).
Therefore rather than peppering the code with the awkward
`rm $(TMPDIR)/$(call DYLIB_GLOB,foo)`, I instead introduced a common
`REMOVE_DYLIBS` user function that expands into that when called.
After I adding an analogous `REMOVE_RLIBS`, I changed all of the
existing calls that rm dylibs or rlibs to use these routines
instead.
Note that the latter is not a true refactoring since I may have
changed cases where it was our intent to only remove the sym-link.
(But if that is the case, then we need to more deeply investigate
alex's findings on #13753 where the system was still dynamically
loading up the non-symlinked libraries that it finds on the load
path.)
* Added RPATH_LINK_SEARCH command and use it on Linux.
On some platforms, namely Linux, when you have libboot.so that has
its internal rpath set (to e.g. $(ORIGIN)/path/to/HOSTDIR), the
linker still complains when you do the link step and it does not
know where to find libraries that libboot.so depends upon that live
in HOSTDIR (think e.g. librustuv.so).
As far as I can tell, the GNU linker will consult the
LD_LIBRARY_PATH as part of the linking process to find such
libraries. But if you want to be more careful and not override
LD_LIBRARY_PATH for the `gcc` invocation, then you need some other
way to tell the linker where it can find the libraries that
libboot.so needs. The solution to this on Linux is the
`-Wl,-rpath-link` command line option.
However, this command line option does not exist on Mac OS X, (which
appears to be figuring out how to resolve the libboot.dylib
dependency by some other means, perhaps by consulting the rpath
setting within libboot.dylib).
So, in order to abstract over this distinction, I added the
RPATH_LINK_SEARCH macro to the run-make infrastructure and added
calls to it where necessary to get Linux working. On architectures
other than Linux, the macro expands to nothing.
* Disable miscellaneous tests atop stage1.
* An especially interesting instance of the previous bullet point:
Excuse regex from doing rustdoc tests atop stage1.
This was a (nearly-) final step to get `make check-stage1` working
again.
The use of a special-case check for regex here is ugly but is
analogous other similar checks for regex such as the one that landed
in PR #13844.
The way this is written, the user will get a reminder that
doc-crate-regex is being skipped whenever their rules attempt to do
the crate documentation tests. This is deliberate: I want people
running `make check-stage1` to be reminded about which cases are
being skipped. (But if such echo noise is considered offensive, it
can obviously be removed.)
* Got windows working with the above changes.
This portion of the commit is a cleanup revision of the (previously
mentioned on try builds) re-architecting of how the LD_LIBRARY_PATH
setup and extension is handled in order to accommodate Windows' (1.)
use of `$PATH` for that purpose and (2.) use of spaces in `$PATH`
entries (problematic for make and for interoperation with tools at
the shell).
* In addition, since the code has been rearchitected to pass the
HOST_RPATH_DIR/TARGET_RPATH_DIR rather than a whole sh
environment-variable setting command, there is no need to for the
convert_path_spec calls in maketest.py, which in fact were put in
place to placate Windows but were now causing the Windows builds to
fail. Instead we just convert the paths to absolute paths just like
all of the other path arguments.
Also, note for makefile hackers: apparently you cannot quote operands
to `ifeq` in Makefile (or at least, you need to be careful about
adding them, e.g. to only one side).
2014-04-25 18:22:23 +02:00
|
|
|
|
|
|
|
RPATH_VAR$(1)_T_$(2)_H_$(3) := $$(HOST_RPATH_VAR$(1)_T_$(2)_H_$(3))
|
|
|
|
|
2014-02-14 08:55:49 +01:00
|
|
|
# Pass --cfg stage0 only for the build->host part of stage0;
|
|
|
|
# if you're building a cross config, the host->* parts are
|
|
|
|
# effectively stage1, since it uses the just-built stage0.
|
2014-04-11 19:52:01 +02:00
|
|
|
#
|
|
|
|
# This logic is similar to how the LD_LIBRARY_PATH variable must
|
|
|
|
# change be slightly different when doing cross compilations.
|
|
|
|
# The build doesn't copy over all target libraries into
|
|
|
|
# a new directory, so we need to point the library path at
|
|
|
|
# the build directory where all the target libraries came
|
|
|
|
# from (the stage0 build host). Otherwise the relative rpaths
|
|
|
|
# inside of the rustc binary won't get resolved correctly.
|
2014-02-14 08:55:49 +01:00
|
|
|
ifeq ($(1),0)
|
|
|
|
ifneq ($(strip $(CFG_BUILD)),$(strip $(3)))
|
|
|
|
CFGFLAG$(1)_T_$(2)_H_$(3) = stage1
|
|
|
|
|
Refactoring: Introduce distinct host and target rpath var setters.
Two line summary: Distinguish HOST_RPATH and TARGET_RPATH; added
RPATH_LINK_SEARCH; skip tests broken in stage1; general cleanup.
`HOST_RPATH_VAR$(1)_T_$(2)_H_$(3)` and `TARGET_RPATH_VAR$(1)_T_$(2)_H_$(3)`
both match the format of the old `RPATH_VAR$(1)_T_$(2)_H_$(3)` (which
is still being set the same way that it was before, to one of either
HOST/TARGET depending on what stage we are building). Namely, the format
is <XXX>_RPATH_VAR = "<LD_LIB_PATH_ENVVAR>=<COLON_SEP_PATH_ENTRIES>"
What this commit does:
* Pass both of the (newly introduced) HOST and TARGET rpath setup vars
to `maketest.py`
* Update `maketest.py` to no longer update the LD_LIBRARY_PATH itself
Instead, it passes along the HOST and TARGET rpath setup vars in
environment variables `HOST_RPATH_ENV` and `TARGET_RPATH_ENV`
* Also, pass the current stage number to maketest.py; it in turn
passes it (via an env var) to run-make tests.
This allows the run-make tests to selectively change behavior
(e.g. turn themselves off) to deal with incompatibilities with
e.g. stage1.
* Cleanup: Distinguish in tools.mk between the command to run (`RUN`)
and the file to generate to drive that command (`RUN_BINFILE`). The
main thing this enables is that `RUN` can now setup the
`TARGET_RPATH_ENV` without having to dirty up the runner code in
each of the `run-make` Makefiles.
* Cleanup: Factored out commands to delete dylib/rlib into
REMOVE_DYLIBS/REMOVE_RLIBS.
There were places where we were only calling `rm $(call DYLIB,foo)`
even though we really needed to get rid of the whole glob (at least
based on alex's findings on #13753 that removing the symlink does not
suffice).
Therefore rather than peppering the code with the awkward
`rm $(TMPDIR)/$(call DYLIB_GLOB,foo)`, I instead introduced a common
`REMOVE_DYLIBS` user function that expands into that when called.
After I adding an analogous `REMOVE_RLIBS`, I changed all of the
existing calls that rm dylibs or rlibs to use these routines
instead.
Note that the latter is not a true refactoring since I may have
changed cases where it was our intent to only remove the sym-link.
(But if that is the case, then we need to more deeply investigate
alex's findings on #13753 where the system was still dynamically
loading up the non-symlinked libraries that it finds on the load
path.)
* Added RPATH_LINK_SEARCH command and use it on Linux.
On some platforms, namely Linux, when you have libboot.so that has
its internal rpath set (to e.g. $(ORIGIN)/path/to/HOSTDIR), the
linker still complains when you do the link step and it does not
know where to find libraries that libboot.so depends upon that live
in HOSTDIR (think e.g. librustuv.so).
As far as I can tell, the GNU linker will consult the
LD_LIBRARY_PATH as part of the linking process to find such
libraries. But if you want to be more careful and not override
LD_LIBRARY_PATH for the `gcc` invocation, then you need some other
way to tell the linker where it can find the libraries that
libboot.so needs. The solution to this on Linux is the
`-Wl,-rpath-link` command line option.
However, this command line option does not exist on Mac OS X, (which
appears to be figuring out how to resolve the libboot.dylib
dependency by some other means, perhaps by consulting the rpath
setting within libboot.dylib).
So, in order to abstract over this distinction, I added the
RPATH_LINK_SEARCH macro to the run-make infrastructure and added
calls to it where necessary to get Linux working. On architectures
other than Linux, the macro expands to nothing.
* Disable miscellaneous tests atop stage1.
* An especially interesting instance of the previous bullet point:
Excuse regex from doing rustdoc tests atop stage1.
This was a (nearly-) final step to get `make check-stage1` working
again.
The use of a special-case check for regex here is ugly but is
analogous other similar checks for regex such as the one that landed
in PR #13844.
The way this is written, the user will get a reminder that
doc-crate-regex is being skipped whenever their rules attempt to do
the crate documentation tests. This is deliberate: I want people
running `make check-stage1` to be reminded about which cases are
being skipped. (But if such echo noise is considered offensive, it
can obviously be removed.)
* Got windows working with the above changes.
This portion of the commit is a cleanup revision of the (previously
mentioned on try builds) re-architecting of how the LD_LIBRARY_PATH
setup and extension is handled in order to accommodate Windows' (1.)
use of `$PATH` for that purpose and (2.) use of spaces in `$PATH`
entries (problematic for make and for interoperation with tools at
the shell).
* In addition, since the code has been rearchitected to pass the
HOST_RPATH_DIR/TARGET_RPATH_DIR rather than a whole sh
environment-variable setting command, there is no need to for the
convert_path_spec calls in maketest.py, which in fact were put in
place to placate Windows but were now causing the Windows builds to
fail. Instead we just convert the paths to absolute paths just like
all of the other path arguments.
Also, note for makefile hackers: apparently you cannot quote operands
to `ifeq` in Makefile (or at least, you need to be careful about
adding them, e.g. to only one side).
2014-04-25 18:22:23 +02:00
|
|
|
RPATH_VAR$(1)_T_$(2)_H_$(3) := $$(TARGET_RPATH_VAR$(1)_T_$(2)_H_$(3))
|
2014-04-11 19:52:01 +02:00
|
|
|
endif
|
2014-02-14 08:55:49 +01:00
|
|
|
endif
|
|
|
|
|
2014-07-23 06:37:05 +02:00
|
|
|
STAGE$(1)_T_$(2)_H_$(3) := \
|
|
|
|
$$(Q)$$(RPATH_VAR$(1)_T_$(2)_H_$(3)) \
|
|
|
|
$$(call CFG_RUN_TARG_$(3),$(1), \
|
|
|
|
$$(CFG_VALGRIND_COMPILE$(1)) \
|
|
|
|
$$(HBIN$(1)_H_$(3))/rustc$$(X_$(3)) \
|
|
|
|
--cfg $$(CFGFLAG$(1)_T_$(2)_H_$(3)) \
|
2014-02-14 08:55:49 +01:00
|
|
|
$$(CFG_RUSTC_FLAGS) $$(EXTRAFLAGS_STAGE$(1)) --target=$(2)) \
|
|
|
|
$$(RUSTC_FLAGS_$(2))
|
|
|
|
|
|
|
|
endef
|
|
|
|
|
|
|
|
$(foreach build,$(CFG_HOST), \
|
|
|
|
$(eval $(foreach target,$(CFG_TARGET), \
|
|
|
|
$(eval $(foreach stage,$(STAGES), \
|
|
|
|
$(eval $(call SREQ,$(stage),$(target),$(build))))))))
|
|
|
|
|
2014-04-11 19:52:01 +02:00
|
|
|
$(foreach build,$(CFG_HOST), \
|
|
|
|
$(eval $(foreach target,$(CFG_TARGET), \
|
|
|
|
$(eval $(foreach stage,$(STAGES), \
|
|
|
|
$(eval $(call SREQ_CMDS,$(stage),$(target),$(build))))))))
|
|
|
|
|
2014-02-14 08:55:49 +01:00
|
|
|
######################################################################
|
|
|
|
# rustc-H-targets
|
|
|
|
#
|
|
|
|
# Builds a functional Rustc for the given host.
|
|
|
|
######################################################################
|
|
|
|
|
|
|
|
define DEF_RUSTC_STAGE_TARGET
|
|
|
|
# $(1) == architecture
|
|
|
|
# $(2) == stage
|
|
|
|
|
2014-07-23 06:37:05 +02:00
|
|
|
rustc-stage$(2)-H-$(1): \
|
2014-02-14 08:55:49 +01:00
|
|
|
$$(foreach target,$$(CFG_TARGET),$$(SREQ$(2)_T_$$(target)_H_$(1)))
|
|
|
|
|
|
|
|
endef
|
|
|
|
|
2014-07-23 06:37:05 +02:00
|
|
|
$(foreach host,$(CFG_HOST), \
|
|
|
|
$(eval $(foreach stage,1 2 3, \
|
2014-02-14 08:55:49 +01:00
|
|
|
$(eval $(call DEF_RUSTC_STAGE_TARGET,$(host),$(stage))))))
|
|
|
|
|
|
|
|
rustc-stage1: rustc-stage1-H-$(CFG_BUILD)
|
|
|
|
rustc-stage2: rustc-stage2-H-$(CFG_BUILD)
|
|
|
|
rustc-stage3: rustc-stage3-H-$(CFG_BUILD)
|
|
|
|
|
|
|
|
define DEF_RUSTC_TARGET
|
|
|
|
# $(1) == architecture
|
|
|
|
|
|
|
|
rustc-H-$(1): rustc-stage2-H-$(1)
|
|
|
|
endef
|
|
|
|
|
2014-07-23 06:37:05 +02:00
|
|
|
$(foreach host,$(CFG_TARGET), \
|
2014-02-14 08:55:49 +01:00
|
|
|
$(eval $(call DEF_RUSTC_TARGET,$(host))))
|
|
|
|
|
|
|
|
rustc-stage1: rustc-stage1-H-$(CFG_BUILD)
|
|
|
|
rustc-stage2: rustc-stage2-H-$(CFG_BUILD)
|
|
|
|
rustc-stage3: rustc-stage3-H-$(CFG_BUILD)
|
|
|
|
rustc: rustc-H-$(CFG_BUILD)
|
|
|
|
|
|
|
|
rustc-H-all: $(foreach host,$(CFG_HOST),rustc-H-$(host))
|
|
|
|
|
|
|
|
######################################################################
|
|
|
|
# Entrypoint rule
|
|
|
|
######################################################################
|
|
|
|
|
|
|
|
.DEFAULT_GOAL := all
|
|
|
|
|
|
|
|
define ALL_TARGET_N
|
|
|
|
ifneq ($$(findstring $(1),$$(CFG_HOST)),)
|
|
|
|
# This is a host
|
|
|
|
all-target-$(1)-host-$(2): $$(CSREQ2_T_$(1)_H_$(2))
|
|
|
|
else
|
|
|
|
# This is a target only
|
|
|
|
all-target-$(1)-host-$(2): $$(SREQ2_T_$(1)_H_$(2))
|
|
|
|
endif
|
|
|
|
endef
|
|
|
|
|
|
|
|
$(foreach target,$(CFG_TARGET), \
|
|
|
|
$(foreach host,$(CFG_HOST), \
|
|
|
|
$(eval $(call ALL_TARGET_N,$(target),$(host)))))
|
|
|
|
|
|
|
|
ALL_TARGET_RULES = $(foreach target,$(CFG_TARGET), \
|
|
|
|
$(foreach host,$(CFG_HOST), \
|
|
|
|
all-target-$(target)-host-$(host)))
|
|
|
|
|
|
|
|
all: $(ALL_TARGET_RULES) $(GENERATED) docs
|
|
|
|
|
2014-02-14 12:34:18 +01:00
|
|
|
######################################################################
|
|
|
|
# Build system documentation
|
|
|
|
######################################################################
|
|
|
|
|
|
|
|
# $(1) is the name of the doc <section> in Makefile.in
|
2014-02-14 08:55:49 +01:00
|
|
|
# pick everything between tags | remove first line | remove last line
|
|
|
|
# | remove extra (?) line | strip leading `#` from lines
|
2014-02-18 11:53:23 +01:00
|
|
|
SHOW_DOCS = $(Q)awk '/<$(1)>/,/<\/$(1)>/' $(S)/Makefile.in | sed '1d' | sed '$$d' | sed 's/^\# \?//'
|
2014-02-14 12:34:18 +01:00
|
|
|
|
|
|
|
help:
|
|
|
|
$(call SHOW_DOCS,help)
|
|
|
|
|
2014-02-18 11:53:23 +01:00
|
|
|
tips:
|
|
|
|
$(call SHOW_DOCS,tips)
|
2014-02-14 12:34:18 +01:00
|
|
|
|
|
|
|
nitty-gritty:
|
2014-02-18 11:53:23 +01:00
|
|
|
$(call SHOW_DOCS,nitty-gritty)
|