2018-03-27 03:03:26 -07:00
#!/bin/sh
2021-10-29 22:39:14 -07:00
# Find .vcpkg-root.
2019-04-20 02:24:05 +02:00
vcpkgRootDir = $( X = cd -- " $( dirname -- " $0 " ) " && pwd -P)
while [ " $vcpkgRootDir " != "/" ] && ! [ -e " $vcpkgRootDir /.vcpkg-root " ] ; do
vcpkgRootDir = " $( dirname " $vcpkgRootDir " ) "
done
2021-10-29 22:39:14 -07:00
# Parse arguments.
2018-06-11 17:01:13 -07:00
vcpkgDisableMetrics = "OFF"
2018-12-11 10:15:44 -08:00
vcpkgUseSystem = false
2021-10-29 22:39:14 -07:00
vcpkgUseMuslC = "OFF"
2018-06-08 18:01:35 -07:00
for var in " $@ "
do
2018-12-11 10:15:44 -08:00
if [ " $var " = "-disableMetrics" -o " $var " = "--disableMetrics" ] ; then
2018-06-11 17:01:13 -07:00
vcpkgDisableMetrics = "ON"
2018-12-11 10:15:44 -08:00
elif [ " $var " = "-useSystemBinaries" -o " $var " = "--useSystemBinaries" ] ; then
2021-10-29 22:39:14 -07:00
echo "Warning: -useSystemBinaries no longer has any effect; ignored. Note that the VCPKG_USE_SYSTEM_BINARIES environment variable behavior is not changed."
2019-04-11 12:02:03 +04:30
elif [ " $var " = "-allowAppleClang" -o " $var " = "--allowAppleClang" ] ; then
2021-10-29 22:39:14 -07:00
echo "Warning: -allowAppleClang no longer has any effect; ignored."
2020-05-14 12:49:31 -07:00
elif [ " $var " = "-buildTests" ] ; then
2021-10-29 22:39:14 -07:00
echo "Warning: -buildTests no longer has any effect; ignored."
elif [ " $var " = "-musl" ] ; then
vcpkgUseMuslC = "ON"
2018-12-11 10:15:44 -08:00
elif [ " $var " = "-help" -o " $var " = "--help" ] ; then
echo "Usage: ./bootstrap-vcpkg.sh [options]"
echo
echo "Options:"
echo " -help Display usage help"
2021-10-29 22:39:14 -07:00
echo " -disableMetrics Mark this vcpkg root to disable metrics."
echo " -musl Use the musl binary rather than the glibc binary on Linux."
2018-12-11 10:15:44 -08:00
exit 1
2018-06-08 18:01:35 -07:00
else
2018-12-11 10:15:44 -08:00
echo " Unknown argument $var . Use '-help' for help. "
2018-06-08 18:01:35 -07:00
exit 1
fi
done
2020-05-19 15:22:44 -07:00
# Enable using this entry point on windows from git bash by redirecting to the .bat file.
unixName = $( uname -s | sed 's/MINGW.*_NT.*/MINGW_NT/' )
if [ " $unixName " = "MINGW_NT" ] ; then
if [ " $vcpkgDisableMetrics " = "ON" ] ; then
args = "-disableMetrics"
else
args = ""
fi
vcpkgRootDir = $( cygpath -aw " $vcpkgRootDir " )
cmd " /C $vcpkgRootDir \\bootstrap-vcpkg.bat $args " || exit 1
exit 0
fi
2021-10-29 22:39:14 -07:00
# Determine the downloads directory.
2018-12-11 11:48:41 -08:00
if [ -z ${ VCPKG_DOWNLOADS +x } ] ; then
downloadsDir = " $vcpkgRootDir /downloads "
else
downloadsDir = " $VCPKG_DOWNLOADS "
if [ ! -d " $VCPKG_DOWNLOADS " ] ; then
echo " VCPKG_DOWNLOADS was set to ' $VCPKG_DOWNLOADS ', but that was not a directory. "
exit 1
fi
fi
2018-03-27 03:03:26 -07:00
2021-10-29 22:39:14 -07:00
# Check for minimal prerequisites.
2018-03-27 03:03:26 -07:00
vcpkgCheckRepoTool( )
{
__tool = $1
if ! command -v " $__tool " >/dev/null 2>& 1 ; then
echo " Could not find $__tool . Please install it (and other dependencies) with: "
2021-10-29 22:39:14 -07:00
echo "On Debian and Ubuntu derivatives:"
echo " sudo apt-get install curl zip unzip tar"
echo "On recent Red Hat and Fedora derivatives:"
echo " sudo dnf install curl zip unzip tar"
echo "On older Red Hat and Fedora derivatives:"
echo " sudo yum install curl zip unzip tar"
echo "On SUSE Linux and derivatives:"
echo " sudo zypper install curl zip unzip tar"
2022-03-21 13:16:56 -04:00
echo "On Arch Linux and derivatives:"
echo " sudo pacman -S curl zip unzip tar cmake ninja"
2021-10-29 22:39:14 -07:00
echo "On Alpine:"
echo " apk add build-base cmake ninja zip unzip curl git"
echo " (and export VCPKG_FORCE_SYSTEM_BINARIES=1)"
2018-03-27 03:03:26 -07:00
exit 1
fi
}
2021-10-29 22:39:14 -07:00
vcpkgCheckRepoTool curl
vcpkgCheckRepoTool zip
vcpkgCheckRepoTool unzip
vcpkgCheckRepoTool tar
UNAME = " $( uname) "
ARCH = " $( uname -m) "
if [ -e /etc/alpine-release ] ; then
vcpkgUseSystem = "ON"
vcpkgUseMuslC = "ON"
fi
if [ " $UNAME " = "OpenBSD" ] ; then
vcpkgUseSystem = "ON"
if [ -z " $CXX " ] ; then
CXX = /usr/bin/clang++
2020-09-05 10:45:48 -07:00
fi
2021-10-29 22:39:14 -07:00
if [ -z " $CC " ] ; then
CC = /usr/bin/clang
fi
fi
if [ " $vcpkgUseSystem " = "ON" ] ; then
vcpkgCheckRepoTool cmake
vcpkgCheckRepoTool ninja
vcpkgCheckRepoTool git
vcpkgCheckRepoTool gcc
fi
# Determine what we are going to do to bootstrap:
# MacOS -> Download vcpkg-macos
# Linux
# useMuslC -> download vcpkg-muslc
# amd64 -> download vcpkg-glibc
# Otherwise
# Download and build from source
# Choose the vcpkg binary to download
vcpkgDownloadTool = "ON"
2023-03-30 12:02:53 -07:00
vcpkgToolReleaseTag = "2023-03-29"
2021-10-29 22:39:14 -07:00
if [ " $UNAME " = "Darwin" ] ; then
echo "Downloading vcpkg-macos..."
2023-03-30 12:02:53 -07:00
vcpkgToolReleaseSha = "f83ec768200c6ece26555aba8d25c17063fed27ef7744f42eaa7772fa55a0f6187a2a4bae6fa4a72a23f6bb8590e056b13d4215e340d4e3d42de030b9e36a721"
2021-10-29 22:39:14 -07:00
vcpkgToolName = "vcpkg-macos"
elif [ " $vcpkgUseMuslC " = "ON" ] ; then
echo "Downloading vcpkg-muslc..."
2023-03-30 12:02:53 -07:00
vcpkgToolReleaseSha = "f81ccaffe8ba2e775277312296581c5cb37f5f659f09cf3c99c07346ff1e73e9e4ac42aeed31e0db408b49ab0114bc947db5e26c4f24a57b13a6ad0c12d0b423"
2021-10-29 22:39:14 -07:00
vcpkgToolName = "vcpkg-muslc"
elif [ " $ARCH " = "x86_64" ] ; then
echo "Downloading vcpkg-glibc..."
2023-03-30 12:02:53 -07:00
vcpkgToolReleaseSha = "4fea1d3f36a1895b5535da9595871f80900c58aac288ffb7939290f13d268ee82ba8e358675e2f191ab6564536a809de42b3819fec300b0195a8d8e8513d0051"
2021-10-29 22:39:14 -07:00
vcpkgToolName = "vcpkg-glibc"
else
echo "Unable to determine a binary release of vcpkg; attempting to build from source."
vcpkgDownloadTool = "OFF"
2023-03-30 12:02:53 -07:00
vcpkgToolReleaseSha = "3c80824f31775aac981d13dd5e4aab8565f4ec9b45440cd8d9b2b76d4131071fbcc7170979475f436a355c7f079d41d6b140ec84465c7ff4fac9ca26d20d0a30"
2021-10-29 22:39:14 -07:00
fi
2020-09-05 10:45:48 -07:00
2021-10-29 22:39:14 -07:00
# Do the download or build.
2018-03-27 03:03:26 -07:00
vcpkgCheckEqualFileHash( )
{
url = $1 ; filePath = $2 ; expectedHash = $3
2018-04-25 22:23:45 -07:00
if command -v "sha512sum" >/dev/null 2>& 1 ; then
actualHash = $( sha512sum " $filePath " )
else
# sha512sum is not available by default on osx
# shasum is not available by default on Fedora
actualHash = $( shasum -a 512 " $filePath " )
2018-04-26 07:38:45 +07:00
fi
2018-03-27 03:03:26 -07:00
actualHash = " ${ actualHash %% * } " # shasum returns [hash filename], so get the first word
if ! [ " $expectedHash " = " $actualHash " ] ; then
echo ""
echo "File does not have expected hash:"
echo " url: [ $url ] "
echo " File path: [ $downloadPath ] "
echo " Expected hash: [ $sha512 ] "
echo " Actual hash: [ $actualHash ] "
2019-03-19 16:32:24 -07:00
exit 1
2018-03-27 03:03:26 -07:00
fi
}
vcpkgDownloadFile( )
{
url = $1 ; downloadPath = $2 sha512 = $3
rm -rf " $downloadPath .part "
2021-07-27 15:42:43 -07:00
curl -L $url --tlsv1.2 --create-dirs --retry 3 --output " $downloadPath .part " --silent --show-error --fail || exit 1
2018-03-27 03:03:26 -07:00
vcpkgCheckEqualFileHash $url " $downloadPath .part " $sha512
2021-10-29 22:39:14 -07:00
chmod +x " $downloadPath .part "
2018-03-27 03:03:26 -07:00
mv " $downloadPath .part " " $downloadPath "
}
2021-10-29 22:39:14 -07:00
vcpkgExtractTar( )
2018-03-27 03:03:26 -07:00
{
archive = $1 ; toPath = $2
rm -rf " $toPath " " $toPath .partial "
mkdir -p " $toPath .partial "
2021-10-29 22:39:14 -07:00
$( cd " $toPath .partial " && tar xzf " $archive " )
2018-03-27 03:03:26 -07:00
mv " $toPath .partial " " $toPath "
}
2021-10-29 22:39:14 -07:00
if [ " $vcpkgDownloadTool " = "ON" ] ; then
vcpkgDownloadFile " https://github.com/microsoft/vcpkg-tool/releases/download/ $vcpkgToolReleaseTag / $vcpkgToolName " " $vcpkgRootDir /vcpkg " $vcpkgToolReleaseSha
else
2018-03-27 03:03:26 -07:00
if [ " x $CXX " = "x" ] ; then
2022-06-15 11:20:52 -07:00
if which g++-12 >/dev/null 2>& 1; then
CXX = g++-12
elif which g++-11 >/dev/null 2>& 1; then
2021-05-03 10:50:38 -07:00
CXX = g++-11
elif which g++-10 >/dev/null 2>& 1; then
2020-09-28 03:53:24 +03:00
CXX = g++-10
elif which g++-9 >/dev/null 2>& 1; then
2019-05-13 11:43:24 -07:00
CXX = g++-9
elif which g++-8 >/dev/null 2>& 1; then
2018-05-15 20:57:10 -07:00
CXX = g++-8
elif which g++-7 >/dev/null 2>& 1; then
2018-03-27 03:03:26 -07:00
CXX = g++-7
elif which g++-6 >/dev/null 2>& 1; then
CXX = g++-6
2020-04-17 10:56:27 -07:00
elif which g++ >/dev/null 2>& 1; then
CXX = g++
2018-03-27 03:03:26 -07:00
fi
[vcpkg] Clean up CMake build system (#10834)
There are quite a few changes to the CMake build system packaged up into
one set here:
* Added `toolsrc/cmake/utilities.cmake`, which contains the following:
* `vcpkg_detect_compiler` -- get the name of the C++ compiler, as one
of {gcc, clang, msvc}
* `vcpkg_detect_standard_library` -- get the name of the standard
library we're linking to, as one of {libstdc++, libc++, msvc-stl}
* `vcpkg_detect_std_filesystem` -- figure out how to link and call
into C++17's filesystem; whether one needs to link to `stdc++fs` or
`c++fs`, and whether to use `<filesystem>` or
`<experimental/filesystem>`.
* Added a `VCPKG_WARNINGS_AS_ERRORS`, split off from
`VCPKG_DEVELOPMENT_WARNINGS`, which allows one to use the development
warnings without passing -Werror
* Rename `DEFINE_DISABLE_METRICS` to `VCPKG_DISABLE_METRICS` -- the
former will now print a deprecation message and set the latter.
* Now, print a deprecation message on `WERROR`; it doesn't do anything
since the behavior it requested is now the default.
* Pass `-std=c++17` if the compiler allows it, instead of `-std=c++1z`
* Do some code movement
* Pass `USE_STD_FILESYSTEM` if possible, instead of only on minGW
* Renamed to `VCPKG_USE_STD_FILESYSTEM`
Additionally, we now pass `/W4` in Debug mode on x86 in the Visual
Studio build system; this brings it in line with the CMake build system,
and the x64 Visual Studio build system.
And finally, we make some minor code changes to support compiling in
VCPKG_DEVELOPMENT_WARNINGS mode.
2020-04-14 22:08:50 -07:00
# If we can't find g++, allow CMake to do the look-up
2018-03-27 03:03:26 -07:00
fi
2020-09-05 10:45:48 -07:00
2021-10-29 22:39:14 -07:00
vcpkgToolReleaseTarball = " $vcpkgToolReleaseTag .tar.gz "
vcpkgToolUrl = " https://github.com/microsoft/vcpkg-tool/archive/ $vcpkgToolReleaseTarball "
baseBuildDir = " $vcpkgRootDir /buildtrees/_vcpkg "
buildDir = " $baseBuildDir /build "
tarballPath = " $downloadsDir / $vcpkgToolReleaseTarball "
srcBaseDir = " $baseBuildDir /src "
srcDir = " $srcBaseDir /vcpkg-tool- $vcpkgToolReleaseTag "
2020-11-23 18:43:23 +01:00
2021-10-29 22:39:14 -07:00
if [ -e " $tarballPath " ] ; then
vcpkgCheckEqualFileHash " $vcpkgToolUrl " " $tarballPath " " $vcpkgToolReleaseSha "
2019-10-07 19:35:13 +02:00
else
2021-10-29 22:39:14 -07:00
echo "Downloading vcpkg tool sources"
vcpkgDownloadFile " $vcpkgToolUrl " " $tarballPath " " $vcpkgToolReleaseSha "
2019-10-07 19:35:13 +02:00
fi
2018-03-27 03:03:26 -07:00
2021-10-29 22:39:14 -07:00
echo "Building vcpkg-tool..."
rm -rf " $baseBuildDir "
mkdir -p " $buildDir "
vcpkgExtractTar " $tarballPath " " $srcBaseDir "
cmakeConfigOptions = "-DCMAKE_BUILD_TYPE=Release -G 'Ninja' -DVCPKG_DEVELOPMENT_WARNINGS=OFF"
2021-02-04 10:15:44 -08:00
2021-10-29 22:39:14 -07:00
if [ " ${ VCPKG_MAX_CONCURRENCY } " != "" ] ; then
cmakeConfigOptions = " $cmakeConfigOptions '-DCMAKE_JOB_POOL_COMPILE:STRING=compile' '-DCMAKE_JOB_POOL_LINK:STRING=link' '-DCMAKE_JOB_POOLS:STRING=compile= $VCPKG_MAX_CONCURRENCY ;link= $VCPKG_MAX_CONCURRENCY ' "
fi
2021-02-04 10:15:44 -08:00
2021-10-29 22:39:14 -07:00
( cd " $buildDir " && CXX = " $CXX " eval cmake " $srcDir " $cmakeConfigOptions ) || exit 1
( cd " $buildDir " && cmake --build .) || exit 1
2018-03-27 03:03:26 -07:00
2021-10-29 22:39:14 -07:00
rm -rf " $vcpkgRootDir /vcpkg "
cp " $buildDir /vcpkg " " $vcpkgRootDir / "
2021-07-27 16:20:45 -07:00
fi
2021-10-29 22:39:14 -07:00
# Apply the disable-metrics marker file.
2021-01-13 14:06:06 -08:00
if [ " $vcpkgDisableMetrics " = "ON" ] ; then
touch " $vcpkgRootDir /vcpkg.disable-metrics "
elif ! [ -f " $vcpkgRootDir /vcpkg.disable-metrics " ] ; then
# Note that we intentionally leave any existing vcpkg.disable-metrics; once a user has
# opted out they should stay opted out.
2020-05-29 14:09:03 -07:00
cat <<EOF
Telemetry
---------
vcpkg collects usage data in order to help us improve your experience.
The data collected by Microsoft is anonymous.
You can opt-out of telemetry by re-running the bootstrap-vcpkg script with -disableMetrics,
passing --disable-metrics to vcpkg on the command line,
or by setting the VCPKG_DISABLE_METRICS environment variable.
Read more about vcpkg telemetry at docs/about/privacy.md
EOF
2020-02-13 18:12:12 -08:00
fi