pax_global_header 0000666 0000000 0000000 00000000064 12732311114 0014505 g ustar 00root root 0000000 0000000 52 comment=0979a4b48ccec520e7f5fdd208adf7ace91c274a
mongo-cxx-driver-legacy-1.1.2/ 0000775 0000000 0000000 00000000000 12732311114 0016160 5 ustar 00root root 0000000 0000000 mongo-cxx-driver-legacy-1.1.2/.gitignore 0000664 0000000 0000000 00000000205 12732311114 0020145 0 ustar 00root root 0000000 0000000
# Directories that are generated
/build
/docs
/callgrind.out.*
/massif.out.*
*~
*.pyc
*#
.#*
#osx
.DS_Store
._.DS_Store
*.fuse_*
mongo-cxx-driver-legacy-1.1.2/.mci.yml 0000664 0000000 0000000 00000056530 12732311114 0017542 0 ustar 00root root 0000000 0000000 #######################################
# CXX Driver Config for MCI #
#######################################
## Some variables for convenience:
cxx_driver_variables:
## The basic set of tests to run on most buildvariants
latest_test_list: &latest_tests
- name: "compile"
- name: "unit-test"
- name: "integration-test-latest"
- name: "integration-test-latest-with-auth"
- name: "client-test-latest"
## Note that the in 3.0, the default storage engine is MMAPv1 and
## WiredTiger is opt-in, but as of MongoDB 3.1.4, the
## default is WiredTiger and MMAPv1 is opt-in.
storage_engine_test_list: &storage_engine_tests
- name: "compile"
- name: "unit-test"
- name: "integration-test-3.0"
- name: "integration-test-3.0-with-WiredTiger"
- name: "integration-test-3.2"
- name: "integration-test-3.2-with-MMAPv1"
- name: "client-test-3.0"
- name: "client-test-3.0-with-WiredTiger"
- name: "client-test-3.2"
- name: "client-test-3.2-with-MMAPv1"
version_test_list: &version_tests
- name: "compile"
- name: "lint"
- name: "unit-test"
- name: "integration-test-2.2"
- name: "integration-test-2.4"
- name: "integration-test-2.6"
- name: "integration-test-3.0"
- name: "integration-test-3.2"
- name: "integration-test-latest"
- name: "client-test-2.2"
- name: "client-test-2.4"
- name: "client-test-2.6"
- name: "client-test-3.0"
- name: "client-test-3.2"
- name: "client-test-latest"
## Common download urls (merge in as hashes)
mongo_download_url_prefixes:
ubuntu1404: &mongo_url_ubuntu1404
mongo_url_prefix: "http://downloads.mongodb.com/linux/mongodb-linux-x86_64-"
mongo_url_platform: "ubuntu1404-"
windows64-bitcomm: &mongo_url_windows64
mongo_url_prefix: "http://downloads.mongodb.com/win32/mongodb-win32-x86_64-"
mongo_url_platform: "windows-64-"
windows32: &mongo_url_windows32
mongo_url_prefix: "http://downloads.mongodb.org/win32/mongodb-win32-i386-"
mongo_url_enterprise_keyword: ""
rhel55: &mongo_url_rhel55
mongo_url_prefix: "http://downloads.mongodb.com/linux/mongodb-linux-x86_64-"
mongo_url_platform: "rhel57-"
rhel55_32: &mongo_url_rhel55_32
mongo_url_prefix: "http://downloads.mongodb.org/linux/mongodb-linux-i686-"
mongo_url_enterprise_keyword: ""
mongo_url_subscription_keyword: ""
osx-1010: &mongo_url_osx_1010
mongo_url_prefix: "http://downloads.mongodb.org/osx/mongodb-osx-x86_64-"
mongo_url_enterprise_keyword: ""
## Common sets of scons flags
scons_flags:
standard: &scons_flags_64
scons_flags: "--64 --ssl --use-sasl-client --sharedclient"
standard_32: &scons_flags_32
scons_flags: "--32 --ssl --use-sasl-client --sharedclient"
ubuntu_c++11: &scons_flags_cpp11
scons_flags: "--64 --c++11 --ssl --use-sasl-client --sharedclient"
osx_1010: &scons_flags_osx_1010
scons_flags: "--64 --ssl --use-sasl-client --sharedclient --osx-version-min=10.7 --libc++"
## test all plausible combinations of static/dynamic mongo client and windows runtime:
static_windows: &scons_flags_64_windows_static
scons_flags: "--64 --ssl --use-sasl-client"
dynamic_RT_windows: &scons_flags_64_windows_dynamic_rt
scons_flags: "--64 --ssl --use-sasl-client --dynamic-windows"
dynamic_windows: &scons_flags_64_windows_dynamic
scons_flags: "--64 --ssl --use-sasl-client --dynamic-windows --sharedclient"
32bit_windows: &scons_flags_32_windows_dynamic
scons_flags: "--32 --dynamic-windows --sharedclient"
## Special compile flags
compile_flags:
debug: &compile_flags_debug
compile_flags: "--dbg=on"
parallel_compile_flags:
proc_parallel: ¶llel_compile_flags_proc
parallel_compile_flags: "-j$(grep -c ^processor /proc/cpuinfo)"
sysctl_parallel: ¶llel_compile_flags_sysctl
parallel_compile_flags: "-j$(sysctl -n hw.logicalcpu)"
## Scripts that are shared between buildvariants
scripts:
mongo_orchestration:
windows: &mongo_orchestration_windows
start_mongo_orchestration: |
echo "Installing Mongo Orchestration..."
trap 'set +o errexit; mongo-orchestration stop;' EXIT
taskkill.exe /fi python /f
echo "Starting Mongo Orchestration..."
echo "{ \"releases\": { \"default\": \"c:\\\\mongodb\\\\bin\" }, \"last_updated\": \"2014-08-29 20:57:00.000000\" }" > orchestration.config
mongo-orchestration -f orchestration.config -e default -s wsgiref start --socket-timeout-ms=60000
sleep 15
linux: &mongo_orchestration_linux
## we are going to manually install mongo-orchestration for now on Linux until it is stable enough that we don't always to install from HEAD
start_mongo_orchestration: |
echo "Installing Mongo Orchestration..."
trap 'set +o errexit; mongo-orchestration stop;' EXIT
echo "Starting Mongo Orchestration..."
echo "{ \"releases\": { \"default\": \"`pwd`/mongodb/bin\" }, \"last_updated\": \"2014-08-29 20:57:00.000000\" }" > orchestration.config
TMPDIR=/data/db mongo-orchestration -f orchestration.config -e default start --socket-timeout-ms=60000
sleep 15
osx: &mongo_orchestration_osx
start_mongo_orchestration: |
echo "Starting Mongo Orchestration..."
trap 'set +o errexit; /usr/local/bin/mongo-orchestration stop;' EXIT
echo "{ \"releases\": { \"default\": \"`pwd`/mongodb/bin\" }, \"last_updated\": \"2014-08-29 20:57:00.000000\" }" > orchestration.config
TMPDIR=/data/db /usr/local/bin/mongo-orchestration -f orchestration.config -e default start # --socket-timeout-ms=60000 <- uncomment when OSX builders get new MO
sleep 15
## Other os-specific attributes, grouped by OS
## Misc. for Windows builds
windows_compilers:
## msvc2010
msvc2010: &with_msvc2010
toolchain_flags: --msvc-version=10.0
libpath: --libpath="c:\local\boost_1_57_0\lib64-msvc-10.0"
cpppath: --cpppath="c:\local\boost_1_57_0"
dllpath: --runtime-library-search-path="c:\local\boost_1_57_0\lib64-msvc-10.0,c:\openssl\bin,c:\sasl\bin,c:\curl\dlls"
extrapath: --extrapath="c:\openssl,c:\sasl,c:\curl"
## msvc2013, 32-bit boost headers
msvc2013-32: &with_msvc2010_32bit
toolchain_flags: --msvc-version=10.0
libpath: --libpath="c:\local\boost_1_57_0\lib32-msvc-10.0"
cpppath: --cpppath="c:\local\boost_1_57_0"
dllpath: --runtime-library-search-path="c:\local\boost_1_57_0\lib32-msvc-10.0,c:\curl\dlls"
extrapath: --extrapath="c:\curl"
msvc2013: &with_msvc2013
toolchain_flags: --msvc-version=12.0
libpath: --libpath="c:\local\boost_1_56_0\lib64-msvc-12.0"
cpppath: --cpppath="c:\local\boost_1_56_0"
dllpath: --runtime-library-search-path="c:\local\boost_1_56_0\lib64-msvc-12.0,c:\openssl\bin,c:\sasl\bin,c:\curl\dlls"
extrapath: --extrapath="c:\openssl,c:\sasl,c:\curl"
msvc2015: &with_msvc2015
toolchain_flags: --msvc-version=14.0
libpath: --libpath="c:\local\boost_1_60_0\lib64-msvc-14.0"
cpppath: --cpppath="c:\local\boost_1_60_0"
dllpath: --runtime-library-search-path="c:\local\boost_1_60_0\lib64-msvc-14.0,c:\openssl\bin,c:\sasl\bin,c:\curl\dlls"
extrapath: --extrapath="c:\openssl,c:\sasl,c:\curl"
## all windows buildvariants have these attributes in common
windows_common: &windows_common
mongo_url_extension: "zip"
scons: scons.bat
extension: ".exe"
windows: true
<<: *mongo_orchestration_windows
## Paths for OS X builds
osx_fixups:
scons:
boost_headers: &extrapath_osx_1010
extrapath: --extrapath="/usr/local"
## Paths and flags for RHEL 5.5 builds
rhel55_fixups:
scons:
warning_flags: &warning_flags_rhel55
# For some reason GCC on RHEL 5.5 gives lots of warnings from its own headers when using
# visibility attributes.
warning_flags: --disable-warnings-as-errors
cpp:
cpp_boost: &cpppath_rhel55
cpppath: --cpppath="/usr/include/boost141"
lib:
lib32_boost: &libpath_rhel55_32
libpath: --libpath="/usr/lib/boost141"
lib64_boost: &libpath_rhel55_64
libpath: --libpath="/usr/lib64/boost141"
#######################################
# Functions #
#######################################
functions:
"fetch source" :
command: git.get_project
params:
directory: mongo-cxx-driver
"fetch mongodb" :
command: shell.exec
params:
working_dir: "mongo-cxx-driver"
script: |
set -o verbose
set -o errexit
curl -s ${mongo_url} --output mongo_enterprise.${ext|tgz}
${decompress} mongo_enterprise.${ext|tgz}
mv mongodb* mongodb
chmod +x ./mongodb/bin/mongod${extension}
if [ ${windows|false} = true ]; then
cp -r mongodb /cygdrive/c/mongodb
#This won't run on a 32bit OS.
./mongodb/bin/vcredist_x64${extension} /Q
fi
"fetch artifacts" :
command: s3.get
params:
aws_key: ${aws_key}
aws_secret: ${aws_secret}
remote_file: mongo-cxx-driver/${build_variant}/${revision}/artifacts/mongo-${build_id}.tar.gz
bucket: mciuploads
extract_to: mongo-cxx-driver
"use WiredTiger storage" :
command: expansions.update
params:
updates:
- key: "orchestration_preset"
value: "--mongo-orchestration-preset=wiredtiger.json"
"use MMAPv1 storage" :
command: expansions.update
params:
updates:
- key: "orchestration_preset"
# Requires mongo-orchestration 0.4
value: "--mongo-orchestration-preset=mmapv1.json"
"use auth" :
command: expansions.update
params:
updates:
- key: "orchestration_preset"
# Requires mongo-orchestration 0.4.2
value: "--mongo-orchestration-preset=auth.json"
"set version 2.2" :
command: expansions.update
params:
updates:
- key: "mongo_url"
value: ${mongo_url_prefix}${mongo_url_subscription_keyword|subscription-}${mongo_url_platform|}2.2.7.${mongo_url_extension|tgz}
"set version 2.4" :
command: expansions.update
params:
updates:
- key: "mongo_url"
value: ${mongo_url_prefix}${mongo_url_subscription_keyword|subscription-}${mongo_url_platform|}2.4.14.${mongo_url_extension|tgz}
"set version 2.6" :
command: expansions.update
params:
updates:
- key: "mongo_url"
value: ${mongo_url_prefix}${mongo_url_enterprise_keyword|enterprise-}${mongo_url_platform|}2.6.12.${mongo_url_extension|tgz}
"set version 3.0" :
command: expansions.update
params:
updates:
- key: "mongo_url"
value: ${mongo_url_prefix}${mongo_url_enterprise_keyword|enterprise-}${mongo_url_platform|}3.0.11.${mongo_url_extension|tgz}
"set version 3.2" :
command: expansions.update
params:
updates:
- key: "mongo_url"
value: ${mongo_url_prefix}${mongo_url_enterprise_keyword|enterprise-}${mongo_url_platform|}3.2.5.${mongo_url_extension|tgz}
"set version latest" :
command: expansions.update
params:
updates:
- key: "mongo_url"
value: ${mongo_url_prefix}${mongo_url_enterprise_keyword|"enterprise-"}${mongo_url_platform|}latest.${mongo_url_extension|tgz}
"run integration tests" :
command: shell.exec
params:
working_dir: "mongo-cxx-driver"
script: |
${start_mongo_orchestration}
${scons|scons} ${scons_flags} ${warning_flags} ${compile_flags} ${toolchain_flags} ${extrapath} ${dllpath} ${cpppath} ${libpath} ${orchestration_preset} integration
"run client tests" :
command: shell.exec
params:
working_dir: "mongo-cxx-driver"
script: |
${start_mongo_orchestration}
${scons|scons} ${scons_flags} ${warning_flags} ${compile_flags} ${toolchain_flags} ${extrapath} ${dllpath} ${cpppath} ${libpath} ${orchestration_preset} examples
pre:
- command: expansions.fetch
params:
keys:
- local_key: "aws_key"
remote_key: "project_aws_key"
- local_key: "aws_secret"
remote_key: "project_aws_secret"
- command: shell.exec
params:
script: |
rm -rf "mongo-cxx-driver"
if [ ! -e /data/db ]; then
mkdir /data/db
elif [ ! -d /data/db ]; then
echo "/data/db already exists and is not a directory!"
exit 1
fi
post:
- command: shell.exec
params:
script: |
cd mongo-cxx-driver && mongo-orchestration stop
${killall_mci|pkill -9 mongo-orchestration; pkill -9 mongod; pkill -9 mongos;}
#######################################
# Tasks #
#######################################
tasks:
- name: lint
commands:
- func: "fetch source"
- command: git.apply_patch
params:
directory: "mongo-cxx-driver"
- command: shell.exec
params:
working_dir: "mongo-cxx-driver"
script: |
set -o errexit
set -o verbose
${scons|scons} ${scons_flags} ${warning_flags} ${compile_flags} ${toolchain_flags} ${extrapath} ${dllpath} ${cpppath} ${libpath} lint
- name: compile
commands:
- func: "fetch source"
- command: git.apply_patch
params:
directory: "mongo-cxx-driver"
- command: shell.exec
params:
working_dir: "mongo-cxx-driver"
script: |
set -o errexit
set -o verbose
${scons|scons} ${scons_flags} ${warning_flags} ${compile_flags} ${parallel_compile_flags} ${toolchain_flags} ${extrapath} ${dllpath} ${cpppath} ${libpath} ${compile_target|all check-install}
- command: shell.exec
params:
working_dir: "mongo-cxx-driver"
script: |
set -o errexit
set -o verbose
tar -czf ../mongo-cxx-driver.tar.gz .
- command: s3.put
params:
aws_key: ${aws_key}
aws_secret: ${aws_secret}
local_file: mongo-cxx-driver.tar.gz
remote_file: mongo-cxx-driver/${build_variant}/${revision}/artifacts/mongo-${build_id}.tar.gz
bucket: mciuploads
permissions: public-read
content_type: ${content_type|application/x-gzip}
- name: "unit-test"
depends_on:
- name: "compile"
commands:
- func: "fetch artifacts"
- command: shell.exec
params:
working_dir: "mongo-cxx-driver"
script: |
set -o verbose
${scons|scons} ${scons_flags} ${warning_flags} ${compile_flags} ${toolchain_flags} ${extrapath} ${dllpath} ${cpppath} ${libpath} unit
- name: "integration-test-2.2"
depends_on:
- name: "compile"
commands:
- func: "set version 2.2"
- func: "fetch artifacts"
- func: "fetch mongodb"
- func: "run integration tests"
- name: "integration-test-2.4"
depends_on:
- name: "compile"
commands:
- func: "set version 2.4"
- func: "fetch artifacts"
- func: "fetch mongodb"
- func: "run integration tests"
- name: "integration-test-2.6"
depends_on:
- name: "compile"
commands:
- func: "set version 2.6"
- func: "fetch artifacts"
- func: "fetch mongodb"
- func: "run integration tests"
- name: "integration-test-3.0"
depends_on:
- name: "compile"
commands:
- func: "set version 3.0"
- func: "fetch artifacts"
- func: "fetch mongodb"
- func: "run integration tests"
- name: "integration-test-3.0-with-WiredTiger"
depends_on:
- name: "compile"
commands:
- func: "set version 3.0"
- func: "use WiredTiger storage"
- func: "fetch artifacts"
- func: "fetch mongodb"
- func: "run integration tests"
- name: "integration-test-3.2"
depends_on:
- name: "compile"
commands:
- func: "set version 3.2"
- func: "fetch artifacts"
- func: "fetch mongodb"
- func: "run integration tests"
- name: "integration-test-3.2-with-MMAPv1"
depends_on:
- name: "compile"
commands:
- func: "set version 3.2"
- func: "use MMAPv1 storage"
- func: "fetch artifacts"
- func: "fetch mongodb"
- func: "run integration tests"
- name: "integration-test-latest"
depends_on:
- name: "compile"
commands:
- func: "set version latest"
- func: "fetch artifacts"
- func: "fetch mongodb"
- func: "run integration tests"
- name: "integration-test-latest-with-auth"
depends_on:
- name: "compile"
commands:
- func: "set version latest"
- func: "fetch artifacts"
- func: "use auth"
- func: "fetch mongodb"
- func: "run integration tests"
- name: "client-test-2.2"
depends_on:
- name: "compile"
commands:
- func: "set version 2.2"
- func: "fetch artifacts"
- func: "fetch mongodb"
- func: "run client tests"
- name: "client-test-2.4"
depends_on:
- name: "compile"
commands:
- func: "set version 2.4"
- func: "fetch artifacts"
- func: "fetch mongodb"
- func: "run client tests"
- name: "client-test-2.6"
depends_on:
- name: "compile"
commands:
- func: "set version 2.6"
- func: "fetch artifacts"
- func: "fetch mongodb"
- func: "run client tests"
- name: "client-test-3.0"
depends_on:
- name: "compile"
commands:
- func: "set version 3.0"
- func: "fetch artifacts"
- func: "fetch mongodb"
- func: "run client tests"
- name: "client-test-3.0-with-WiredTiger"
depends_on:
- name: "compile"
commands:
- func: "set version 3.0"
- func: "use WiredTiger storage"
- func: "fetch artifacts"
- func: "fetch mongodb"
- func: "run client tests"
- name: "client-test-3.2"
depends_on:
- name: "compile"
commands:
- func: "set version 3.0"
- func: "fetch artifacts"
- func: "fetch mongodb"
- func: "run client tests"
- name: "client-test-3.2-with-MMAPv1"
depends_on:
- name: "compile"
commands:
- func: "set version 3.0"
- func: "use MMAPv1 storage"
- func: "fetch artifacts"
- func: "fetch mongodb"
- func: "run client tests"
- name: "client-test-latest"
depends_on:
- name: "compile"
commands:
- func: "set version latest"
- func: "fetch artifacts"
- func: "fetch mongodb"
- func: "run client tests"
#######################################
# Buildvariants #
#######################################
buildvariants:
#######################################
# Linux Buildvariants #
#######################################
## RHEL 5.5
- name: rhel55
display_name: "RHEL 5.5"
expansions:
<<: *scons_flags_64
<<: *parallel_compile_flags_proc
<<: *warning_flags_rhel55
<<: *cpppath_rhel55
<<: *libpath_rhel55_64
<<: *mongo_url_rhel55
<<: *mongo_orchestration_linux
run_on:
- rhel55-test
tasks: *version_tests
## RHEL 5.5 32-bit
- name: rhel55-32-bit
display_name: "RHEL 5.5 32-bit"
expansions:
<<: *scons_flags_32
<<: *parallel_compile_flags_proc
<<: *warning_flags_rhel55
<<: *cpppath_rhel55
<<: *libpath_rhel55_32
<<: *mongo_url_rhel55_32
<<: *mongo_orchestration_linux
run_on:
- rhel55-test
tasks: *latest_tests
## Ubuntu 1404
- name: ubuntu1404
display_name: "Ubuntu1404"
expansions:
<<: *scons_flags_64
<<: *parallel_compile_flags_proc
<<: *mongo_url_ubuntu1404
<<: *mongo_orchestration_linux
run_on:
- ubuntu1404-test
tasks: *storage_engine_tests
## Ubuntu 1404 DEBUG
- name: ubuntu1404-debug
display_name: "Ubuntu1404 dbg"
expansions:
<<: *compile_flags_debug
<<: *parallel_compile_flags_proc
<<: *scons_flags_64
<<: *mongo_url_ubuntu1404
<<: *mongo_orchestration_linux
run_on:
- ubuntu1404-test
tasks: *latest_tests
## Ubuntu 1404 C++11
- name: ubuntu1404-cpp11
display_name: "Ubuntu1404 C++11"
expansions:
<<: *scons_flags_cpp11
<<: *parallel_compile_flags_proc
<<: *mongo_url_ubuntu1404
<<: *mongo_orchestration_linux
run_on:
- ubuntu1404-test
tasks: *latest_tests
#######################################
# OS X Buildvariants #
#######################################
## OS X 10.8
- name: os-x-107
display_name: "OS X 10.7"
expansions:
<<: *mongo_url_osx_1010
<<: *scons_flags_osx_1010
<<: *parallel_compile_flags_sysctl
<<: *extrapath_osx_1010
<<: *mongo_orchestration_osx
run_on:
- osx-1010
tasks: *latest_tests
#######################################
# Windows Buildvariants #
#######################################
## Windows 32-bit (msvc2010)
## dynamic client and RT
- name: windows-32-msvc2010-dyn-dyn
display_name: "Win32(2010) dyn-dyn"
expansions:
<<: *windows_common
<<: *scons_flags_32_windows_dynamic
<<: *parallel_compile_flags_proc
<<: *mongo_url_windows32
<<: *with_msvc2010_32bit
compile_target: driver build-unit
run_on:
- windows-64-vs2010-compile
tasks:
- name: "compile"
- name: "unit-test"
## Windows 64-bit (msvc2010)
## static client and RT
- name: windows-64-msvc2010-static-static
display_name: "Win64(2010) static-static"
expansions:
<<: *windows_common
<<: *scons_flags_64_windows_static
<<: *parallel_compile_flags_proc
<<: *mongo_url_windows64
<<: *with_msvc2010
run_on:
- windows-64-vs2010-compile
tasks: *latest_tests
## Windows 64-bit DEBUG DYNAMIC (msvc2010)
## dynamic client and RT
- name: windows-64-msvc2010-dbg-dyn-dyn
display_name: "Win64(2010) dbg dyn-dyn"
expansions:
<<: *windows_common
<<: *compile_flags_debug
<<: *parallel_compile_flags_proc
<<: *scons_flags_64_windows_dynamic
<<: *mongo_url_windows64
<<: *with_msvc2010
run_on:
- windows-64-vs2010-compile
tasks: *latest_tests
## Windows 64-bit DYNAMIC (msvc2013)
## dynamic client and RT
- name: windows-64-msvc2013-dyn-dyn
display_name: "Win64(2013) dyn-dyn"
expansions:
<<: *windows_common
<<: *parallel_compile_flags_proc
<<: *scons_flags_64_windows_dynamic
<<: *mongo_url_windows64
<<: *with_msvc2013
run_on:
- windows-64-vs2013-compile
tasks: *latest_tests
## Windows 64-bit (msvc2013) DYNAMIC-RT
## static client, dynamic RT
- name: windows-64-msvc-2013-static-dyn
display_name: "Win64(2013) static-dyn"
expansions:
<<: *windows_common
<<: *parallel_compile_flags_proc
<<: *scons_flags_64_windows_dynamic_rt
<<: *mongo_url_windows64
<<: *with_msvc2013
run_on:
- windows-64-vs2013-compile
tasks: *latest_tests
## Windows 64-bit DYNAMIC (msvc2015)
## dynamic client and RT
- name: windows-64-msvc2015-dyn-dyn
display_name: "Win64(2015) dyn-dyn"
expansions:
<<: *windows_common
<<: *parallel_compile_flags_proc
<<: *scons_flags_64_windows_dynamic
<<: *mongo_url_windows64
<<: *with_msvc2015
run_on:
- windows-64-vs2015-compile
tasks: *latest_tests
mongo-cxx-driver-legacy-1.1.2/.travis.yml 0000664 0000000 0000000 00000005303 12732311114 0020272 0 ustar 00root root 0000000 0000000 language: cpp
compiler:
- gcc
- clang
env:
global:
- MONGO_REPO="http://repo.mongodb.com/apt/ubuntu"
- REPO_TYPE="precise/mongodb-enterprise/2.6 multiverse"
- SOURCES_LOC="/etc/apt/sources.list.d/mongodb-enterprise.list"
- KEY_SERVER="hkp://keyserver.ubuntu.com:80"
- MONGOD_PARAMS="--setParameter=enableTestCommands=1"
- MONGOD_OPTS="--port 27999 --httpinterface --dbpath ./data --fork --logpath mongod.log ${MONGOD_PARAMS}"
matrix:
- SANITIZE= DEBUG=
- SANITIZE= DEBUG=--dbg=on
- SANITIZE=--sanitize=address --llvm-symbolizer=llvm-symbolizer-3.4 DEBUG=--dbg=on
- SANITIZE=--sanitize=undefined DEBUG=--dbg=on
matrix:
exclude:
- compiler: gcc
env: SANITIZE=--sanitize=undefined DEBUG=--dbg=on
# Setup required repositories before installation
before_install:
# GCC 4.8.1
- if [ "$CXX" == "g++" ]; then sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test; fi
# Clang 3.4
- if [ "$CXX" == "clang++" ]; then sudo add-apt-repository -y ppa:h-rayflood/llvm; fi
# Boost 1.49
- sudo add-apt-repository -y ppa:jkeiren/ppa
# MongoDB Enterprise Edition 2.6
- sudo apt-key adv --keyserver ${KEY_SERVER} --recv 7F0CEB10
- echo "deb ${MONGO_REPO} ${REPO_TYPE}" | sudo tee ${SOURCES_LOC}
# Update all the repositories
- sudo apt-get update -qq
install:
# GCC 4.8.1
- if [ "$CXX" = "g++" ]; then sudo apt-get install -qq g++-4.8; fi
- if [ "$CXX" = "g++" ]; then export CXX="g++-4.8"; export CC="gcc-4.8"; fi
# Clang 3.4
- if [ "$CXX" == "clang++" ]; then sudo apt-get install --allow-unauthenticated -qq clang-3.4; fi
- if [ "$CXX" == "clang++" ]; then export CXX="clang++-3.4"; export CC="clang-3.4"; fi
# Install Boost 1.49 dependencies via PPA
- sudo apt-get install -qq
libboost1.49-dev
libboost-program-options1.49-dev
libboost-filesystem1.49-dev
libboost-thread1.49-dev
libboost-regex1.49-dev
# Install MongoDB Enterprise and let smoke drive
- sudo apt-get install mongodb-enterprise-server
before_script:
# Set SCONS_FLAGS based on new $CXX and $CC
- $CXX --version
- export GTEST_PARAMS="--gtest-filter=-SASL*"
- export SCONS_CONCURRENCY_FLAG="-j3"
- export SCONS_FLAGS="--mute --ssl --use-sasl-client $GTEST_PARAMS --cxx=$CXX --cc=$CC $DEBUG $SANITIZE"
# Run lint
- scons $SCONS_FLAGS lint
# Build all targets
- scons $SCONS_FLAGS $SCONS_CONCURRENCY_FLAG all
# Install the driver
- scons $SCONS_FLAGS $SCONS_CONCURRENCY_FLAG install
# Check the installation
- scons $SCONS_FLAGS check-install
# Start Mongo Orchestration
- mongod --version
script:
# Test the driver
- scons $SCONS_FLAGS unit
mongo-cxx-driver-legacy-1.1.2/.ycm_extra_conf.py 0000664 0000000 0000000 00000013404 12732311114 0021612 0 ustar 00root root 0000000 0000000 # This file is NOT licensed under the GPLv3, which is the license for the rest
# of YouCompleteMe.
#
# Here's the license text for this file:
#
# This is free and unencumbered software released into the public domain.
#
# Anyone is free to copy, modify, publish, use, compile, sell, or
# distribute this software, either in source code form or as a compiled
# binary, for any purpose, commercial or non-commercial, and by any
# means.
#
# In jurisdictions that recognize copyright laws, the author or authors
# of this software dedicate any and all copyright interest in the
# software to the public domain. We make this dedication for the benefit
# of the public at large and to the detriment of our heirs and
# successors. We intend this dedication to be an overt act of
# relinquishment in perpetuity of all present and future rights to this
# software under copyright law.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
#
# For more information, please refer to
import os
import ycm_core
# These are the compilation flags that will be used in case there's no
# compilation database set (by default, one is not set).
# CHANGE THIS LIST OF FLAGS. YES, THIS IS THE DROID YOU HAVE BEEN LOOKING FOR.
flags = [
'-std=c++',
'-x',
'c++',
'-DBOOST_ALL_NO_LIB',
'-D_SCONS',
'-D_DEBUG',
'-DMONGO_EXPOSE_MACROS',
'-DSUPPORT_UTF8',
'-D_FILE_OFFSET_BITS=64',
'-DMONGO_HAVE___THREAD',
'-DMONGO_HAVE_HEADER_UNISTD_H',
'-DMONGO_HAVE_EXECINFO_BACKTRACE',
'-DXP_UNIX',
'-I.',
'-I./src/',
'-I./src/third_party',
'-I./src/third_party/gtest-1.7.0/include',
'-I./build/linux2/normal/',
'-I./build/cached/',
'-I./build/cached/mongo',
'-isystem/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1',
'-Wall',
'-Wextra',
'-Wc++11-compat',
'-Wno-long-long',
'-Wno-variadic-macros',
'-Wno-unknown-pragmas',
'-Wno-unused-private-field',
'-Wno-unused-parameter',
'-Wsign-compare',
'-Wmismatched-tags',
'-Winvalid-pch',
'-Wnon-virtual-dtor',
'-Woverloaded-virtual',
'-pipe'
]
# Set this to the absolute path to the folder (NOT the file!) containing the
# compile_commands.json file to use that instead of 'flags'. See here for
# more details: http://clang.llvm.org/docs/JSONCompilationDatabase.html
#
# Most projects will NOT need to set this to anything; you can just change the
# 'flags' list of compilation flags. Notice that YCM itself uses that approach.
compilation_database_folder = ''
if os.path.exists(compilation_database_folder):
database = ycm_core.CompilationDatabase(compilation_database_folder)
else:
database = None
SOURCE_EXTENSIONS = ['.cpp', '.cxx', '.cc', '.c', '.m', '.mm']
def DirectoryOfThisScript():
return os.path.dirname(os.path.abspath(__file__))
def MakeRelativePathsInFlagsAbsolute(flags, working_directory):
if not working_directory:
return list(flags)
new_flags = []
make_next_absolute = False
path_flags = ['-isystem', '-I', '-iquote', '--sysroot=']
for flag in flags:
new_flag = flag
if make_next_absolute:
make_next_absolute = False
if not flag.startswith('/'):
new_flag = os.path.join(working_directory, flag)
for path_flag in path_flags:
if flag == path_flag:
make_next_absolute = True
break
if flag.startswith(path_flag):
path = flag[len(path_flag):]
new_flag = path_flag + os.path.join(working_directory, path)
break
if new_flag:
new_flags.append(new_flag)
return new_flags
def IsHeaderFile(filename):
extension = os.path.splitext(filename)[1]
return extension in ['.h', '.hxx', '.hpp', '.hh']
def GetCompilationInfoForFile(filename):
# The compilation_commands.json file generated by CMake does not have
# entries for header files. So we do our best by asking the db for flags
# for a corresponding source file, if any. If one exists, the flags for
# that file should be good enough.
if IsHeaderFile(filename):
basename = os.path.splitext(filename)[0]
for extension in SOURCE_EXTENSIONS:
replacement_file = basename + extension
if os.path.exists(replacement_file):
compilation_info = database.GetCompilationInfoForFile(
replacement_file)
if compilation_info.compiler_flags_:
return compilation_info
return None
return database.GetCompilationInfoForFile(filename)
def FlagsForFile(filename, **kwargs):
if database:
# Bear in mind that compilation_info.compiler_flags_ does NOT return a
# python list, but a "list-like" StringVec object
compilation_info = GetCompilationInfoForFile(filename)
if not compilation_info:
return None
final_flags = MakeRelativePathsInFlagsAbsolute(
compilation_info.compiler_flags_,
compilation_info.compiler_working_dir_)
try:
final_flags.remove('-stdlib=libc++')
except ValueError:
pass
else:
relative_to = DirectoryOfThisScript()
final_flags = MakeRelativePathsInFlagsAbsolute(flags, relative_to)
return {
'flags': final_flags,
'do_cache': True
}
mongo-cxx-driver-legacy-1.1.2/APACHE-2.0.txt 0000664 0000000 0000000 00000026136 12732311114 0020147 0 ustar 00root root 0000000 0000000
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
mongo-cxx-driver-legacy-1.1.2/CONTRIBUTING.md 0000664 0000000 0000000 00000007363 12732311114 0020422 0 ustar 00root root 0000000 0000000 ## Contributing to the MongoDB Legacy C++ Driver Project
Pull requests are always welcome, and the MongoDB dev team appreciates any help the community can
give to help make MongoDB better.
For any particular improvement you want to make, you can begin a discussion on the
[MongoDB Developers Forum][dev-forum]. This is the best place discuss your proposed improvement (and its
implementation) with the core development team.
[dev-forum]: https://groups.google.com/forum/?fromgroups#!forum/mongodb-dev "MongoDB Developers Forum"
## Getting Started
- Create a [MongoDB JIRA account][jira-account].
- Create a [Github account][github-account].
- Fork the repository on Github at https://github.com/mongodb/mongo-cxx-driver.
- Check out the 'legacy' branch 'git checkout legacy'
[jira-account]: https://jira.mongodb.org/secure/Signup!default.jspa "MongoDB JIRA Signup"
[github-account]: https://github.com/signup/free "Githup Signup"
## JIRA Tickets
All commits to the C++ driver repository must reference an issue in the [CXX project][cxx-project]
of the MongoDB JIRA. Before creating any new tickets, please search the existing backlog for any open
tickets that represent your change request. If there is not one, then you should create a new
ticket. Tickets specific to the legacy driver should be filed the label [legacy-cxx][legacy-cxx].
For bugs, please clearly describe the issue you are resolving, including the platforms on which
the issue is present and clear steps to reproduce.
For improvements or feature requests, be sure to explain the goal or use case and the approach
your solution will take.
[cxx-project]: https://jira.mongodb.org/browse/CXX
[legacy-cxx]: https://jira.mongodb.org/browse/CXX-69?jql=labels%20%3D%20legacy-cxx
## The Life Cycle of a Pull Request
Here's what happens when you submit a pull request:
- The MongoDB engineering team will review your pull request to make sure you have included a
CXX ticket in your request and signed the contributor agreement.
- You should receive a response from one of our engineers with additional questions about your
contributions.
- If your pull request matches a ticket and is aligned with the Server Roadmap, it will get
triaged and reviewed by the C++ driver and Kernel teams.
- Pull requests that have been reviewed and approved will be signed off and merged into a
development branch and the associated JIRA CXX issue will be resolved with an expected
fixVersion.
## Style Guide
All commits to the legacy branch must follow the [kernel development rules][kernel-dev-rules].
In particular, all code must follow the MongoDB [kernel code style guidelines][kernel-style-guide].
For anything not covered in this document you should default to the [Google CPP Style Guide][google-style-guide].
Your commit message should also be prefaced with the relevant JIRA ticket, e.g. "CXX-XXX Fixed a bug in aggregation".
[kernel-dev-rules]: http://dochub.mongodb.org/core/kernelcodedevelopmentrules
[kernel-style-guide]: http://dochub.mongodb.org/core/kernelcodestyle
[google-style-guide]: http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml
## Testing
Every non-trivial change to the code base should be accompanied by a relevant addition to or
modification of the test suite. If you don't believe this is necessary, please add an explanation
in the JIRA ticket why no such changes are either needed or possible.
All changes must also pass the full test suite (including your test additions/changes) on your
local machine before you open a pull request.
## Contributor Agreement
A patch will only be considered for merging into the upstream codebase after you have signed the
[contributor agreement][contributor-agreement].
[contributor-agreement]: http://www.mongodb.com/contributor "MongoDB Contributor Agreement"
mongo-cxx-driver-legacy-1.1.2/README.md 0000664 0000000 0000000 00000005516 12732311114 0017446 0 ustar 00root root 0000000 0000000 # MongoDB C++ Driver [](https://travis-ci.org/mongodb/mongo-cxx-driver)
Welcome to the MongoDB C++ Driver!
Please see our [wiki page](https://github.com/mongodb/mongo-cxx-driver/wiki/Download-and-Compile-the-Legacy-Driver) for information about building, testing, and using the driver.
Version [1.1.1](https://github.com/mongodb/mongo-cxx-driver/releases/tag/legacy-1.1.1) of the
C++ legacy driver has been released. Please report any bugs or issues in the C++
[JIRA project](http://jira.mongodb.org/browse/CXX).
You should only use the "legacy" branch if you had been previously using
the "26compat" branch (or the driver inside of the server source) and want to
benefit from incremental improvements while having the same overall
API.
> **Note:** As of MongoDB 2.6.0-rc1, it is no longer possible to build the driver from the server sources: this repository is the only approved source for C++ driver builds.
## Repository Overview
| Branch | Stability | Development | Purpose |
| -------- | ------------| ----------------- | ----------------------------------------------------- |
| master | Stable | Stable Evolution | New C++11 driver |
| legacy | Stable | Stable Evolution | Primary stable C++ driver release |
| 26compat | Stable | Maintenance Only | Drop in replacement for users of existing 2.6 era C++ driver |
Please note that stable branches are only production quality at stable release tags. Other
commits or pre-release tags on a stable branch represent ongoing development work towards the
next stable release, and therefore may be unstable.
## Components
- `libmongoclient.[so|dylib|dll]` - The shared mongoclient library (but see notes)
- `libmongoclient.a` - The static mongoclient library
## Building and Usage
- [Download and Compile](https://github.com/mongodb/mongo-cxx-driver/wiki/Download%20and%20Compile)
- [Tutorial](https://github.com/mongodb/mongo-cxx-driver/wiki/Tutorial)
## Bugs and Issues
See http://jira.mongodb.org/browse/CXX
## Notes
Use of the shared library is experimental on windows and is currently
discouraged. This is primarily due to the complexity of ensuring a matching
implementation of STL types between library and consumer code. This problem
is unique to windows, as the consistent use of system libraries largely
mitigates this danger.
## Documentation
http://docs.mongodb.org/ecosystem/drivers/cpp/
## Mailing Lists and IRC
http://dochub.mongodb.org/core/community
## License
The source files in this repository are made available under the terms of the
Apache License, version 2.0.
mongo-cxx-driver-legacy-1.1.2/SConstruct 0000664 0000000 0000000 00000216640 12732311114 0020223 0 ustar 00root root 0000000 0000000 # -*- mode: python; -*-
import copy
import datetime
import imp
import os
import platform as py_platform
import re
import shlex
import shutil
import stat
import sys
import textwrap
import types
import urllib
import urllib2
import buildscripts.utils
import buildscripts.docs
import buildscripts.lint
import buildscripts.clang_format
EnsureSConsVersion( 1, 1, 0 )
def versiontuple(v):
return tuple(map(int, (v.split("."))))
# --- platform identification ---
#
# This needs to precede the options section so that we can only offer some options on certain
# platforms.
platform = os.sys.platform
nix = False
linux = False
darwin = False
windows = False
freebsd = False
openbsd = False
solaris = False
if "darwin" == platform:
darwin = True
platform = "osx" # prettier than darwin
elif platform.startswith("linux"):
linux = True
platform = "linux"
elif "sunos5" == platform:
solaris = True
elif platform.startswith( "freebsd" ):
freebsd = True
elif platform.startswith( "openbsd" ):
openbsd = True
elif "win32" == platform:
windows = True
else:
print( "No special config for [" + platform + "] which probably means it won't work" )
nix = not windows
# --- options ----
use_clang = False
options = {}
def add_option( name, help, nargs, contributesToVariantDir,
dest=None, default = None, type="string", choices=None, metavar=None, const=None ):
if dest is None:
dest = name
if type == 'choice' and not metavar:
metavar = '[' + '|'.join(choices) + ']'
AddOption( "--" + name ,
dest=dest,
type=type,
nargs=nargs,
action="store",
choices=choices,
default=default,
metavar=metavar,
const=const,
help=help )
options[name] = { "help" : help ,
"nargs" : nargs ,
"contributesToVariantDir" : contributesToVariantDir ,
"dest" : dest,
"default": default }
def get_option( name ):
return GetOption( name )
def has_option( name ):
x = get_option( name )
if x is None:
return False
if x == False:
return False
if x == "":
return False
return True
def get_variant_dir():
build_dir = get_option('build-dir').rstrip('/')
if has_option('variant-dir'):
return (build_dir + '/' + get_option('variant-dir')).rstrip('/')
substitute = lambda x: re.sub( "[:,\\\\/]" , "_" , x )
a = []
for name in options:
o = options[name]
if not has_option( o["dest"] ):
continue
if not o["contributesToVariantDir"]:
continue
if get_option(o["dest"]) == o["default"]:
continue
if o["nargs"] == 0:
a.append( name )
else:
x = substitute( get_option( name ) )
a.append( name + "_" + x )
extras = []
if has_option("extra-variant-dirs"):
extras = [substitute(x) for x in get_option( 'extra-variant-dirs' ).split( ',' )]
if has_option("add-branch-to-variant-dir"):
extras += ["branch_" + substitute( buildscripts.utils.getGitBranch() )]
if has_option('cache'):
s = "cached"
s += "/".join(extras) + "/"
else:
s = "${PYSYSPLATFORM}/"
a += extras
if len(a) > 0:
a.sort()
s += "/".join( a ) + "/"
else:
s += "normal/"
return (build_dir + '/' + s).rstrip('/')
# build output
add_option( "mute" , "do not display commandlines for compiling and linking, to reduce screen noise", 0, False )
# installation/packaging
add_option( "prefix" , "installation prefix" , 1 , False, default='$BUILD_DIR/install' )
add_option( "extra-variant-dirs", "extra variant dir components, separated by commas", 1, False)
add_option( "add-branch-to-variant-dir", "add current git branch to the variant dir", 0, False )
add_option( "build-dir", "build output directory", 1, False, default='#build')
add_option( "variant-dir", "override variant subdirectory", 1, False )
add_option( "sharedclient", "build a libmongoclient.so/.dll" , 0 , False )
# linking options
add_option( "release" , "release build" , 0 , True )
add_option( "lto", "enable link time optimizations (experimental, except with MSVC)" , 0 , True )
add_option( "dynamic-windows", "dynamically link on Windows", 0, True)
add_option( "dynamic-boost", "dynamically link boost libraries on Windows", "?", True,
type="choice", choices=["on", "off", "auto"], default="auto", const="on" )
add_option( "disable-declspec-thread", "don't use __declspec(thread) on Windows", 0, True)
# base compile flags
add_option( "64" , "whether to force 64 bit" , 0 , True , "force64" )
add_option( "32" , "whether to force 32 bit" , 0 , True , "force32" )
add_option( "endian" , "endianness of target platform" , 1 , False , "endian",
type="choice", choices=["big", "little", "auto"], default="auto" )
add_option( "cxx", "compiler to use" , 1 , True )
add_option( "cc", "compiler to use for c" , 1 , True )
add_option( "cc-use-shell-environment", "use $CC from shell for C compiler" , 0 , False )
add_option( "cxx-use-shell-environment", "use $CXX from shell for C++ compiler" , 0 , False )
add_option( "c++11", "enable c++11 support (experimental)", "?", True,
type="choice", choices=["on", "off", "auto"], const="on", default="off" )
add_option( "cpppath", "Include path if you have headers in a nonstandard directory" , 1 , False )
add_option( "libpath", "Library path if you have libraries in a nonstandard directory" , 1 , False )
add_option( "extrapath", "comma separated list of add'l paths (--extrapath /opt/foo/,/foo) static linking" , 1 , False )
add_option( "extralib", "comma separated list of libraries (--extralib js_static,readline" , 1 , False )
add_option("runtime-library-search-path",
"comma separated list of dirs to append to PATH to find dynamic libs at runtime",
1, False)
add_option( "ssl" , "Enable SSL" , 0 , True )
# library choices
add_option( "libc++", "use libc++ (experimental, requires clang)", 0, True )
# new style debug and optimize flags
add_option( "dbg", "Enable runtime debugging checks", "?", True, "dbg",
type="choice", choices=["on", "off"], const="on" )
add_option( "opt", "Enable compile-time optimization", "?", True, "opt",
type="choice", choices=["on", "off"], const="on" )
add_option( "sanitize", "enable selected sanitizers", 1, True, metavar="san1,san2,...sanN" )
add_option( "llvm-symbolizer", "name of (or path to) the LLVM symbolizer", 1, False, default="llvm-symbolizer" )
add_option( "gcov" , "compile with flags for gcov" , 0 , True )
add_option("use-sasl-client", "Support SASL authentication in the client library", 0, False)
add_option('build-fast-and-loose', "NEVER for production builds", 0, False)
add_option( "boost-lib-search-suffixes",
"Comma delimited sequence of boost library suffixes to search",
1, False )
add_option('disable-warnings-as-errors', "Don't add -Werror to compiler command line", 0, False)
add_option('propagate-shell-environment',
"Pass shell environment to sub-processes (NEVER for production builds)",
0, False)
add_option('gtest-filter', "Pass argument as filter to gtest", 1, False)
add_option('mongo-orchestration-preset',
"Pass argument to mongo-orchestration as the configuration preset",
1, False, default='basic.json' )
add_option('mongo-orchestration-host',
"Host mongo-orchestration is running on",
1, False, default='localhost' )
add_option('mongo-orchestration-port',
"Host mongo-orchestration is running on",
1, False, default='8889' )
add_option('variables-help',
"Print the help text for SCons variables", 0, False)
if darwin:
add_option("osx-version-min", "minimum OS X version to support", 1, True)
elif windows:
win_version_min_choices = {
'xpsp3' : ('0501', '0300'),
'ws03sp2' : ('0502', '0200'),
'vista' : ('0600', '0000'),
'ws08r2' : ('0601', '0000'),
'win7' : ('0601', '0000'),
'win8' : ('0602', '0000'),
}
add_option("win-version-min", "minimum Windows version to support", 1, True,
type = 'choice', default = None,
choices = win_version_min_choices.keys())
# Someday get rid of --32 and --64 for windows and use these with a --msvc-target-arch flag
# that mirrors msvc-host-arch.
msvc_arch_choices = ['x86', 'i386', 'amd64', 'emt64', 'x86_64', 'ia64']
add_option("msvc-host-arch", "host architecture for ms toolchain", 1, True,
type="choice", choices=msvc_arch_choices)
add_option("msvc-script",
"msvc toolchain setup script, pass no argument to suppress script execution",
1, True)
add_option("msvc-version", "select msvc version", 1, True)
add_option('cache',
"Use an object cache rather than a per-build variant directory (experimental)",
0, False)
add_option('cache-dir',
"Specify the directory to use for caching objects if --cache is in use",
1, False, default="$BUILD_DIR/scons/cache")
variable_parse_mode_choices=['auto', 'posix', 'other']
add_option('variable-parse-mode',
"Select which parsing mode is used to interpret command line variables",
1, False,
type='choice', default=variable_parse_mode_choices[0],
choices=variable_parse_mode_choices)
# Setup the command-line variables
def variable_shlex_converter(val):
parse_mode = get_option('variable-parse-mode')
if parse_mode == 'auto':
parse_mode = 'other' if windows else 'posix'
return shlex.split(val, posix=(parse_mode == 'posix'))
env_vars = Variables()
env_vars.Add('ARFLAGS',
help='Sets flags for the archiver',
converter=variable_shlex_converter)
env_vars.Add('CCFLAGS',
help='Sets flags for the C and C++ compiler',
converter=variable_shlex_converter)
env_vars.Add('CFLAGS',
help='Sets flags for the C compiler',
converter=variable_shlex_converter)
env_vars.Add('CPPDEFINES',
help='Sets pre-processor definitions for C and C++',
converter=variable_shlex_converter)
env_vars.Add('CPPPATH',
help='Adds paths to the preprocessor search path',
converter=variable_shlex_converter)
env_vars.Add('CXXFLAGS',
help='Sets flags for the C++ compiler',
converter=variable_shlex_converter)
env_vars.Add('LIBPATH',
help='Adds paths to the linker search path',
converter=variable_shlex_converter)
env_vars.Add('LIBS',
help='Adds extra libraries to link against',
converter=variable_shlex_converter)
env_vars.Add('LINKFLAGS',
help='Sets flags for the linker',
converter=variable_shlex_converter)
env_vars.Add('RPATH',
help='Set the RPATH for dynamic libraries and executables',
converter=variable_shlex_converter)
env_vars.Add('SHCCFLAGS',
help='Sets flags for the C and C++ compiler when building shared libraries',
converter=variable_shlex_converter)
env_vars.Add('SHCFLAGS',
help='Sets flags for the C compiler when building shared libraries',
converter=variable_shlex_converter)
env_vars.Add('SHCXXFLAGS',
help='Sets flags for the C++ compiler when building shared libraries',
converter=variable_shlex_converter)
env_vars.Add('SHLINKFLAGS',
help='Sets flags for the linker when building shared libraries',
converter=variable_shlex_converter)
# don't run configure if user calls --help
if GetOption('help'):
Return()
# --- environment setup ---
# If the user isn't using the # to indicate top-of-tree or $ to expand a variable, forbid
# relative paths. Relative paths don't really work as expected, because they end up relative to
# the top level SConstruct, not the invokers CWD. We could in theory fix this with
# GetLaunchDir, but that seems a step too far.
buildDir = get_option('build-dir').rstrip('/')
if buildDir[0] not in ['$', '#']:
if not os.path.isabs(buildDir):
print("Do not use relative paths with --build-dir")
Exit(1)
cacheDir = get_option('cache-dir').rstrip('/')
if cacheDir[0] not in ['$', '#']:
if not os.path.isabs(cacheDir):
print("Do not use relative paths with --cache-dir")
Exit(1)
installDir = get_option('prefix').rstrip('/')
if installDir[0] not in ['$', '#']:
if not os.path.isabs(installDir):
print("Do not use relative paths with --prefix")
Exit(1)
sconsDataDir = Dir(buildDir).Dir('scons')
SConsignFile(str(sconsDataDir.File('sconsign')))
def printLocalInfo():
import sys, SCons
print( "scons version: " + SCons.__version__ )
print( "python version: " + " ".join( [ `i` for i in sys.version_info ] ) )
printLocalInfo()
boostLibs = [ "regex", "thread" , "system" ]
linux64 = False
force32 = has_option( "force32" )
force64 = has_option( "force64" )
if not force64 and not force32 and os.getcwd().endswith( "mongo-64" ):
force64 = True
print( "*** assuming you want a 64-bit build b/c of directory *** " )
msarch = None
if force32:
msarch = "x86"
elif force64:
msarch = "amd64"
releaseBuild = has_option("release")
# validate debug and optimization options
dbg_opt_mapping = {
# --dbg, --opt : dbg opt
( None, None ) : ( False, True ),
( None, "on" ) : ( False, True ),
( None, "off" ) : ( False, False ),
( "on", None ) : ( True, False ), # special case interaction
( "on", "on" ) : ( True, True ),
( "on", "off" ) : ( True, False ),
( "off", None ) : ( False, True ),
( "off", "on" ) : ( False, True ),
( "off", "off" ) : ( False, False ),
}
debugBuild, optBuild = dbg_opt_mapping[(get_option('dbg'), get_option('opt'))]
if releaseBuild and (debugBuild or not optBuild):
print("Error: A --release build may not have debugging, and must have optimization")
Exit(1)
mongoclientVersion = "1.1.2"
# We don't keep the -pre in the user testable version identifiers, because
# nobody should be conditioning on the pre-release status.
mongoclientVersionComponents = re.split(r'\.|-rc', mongoclientVersion.partition('-pre')[0])
if len(mongoclientVersionComponents) not in (3,4):
print("Error: client version most be of the form w.x.y[-rcz][-string]")
Exit(1)
# The Scons 'default' tool enables a lot of tools that we don't actually need to enable.
# On platforms like Solaris, it actually does the wrong thing by enabling the sunstudio
# toolchain first. As such it is simpler and more efficient to manually load the precise
# set of tools we need for each platform.
# If we aren't on a platform where we know the minimal set of tools, we fallback to loading
# the 'default' tool.
def decide_platform_tools():
if windows:
# we only support MS toolchain on windows
return ['msvc', 'mslink', 'mslib']
elif linux:
return ['gcc', 'g++', 'gnulink', 'ar']
elif solaris:
return ['gcc', 'g++', 'gnulink', 'ar']
elif darwin:
return ['gcc', 'g++', 'applelink', 'ar']
else:
return ["default"]
tools = decide_platform_tools() + ["unittest", "integration_test", "textfile"]
# We defer building the env until we have determined whether we want certain values. Some values
# in the env actually have semantics for 'None' that differ from being absent, so it is better
# to build it up via a dict, and then construct the Environment in one shot with kwargs.
envDict = dict(BUILD_DIR=buildDir,
VARIANT_DIR=get_variant_dir(),
EXTRAPATH=get_option("extrapath"),
PYTHON=File(buildscripts.utils.find_python()),
tools=tools,
PYSYSPLATFORM=os.sys.platform,
CONFIGUREDIR=sconsDataDir.Dir('sconf_temp'),
CONFIGURELOG=sconsDataDir.File('config.log'),
MONGOCLIENT_VERSION=mongoclientVersion,
MONGOCLIENT_VERSION_MAJOR=mongoclientVersionComponents[0],
MONGOCLIENT_VERSION_MINOR=mongoclientVersionComponents[1],
MONGOCLIENT_VERSION_PATCH=mongoclientVersionComponents[2],
INSTALL_DIR=installDir,
)
if windows:
if msarch:
envDict['TARGET_ARCH'] = msarch
# We can't set this to None without disturbing the autodetection,
# so only set it conditionally.
if has_option('msvc-host-arch'):
envDict['HOST_ARCH'] = get_option('msvc-host-arch')
msvc_version = get_option('msvc-version')
msvc_script = get_option('msvc-script')
if msvc_version:
if msvc_script:
print("Passing --msvc-version with --msvc-script is not meaningful")
Exit(1)
envDict['MSVC_VERSION'] = msvc_version
# The python None value is meaningful to MSVC_USE_SCRIPT; we want to interpret
# --msvc-script= with no argument as meaning 'None', so check explicitly against None so
# that '' is not interpreted as false.
if msvc_script is not None:
if has_option('msvc-host-arch'):
print("Passing --msvc-host-arch with --msvc-script is not meaningful")
Exit(1)
if msarch:
print("Passing --32 or --64 with --msvc-script is not meaningful")
Exit(1)
if msvc_script == "":
msvc_script = None
envDict['MSVC_USE_SCRIPT'] = msvc_script
env = Environment(variables=env_vars, **envDict)
del envDict
def fatal_error(env, msg, *args):
print msg.format(*args)
Exit(1)
def conf_error(env, msg, *args):
print msg.format(*args)
print "See {0} for details".format(env['CONFIGURELOG'].abspath)
Exit(1)
env.AddMethod(fatal_error, 'FatalError')
env.AddMethod(conf_error, 'ConfError')
if has_option('variables-help'):
print env_vars.GenerateHelpText(env)
Exit(0)
unknown_vars = env_vars.UnknownVariables()
if unknown_vars:
env.FatalError("Unknown variables specified: {0}", ", ".join(unknown_vars.keys()))
# Add any scons options that conflict with scons variables here.
# The first item in each tuple is the option name and the second
# is the variable name
variable_conflicts = [
('libpath', 'LIBPATH'),
('cpppath', 'CPPPATH'),
('extrapath', 'CPPPATH'),
('extrapath', 'LIBPATH'),
('extralib', 'LIBS')
]
for (opt_name, var_name) in variable_conflicts:
if has_option(opt_name) and var_name in env:
env.FatalError("Both option \"--{0}\" and variable {1} were specified", opt_name, var_name)
if has_option("cache"):
EnsureSConsVersion( 2, 3, 0 )
if has_option("release"):
env.FatalError(
"Using the experimental --cache option is not permitted for --release builds")
if has_option("gcov"):
env.FatalError("Mixing --cache and --gcov doesn't work correctly yet. See SERVER-11084")
env.CacheDir(str(env.Dir(cacheDir)))
if has_option("propagate-shell-environment"):
env['ENV'] = dict(os.environ);
if has_option('runtime-library-search-path'):
libs = get_option('runtime-library-search-path').split(',')
envVar = None
if windows:
envVar = 'PATH'
elif darwin:
envVar = 'DYLD_LIBRARY_PATH'
else:
envVar = 'LD_LIBRARY_PATH'
for lib in libs:
env.AppendENVPath(envVar, env.Dir(lib), delete_existing=0)
# Ignore fast-and-loose option if the scons cache is enabled (see SERVER-19088)
if has_option('build-fast-and-loose') and not has_option('cache'):
# See http://www.scons.org/wiki/GoFastButton for details
env.Decider('MD5-timestamp')
env.SetOption('max_drift', 1)
env.SourceCode('.', None)
if has_option('mute'):
env.Append( CCCOMSTR = "Compiling $TARGET" )
env.Append( CXXCOMSTR = env["CCCOMSTR"] )
env.Append( SHCCCOMSTR = "Compiling $TARGET" )
env.Append( SHCXXCOMSTR = env["SHCCCOMSTR"] )
env.Append( LINKCOMSTR = "Linking $TARGET" )
env.Append( SHLINKCOMSTR = env["LINKCOMSTR"] )
env.Append( ARCOMSTR = "Generating library $TARGET" )
endian = get_option( "endian" )
if endian == "auto":
endian = sys.byteorder
if endian == "little":
env["MONGO_BYTE_ORDER"] = "1234"
elif endian == "big":
env["MONGO_BYTE_ORDER"] = "4321"
if env['PYSYSPLATFORM'] == 'linux3':
env['PYSYSPLATFORM'] = 'linux2'
if 'freebsd' in env['PYSYSPLATFORM']:
env['PYSYSPLATFORM'] = 'freebsd'
if os.sys.platform == 'win32':
env['OS_FAMILY'] = 'win'
else:
env['OS_FAMILY'] = 'posix'
if has_option( "cc-use-shell-environment" ) and has_option( "cc" ):
env.FatalError("Cannot specify both --cc-use-shell-environment and --cc")
elif has_option( "cxx-use-shell-environment" ) and has_option( "cxx" ):
env.FatalError("Cannot specify both --cxx-use-shell-environment and --cxx")
if has_option( "gtest-filter" ):
env["gtest_filter"] = get_option('gtest-filter')
if has_option( "cxx-use-shell-environment" ):
env["CXX"] = os.getenv("CXX");
env["CC"] = env["CXX"]
if has_option( "cc-use-shell-environment" ):
env["CC"] = os.getenv("CC");
if has_option( "cxx" ):
if not has_option( "cc" ):
env.FatalError("Must specify C compiler when specifying C++ compiler")
env["CXX"] = get_option( "cxx" )
if has_option( "cc" ):
if not has_option( "cxx" ):
env.FatalError("Must specify C++ compiler when specifying C compiler")
env["CC"] = get_option( "cc" )
if has_option( "libpath" ):
env["LIBPATH"] = [get_option( "libpath" )]
if has_option( "cpppath" ):
env["CPPPATH"] = [get_option( "cpppath" )]
env.Prepend(
CPPDEFINES=[
"MONGO_EXPOSE_MACROS" ,
],
CPPPATH=[
'$VARIANT_DIR',
'$VARIANT_DIR/mongo'
]
)
extraLibPlaces = []
env['EXTRACPPPATH'] = []
env['EXTRALIBPATH'] = []
def addExtraLibs( s ):
for x in s.split(","):
env.Append( EXTRACPPPATH=[ x + "/include" ] )
env.Append( EXTRALIBPATH=[ x + "/lib" ] )
extraLibPlaces.append( x + "/lib" )
if has_option( "extrapath" ):
addExtraLibs( GetOption( "extrapath" ) )
if has_option( "extralib" ):
for x in GetOption( "extralib" ).split( "," ):
env.Append( LIBS=[ x ] )
# ---- other build setup -----
if "uname" in dir(os):
processor = os.uname()[4]
else:
processor = "i386"
if force32:
processor = "i386"
if force64:
processor = "x86_64"
env['PROCESSOR_ARCHITECTURE'] = processor
nixLibPrefix = "lib"
if darwin:
pass
elif linux:
env.Append( LIBS=['m'] )
if os.uname()[4] == "x86_64" and not force32:
linux64 = True
nixLibPrefix = "lib64"
env.Append( EXTRALIBPATH=["/usr/lib64" , "/lib64" ] )
env.Append( LIBS=["pthread"] )
force64 = False
if force32:
env.Append( EXTRALIBPATH=["/usr/lib32"] )
elif solaris:
env.Append( CPPDEFINES=[ "__sunos__" ] )
env.Append( LIBS=["socket","resolv"] )
elif freebsd:
env.Append( LIBS=[ "kvm" ] )
env.Append( EXTRACPPPATH=[ "/usr/local/include" ] )
env.Append( EXTRALIBPATH=[ "/usr/local/lib" ] )
env.Append( CPPDEFINES=[ "__freebsd__" ] )
env.Append( CCFLAGS=[ "-fno-omit-frame-pointer" ] )
elif openbsd:
env.Append( EXTRACPPPATH=[ "/usr/local/include" ] )
env.Append( EXTRALIBPATH=[ "/usr/local/lib" ] )
env.Append( CPPDEFINES=[ "__openbsd__" ] )
elif windows:
dynamicCRT = has_option("dynamic-windows")
# Unless otherwise specified, link boost in the same manner as the CRT.
dynamicBoost = get_option("dynamic-boost")
if dynamicBoost == "auto":
dynamicBoost = "on" if dynamicCRT else "off"
if dynamicBoost == "on":
env.Append( CPPDEFINES=[ "BOOST_ALL_DYN_LINK" ] )
if has_option("sharedclient") and not dynamicCRT:
env.FatalError("The shared client must be built with the dynamic runtime library")
# If tools configuration fails to set up 'cl' in the path, fall back to importing the whole
# shell environment and hope for the best. This will work, for instance, if you have loaded
# an SDK shell.
for pathdir in env['ENV']['PATH'].split(os.pathsep):
if os.path.exists(os.path.join(pathdir, 'cl.exe')):
break
else:
print("NOTE: Tool configuration did not find 'cl' compiler, falling back to os environment")
env['ENV'] = dict(os.environ)
env.Append( CPPDEFINES=[ "_UNICODE" ] )
env.Append( CPPDEFINES=[ "UNICODE" ] )
env.Append( CPPDEFINES=[ "NOMINMAX" ] )
# /EHsc exception handling style for visual studio
# /W3 warning level
env.Append(CCFLAGS=["/EHsc","/W3"])
# some warnings we don't like:
env.Append(CCFLAGS=[
# 'conversion' conversion from 'type1' to 'type2', possible loss of data
# An integer type is converted to a smaller integer type.
"/wd4244",
# 'identifier' : class 'type' needs to have dll-interface to be used by clients of class 'type2'
# Typically some STL type isn't dllexport adorned, and we can't do anything about that
"/wd4251",
# 'var' : conversion from 'size_t' to 'type', possible loss of data When compiling with
# /Wp64, or when compiling on a 64-bit operating system, type is 32 bits but size_t is
# 64 bits when compiling for 64-bit targets. To fix this warning, use size_t instead of
# a type
"/wd4267",
# non - DLL-interface classkey 'identifier' used as base for DLL-interface classkey 'identifier'
# Typically some base like noncopyable isn't dllexport adorned; nothing we can do
"/wd4275",
# C++ exception specification ignored except to indicate a function is not
# __declspec(nothrow A function is declared using exception specification, which Visual
# C++ accepts but does not implement
"/wd4290",
# 'this' : used in base member initializer list
# The this pointer is valid only within nonstatic member functions. It cannot be
# used in the initializer list for a base class.
"/wd4355",
# 'type' : forcing value to bool 'true' or 'false' (performance warning)
# This warning is generated when a value that is not bool is assigned or coerced
# into type bool.
"/wd4800",
# unknown pragma -- added so that we can specify unknown pragmas for other compilers
"/wd4068",
# On extremely old versions of MSVC (pre 2k5), default constructing an array member in a
# constructor's initialization list would not zero the array members "in some cases".
# since we don't target MSVC versions that old, this warning is safe to ignore.
"/wd4351",
])
if not has_option("disable-warnings-as-errors"):
env.Append(
CCFLAGS=["/WX"],
LINKFLAGS=["/WX"],
)
env.Append( CPPDEFINES=[
"_CONSOLE",
"_CRT_NONSTDC_NO_WARNINGS",
"_CRT_SECURE_NO_WARNINGS",
"_CRT_SECURE_NO_DEPRECATE",
"_SCL_SECURE_NO_WARNINGS",
"_SCL_SECURE_NO_DEPRECATE",
] )
# this would be for pre-compiled headers, could play with it later
#env.Append( CCFLAGS=['/Yu"pch.h"'] )
# docs say don't use /FD from command line (minimal rebuild)
# /Gy function level linking (implicit when using /Z7)
# /Z7 debug info goes into each individual .obj file -- no .pdb created
env.Append( CCFLAGS= ["/Z7", "/errorReport:none"] )
# /DEBUG will tell the linker to create a .pdb file
# which WinDbg and Visual Studio will use to resolve
# symbols if you want to debug a release-mode image.
# Note that this means we can't do parallel links in the build.
#
# Please also note that this has nothing to do with _DEBUG or optimization.
env.Append( LINKFLAGS=["/DEBUG"] )
# /MD: use the multithreaded, DLL version of the run-time library (MSVCRT.lib/MSVCR###.DLL)
# /MT: use the multithreaded, static version of the run-time library (LIBCMT.lib)
# /MDd: Defines _DEBUG, _MT, _DLL, and uses MSVCRTD.lib/MSVCRD###.DLL
# /MTd: Defines _DEBUG, _MT, and causes your application to use the
# debug multithread version of the run-time library (LIBCMTD.lib)
winRuntimeLibMap = {
#dyn #dbg
( False, False ) : "/MT",
( False, True ) : "/MTd",
( True, False ) : "/MD",
( True, True ) : "/MDd",
}
env.Append(CCFLAGS=[winRuntimeLibMap[(dynamicCRT, debugBuild)]])
# With VS 2012 and later we need to specify 5.01 as the target console
# so that our 32-bit builds run on Windows XP
# See https://software.intel.com/en-us/articles/linking-applications-using-visual-studio-2012-to-run-on-windows-xp
#
if msarch == "x86":
env.Append( LINKFLAGS=["/SUBSYSTEM:CONSOLE,5.01"])
if optBuild:
# /O2: optimize for speed (as opposed to size)
# /Oy-: disable frame pointer optimization (overrides /O2, only affects 32-bit)
# /INCREMENTAL: NO - disable incremental link - avoid the level of indirection for function
# calls
env.Append( CCFLAGS=["/O2", "/Oy-"] )
env.Append( LINKFLAGS=["/INCREMENTAL:NO"])
else:
env.Append( CCFLAGS=["/Od"] )
if debugBuild and not optBuild:
# /RTC1: - Enable Stack Frame Run-Time Error Checking; Reports when a variable is used
# without having been initialized (implies /Od: no optimizations)
env.Append( CCFLAGS=["/RTC1"] )
env.Append(LIBS=[ 'ws2_32.lib', 'DbgHelp.lib' ])
if nix:
# -Winvalid-pch Warn if a precompiled header (see Precompiled Headers) is found in the search path but can't be used.
env.Append( CCFLAGS=["-fPIC",
"-ggdb",
"-pthread",
"-Wall",
"-Wsign-compare",
"-Wno-unknown-pragmas",
"-Winvalid-pch"] )
# env.Append( " -Wconversion" ) TODO: this doesn't really work yet
if linux or darwin:
env.Append( CCFLAGS=["-pipe"] )
if not has_option("disable-warnings-as-errors"):
env.Append( CCFLAGS=["-Werror"] )
env.Append( CPPDEFINES=["_FILE_OFFSET_BITS=64"] )
env.Append( CXXFLAGS=["-Wnon-virtual-dtor", "-Woverloaded-virtual"] )
env.Append( LINKFLAGS=["-fPIC"] )
# SERVER-9761: Ensure early detection of missing symbols in dependent libraries at program
# startup.
#
# TODO: Is it necessary to add to both linkflags and shlinkflags, or are LINKFLAGS
# propagated to SHLINKFLAGS?
if darwin:
env.Append( LINKFLAGS=["-Wl,-bind_at_load"] )
env.Append( SHLINKFLAGS=["-Wl,-bind_at_load"] )
else:
env.Append( LINKFLAGS=["-Wl,-z,now"] )
env.Append( SHLINKFLAGS=["-Wl,-z,now"] )
if not darwin:
env.Append( LINKFLAGS=["-rdynamic"] )
env.Append( LIBS=[] )
# Allow colorized output
env['ENV']['TERM'] = os.environ.get('TERM', None)
if linux and has_option( "gcov" ):
env.Append( CXXFLAGS=" -fprofile-arcs -ftest-coverage " )
env.Append( LINKFLAGS=" -fprofile-arcs -ftest-coverage " )
if optBuild:
env.Append( CCFLAGS=["-O3"] )
else:
env.Append( CCFLAGS=["-O0"] )
if debugBuild:
if not optBuild:
env.Append( CCFLAGS=["-fstack-protector"] )
env.Append( LINKFLAGS=["-fstack-protector"] )
env.Append( SHLINKFLAGS=["-fstack-protector"] )
if force64:
env.Append( CCFLAGS="-m64" )
env.Append( LINKFLAGS="-m64" )
if force32:
env.Append( CCFLAGS="-m32" )
env.Append( LINKFLAGS="-m32" )
if debugBuild:
env.Append( CPPDEFINES=["MONGO_DEBUG_BUILD"] );
try:
umask = os.umask(022)
except OSError:
pass
env.Prepend(CPPPATH=['$VARIANT_DIR/third_party/gtest-1.7.0/include'])
boostSuffixList = ["-mt", ""]
if get_option("boost-lib-search-suffixes") is not None:
boostSuffixList = get_option("boost-lib-search-suffixes")
if boostSuffixList == "":
boostSuffixList = []
else:
boostSuffixList = boostSuffixList.split(',')
env.Append( CPPPATH=['$EXTRACPPPATH'],
LIBPATH=['$EXTRALIBPATH'] )
# --- check system ---
def doConfigure(myenv):
# Check that the compilers work.
#
# TODO: Currently, we have some flags already injected. Eventually, this should test the
# bare compilers, and we should re-check at the very end that TryCompile and TryLink still
# work with the flags we have selected.
conf = Configure(myenv, help=False)
if 'CheckCXX' in dir( conf ):
if not conf.CheckCXX():
conf.env.FatalError("C++ compiler {0} does not work", conf.env["CXX"])
# Only do C checks if CC != CXX
check_c = (myenv["CC"] != myenv["CXX"])
if check_c and 'CheckCC' in dir( conf ):
if not conf.CheckCC():
conf.env.FatalError("C compiler {0} does not work", conf.env["CC"])
myenv = conf.Finish()
# Identify the toolchain in use. We currently support the following:
# TODO: Goes in the env?
toolchain_gcc = "GCC"
toolchain_clang = "clang"
toolchain_msvc = "MSVC"
def CheckForToolchain(context, toolchain, lang_name, compiler_var, source_suffix):
test_bodies = {
toolchain_gcc : (
# Clang also defines __GNUC__
"""
#if !defined(__GNUC__) || defined(__clang__)
#error
#endif
"""),
toolchain_clang : (
"""
#if !defined(__clang__)
#error
#endif
"""),
toolchain_msvc : (
"""
#if !defined(_MSC_VER)
#error
#endif
"""),
}
print_tuple = (lang_name, context.env[compiler_var], toolchain)
context.Message('Checking if %s compiler "%s" is %s... ' % print_tuple)
# Strip indentation from the test body to ensure that the newline at the end of the
# endif is the last character in the file (rather than a line of spaces with no
# newline), and that all of the preprocessor directives start at column zero. Both of
# these issues can trip up older toolchains.
test_body = textwrap.dedent(test_bodies[toolchain])
result = context.TryCompile(test_body, source_suffix)
context.Result(result)
return result
conf = Configure(myenv, help=False, custom_tests = {
'CheckForToolchain' : CheckForToolchain,
})
toolchain = None
have_toolchain = lambda: toolchain != None
using_msvc = lambda: toolchain == toolchain_msvc
using_gcc = lambda: toolchain == toolchain_gcc
using_clang = lambda: toolchain == toolchain_clang
if windows:
toolchain_search_sequence = [toolchain_msvc]
else:
toolchain_search_sequence = [toolchain_gcc, toolchain_clang]
for candidate_toolchain in toolchain_search_sequence:
if conf.CheckForToolchain(candidate_toolchain, "C++", "CXX", ".cpp"):
toolchain = candidate_toolchain
break
if not have_toolchain():
conf.env.FatalError("Couldn't identify the toolchain")
if check_c and not conf.CheckForToolchain(toolchain, "C", "CC", ".c"):
conf.env.FatalError("C toolchain doesn't match identified C++ toolchain")
myenv = conf.Finish()
global use_clang
use_clang = using_clang()
if using_gcc():
myenv.Append(LINKFLAGS=["-pthread"])
# Figure out what our minimum windows version is. If the user has specified, then use
# that. Otherwise, if they have explicitly selected between 32 bit or 64 bit, choose XP or
# Vista respectively. Finally, if they haven't done either of these, try invoking the
# compiler to figure out whether we are doing a 32 or 64 bit build and select as
# appropriate.
if windows:
win_version_min = None
default_32_bit_min = 'xpsp3'
default_64_bit_min = 'ws03sp2'
if has_option('win-version-min'):
win_version_min = get_option('win-version-min')
else:
if force32:
win_version_min = default_32_bit_min
elif force64:
win_version_min = default_64_bit_min
else:
def CheckFor64Bit(context):
win64_test_body = textwrap.dedent(
"""
#if !defined(_WIN64)
#error
#endif
"""
)
context.Message('Checking if toolchain is in 64-bit mode... ')
result = context.TryCompile(win64_test_body, ".c")
context.Result(result)
return result
conf = Configure(myenv, help=False, custom_tests = {
'CheckFor64Bit' : CheckFor64Bit
})
if conf.CheckFor64Bit():
win_version_min = default_64_bit_min
else:
win_version_min = default_32_bit_min
conf.Finish();
env['WIN_VERSION_MIN'] = win_version_min
win_version_min = win_version_min_choices[win_version_min]
env.Append( CPPDEFINES=[("_WIN32_WINNT", "0x" + win_version_min[0])] )
env.Append( CPPDEFINES=[("NTDDI_VERSION", "0x" + win_version_min[0] + win_version_min[1])] )
def AddFlagIfSupported(env, tool, extension, flag, **mutation):
def CheckFlagTest(context, tool, extension, flag):
test_body = ""
context.Message('Checking if %s compiler supports %s... ' % (tool, flag))
ret = context.TryCompile(test_body, extension)
context.Result(ret)
return ret
if using_msvc():
env.FatalError("AddFlagIfSupported is not currently supported with MSVC")
test_mutation = mutation
if using_gcc():
test_mutation = copy.deepcopy(mutation)
# GCC helpfully doesn't issue a diagnostic on unknown flags of the form -Wno-xxx
# unless other diagnostics are triggered. That makes it tough to check for support
# for -Wno-xxx. To work around, if we see that we are testing for a flag of the
# form -Wno-xxx (but not -Wno-error=xxx), we also add -Wxxx to the flags. GCC does
# warn on unknown -Wxxx style flags, so this lets us probe for availablity of
# -Wno-xxx.
for kw in test_mutation.keys():
test_flags = test_mutation[kw]
for test_flag in test_flags:
if test_flag.startswith("-Wno-") and not test_flag.startswith("-Wno-error="):
test_flags.append(re.sub("^-Wno-", "-W", test_flag))
cloned = env.Clone()
cloned.Append(**test_mutation)
# For GCC, we don't need anything since bad flags are already errors, but
# adding -Werror won't hurt. For clang, bad flags are only warnings, so we need -Werror
# to make them real errors.
cloned.Append(CCFLAGS=['-Werror'])
conf = Configure(cloned, help=False, custom_tests = {
'CheckFlag' : lambda(ctx) : CheckFlagTest(ctx, tool, extension, flag)
})
available = conf.CheckFlag()
conf.Finish()
if available:
env.Append(**mutation)
return available
def AddToCFLAGSIfSupported(env, flag):
return AddFlagIfSupported(env, 'C', '.c', flag, CFLAGS=[flag])
def AddToCCFLAGSIfSupported(env, flag):
return AddFlagIfSupported(env, 'C', '.c', flag, CCFLAGS=[flag])
def AddToCXXFLAGSIfSupported(env, flag):
return AddFlagIfSupported(env, 'C++', '.cpp', flag, CXXFLAGS=[flag])
if using_gcc() or using_clang():
# This warning was added in g++-4.8.
AddToCCFLAGSIfSupported(myenv, '-Wno-unused-local-typedefs')
# Clang likes to warn about unused functions, which seems a tad aggressive and breaks
# -Werror, which we want to be able to use.
AddToCCFLAGSIfSupported(myenv, '-Wno-unused-function')
# TODO: Note that the following two flags are added to CCFLAGS even though they are
# really C++ specific. We need to do this because SCons passes CXXFLAGS *before*
# CCFLAGS, but CCFLAGS contains -Wall, which re-enables the warnings we are trying to
# suppress. In the future, we should move all warning flags to CCWARNFLAGS and
# CXXWARNFLAGS and add these to CCOM and CXXCOM as appropriate.
#
# Clang likes to warn about unused private fields, but some of our third_party
# libraries have such things.
AddToCCFLAGSIfSupported(myenv, '-Wno-unused-private-field')
# Prevents warning about using deprecated features (such as auto_ptr in c++11)
# Using -Wno-error=deprecated-declarations does not seem to work on some compilers,
# including at least g++-4.6.
AddToCCFLAGSIfSupported(myenv, "-Wno-deprecated-declarations")
# As of clang-3.4, this warning appears in v8, and gets escalated to an error.
AddToCCFLAGSIfSupported(myenv, "-Wno-tautological-constant-out-of-range-compare")
# New in clang-3.4, trips up things mostly in third_party, but in a few places in the
# primary mongo sources as well.
AddToCCFLAGSIfSupported(myenv, "-Wno-unused-const-variable")
# This has been suppressed in gcc 4.8, due to false positives, but not in clang. So
# we explicitly disable it here.
AddToCCFLAGSIfSupported(myenv, "-Wno-missing-braces")
# Check if we need to disable null-conversion warnings
if using_clang():
def CheckNullConversion(context):
test_body = """
#include
struct TestType { int value; bool boolValue; };
bool foo() {
boost::shared_ptr sp(new TestType);
return NULL != sp;
}
"""
context.Message('Checking if implicit boost::shared_ptr null conversion is supported... ')
ret = context.TryCompile(textwrap.dedent(test_body), ".cpp")
context.Result(ret)
return ret
conf = Configure(myenv, help=False, custom_tests = {
'CheckNullConversion' : CheckNullConversion,
})
if conf.CheckNullConversion() == False:
env.Append( CCFLAGS="-Wno-null-conversion" )
conf.Finish()
# This needs to happen before we check for libc++, since it affects whether libc++ is available.
if darwin and has_option('osx-version-min'):
min_version = get_option('osx-version-min')
min_version_flag = '-mmacosx-version-min=%s' % (min_version)
if not AddToCCFLAGSIfSupported(myenv, min_version_flag):
myenv.ConfError("Can't set minimum OS X version with this compiler")
myenv.AppendUnique(LINKFLAGS=[min_version_flag])
usingLibStdCxx = False
if has_option('libc++'):
if not using_clang():
myenv.ConfError('libc++ is currently only supported for clang')
if darwin and has_option('osx-version-min') and versiontuple(min_version) < versiontuple('10.7'):
print("Warning: You passed option 'libc++'. You probably want to also pass 'osx-version-min=10.7' or higher for libc++ support.")
if AddToCXXFLAGSIfSupported(myenv, '-stdlib=libc++'):
myenv.Append(LINKFLAGS=['-stdlib=libc++'])
else:
myenv.ConfError('libc++ requested, but compiler does not support -stdlib=libc++' )
else:
def CheckLibStdCxx(context):
test_body = """
#include
#if !defined(__GLIBCXX__)
#error
#endif
"""
context.Message('Checking if we are using libstdc++... ')
ret = context.TryCompile(textwrap.dedent(test_body), ".cpp")
context.Result(ret)
return ret
conf = Configure(myenv, help=False, custom_tests = {
'CheckLibStdCxx' : CheckLibStdCxx,
})
usingLibStdCxx = conf.CheckLibStdCxx()
conf.Finish()
# Check to see if we are trying to use an elderly libstdc++, which we arbitrarily define as
# 4.6.0. This is primarly to help people using clang in C++11 mode on OS X but forgetting
# to use --libc++. We also use it to decide if we trust the libstdc++ debug mode. We would,
# ideally, check the __GLIBCXX__ version, but for various reasons this is not
# workable. Instead, we switch on the fact that _GLIBCXX_BEGIN_NAMESPACE_VERSION wasn't
# introduced until libstdc++ 4.6.0.
haveGoodLibStdCxx = False
if usingLibStdCxx:
def CheckModernLibStdCxx(context):
test_body = """
#include
#if !defined(_GLIBCXX_BEGIN_NAMESPACE_VERSION)
#error libstdcxx older than 4.6.0
#endif
"""
context.Message('Checking for libstdc++ 4.6.0 or better... ')
ret = context.TryCompile(textwrap.dedent(test_body), ".cpp")
context.Result(ret)
return ret
conf = Configure(myenv, help=False, custom_tests = {
'CheckModernLibStdCxx' : CheckModernLibStdCxx,
})
haveGoodLibStdCxx = conf.CheckModernLibStdCxx()
conf.Finish()
# Sort out whether we can and should use C++11:
cxx11_mode = get_option("c++11")
if using_msvc():
if cxx11_mode == "off":
print( 'WARNING: Cannot disable C++11 features when using MSVC' )
else:
# If we are using libstdc++, only allow C++11 mode with our line-in-the-sand good
# libstdc++. As always, if in auto mode fall back to disabling if we don't have a good
# libstdc++, otherwise fail the build because we can't honor the explicit request.
if cxx11_mode != "off" and usingLibStdCxx:
if not haveGoodLibStdCxx:
if cxx11_mode == "auto":
cxx11_mode = "off"
else:
cxx11_error = 'Detected libstdc++ is too old to support C++11 mode'
if darwin:
cxx11_error += \
'\nTry building with --libc++ and --osx-version-min=10.7 or higher'
myenv.ConfError(cxx11_error)
# We are going to be adding flags to the environment, but we don't want to persist
# those changes unless we pass all the below checks. Make a copy of the environment
# that we will modify, we will only "commit" the changes to the env if we pass all the
# checks.
cxx11Env = myenv.Clone()
# For our other compilers (gcc and clang) we need to pass -std=c++0x or -std=c++11,
# but we prefer the latter. Try that first, and fall back to c++0x if we don't
# detect that --std=c++11 works. If we can't find a flag and C++11 was explicitly
# requested, error out, otherwise turn off C++11 support in auto mode.
if cxx11_mode != "off":
if not AddToCXXFLAGSIfSupported(cxx11Env, '-std=c++11'):
if not AddToCXXFLAGSIfSupported(cxx11Env, '-std=c++0x'):
if cxx11_mode == "auto":
cxx11_mode = "off"
else:
cxx11Env.ConfError(
'C++11 mode requested, but cannot find a flag to enable it')
# We appear to have C++11, or at least a flag to enable it, which is now set in the
# environment. If we are in auto mode, check if the compiler claims that it strictly
# supports C++11, and disable C++11 if not. If the user has explicitly requested C++11,
# we don't care about what the compiler claims to support, trust the user.
if cxx11_mode == "auto":
def CheckCxx11Official(context):
test_body = """
#if __cplusplus < 201103L
#error
#endif
const int not_an_empty_file = 0;
"""
context.Message('Checking if __cplusplus >= 201103L to auto-enable C++11... ')
ret = context.TryCompile(textwrap.dedent(test_body), ".cpp")
context.Result(ret)
return ret
conf = Configure(cxx11Env, help=False, custom_tests = {
'CheckCxx11Official' : CheckCxx11Official,
})
if cxx11_mode == "auto" and not conf.CheckCxx11Official():
cxx11_mode = "off"
conf.Finish()
# We require c99 mode for C files when C++11 is enabled, so perform the same dance
# as above: if C++11 mode is not off, try the flag, if we are in auto mode and we fail
# then turn off C++11, otherwise C++11 was explicitly requested and we should error out.
if cxx11_mode != "off":
if not AddToCFLAGSIfSupported(cxx11Env, '-std=c99'):
if cxx11_mode == "auto":
cxx11_mode = "off"
else:
cxx11Env.ConfError(
"C++11 mode selected for C++ files, but can't enable C99 for C files")
# If we got here and cxx11_mode hasn't become false, then its true, so swap in the
# modified environment.
if cxx11_mode != "off":
cxx11_mode = "on"
myenv = cxx11Env
# Check if we are on a POSIX system by testing if _POSIX_VERSION is defined.
def CheckPosixSystem(context):
test_body = """
// POSIX requires the existence of unistd.h, so if we can't include unistd.h, we
// are definitely not a POSIX system.
#include
#if !defined(_POSIX_VERSION)
#error not a POSIX system
#endif
"""
context.Message('Checking if we are on a POSIX system... ')
ret = context.TryCompile(textwrap.dedent(test_body), ".c")
context.Result(ret)
return ret
conf = Configure(myenv, help=False, custom_tests = {
'CheckPosixSystem' : CheckPosixSystem,
})
posix_system = conf.CheckPosixSystem()
conf.Finish()
# Check if we are on a system that support the POSIX clock_gettime function
# and the "monotonic" clock.
posix_monotonic_clock = False
if posix_system:
def CheckPosixMonotonicClock(context):
test_body = """
#include
#if !(defined(_POSIX_TIMERS) && _POSIX_TIMERS > 0)
#error POSIX clock_gettime not supported
#elif !(defined(_POSIX_MONOTONIC_CLOCK) && _POSIX_MONOTONIC_CLOCK >= 0)
#error POSIX monotonic clock not supported
#endif
"""
context.Message('Checking if the POSIX monotonic clock is supported... ')
ret = context.TryCompile(textwrap.dedent(test_body), ".c")
context.Result(ret)
return ret
conf = Configure(myenv, help=False, custom_tests = {
'CheckPosixMonotonicClock' : CheckPosixMonotonicClock,
})
posix_monotonic_clock = conf.CheckPosixMonotonicClock()
conf.Finish()
if has_option('sanitize'):
if not (using_clang() or using_gcc()):
myenv.FatalError('sanitize is only supported with clang or gcc')
sanitizer_list = get_option('sanitize').split(',')
using_lsan = 'leak' in sanitizer_list
using_asan = 'address' in sanitizer_list or using_lsan
# If the user asked for leak sanitizer turn on the detect_leaks
# ASAN_OPTION. If they asked for address sanitizer as well, drop
# 'leak', because -fsanitize=leak means no address.
#
# --sanitize=leak: -fsanitize=leak, detect_leaks=1
# --sanitize=address,leak: -fsanitize=address, detect_leaks=1
# --sanitize=address: -fsanitize=address
#
if using_lsan:
if using_asan:
myenv['ENV']['ASAN_OPTIONS'] = "detect_leaks=1"
myenv['ENV']['LSAN_OPTIONS'] = "suppressions=%s" % myenv.File("#etc/lsan.suppressions").abspath
if 'address' in sanitizer_list:
sanitizer_list.remove('leak')
sanitizer_option = '-fsanitize=' + ','.join(sanitizer_list)
if AddToCCFLAGSIfSupported(myenv, sanitizer_option):
myenv.Append(LINKFLAGS=[sanitizer_option])
myenv.Append(CCFLAGS=['-fno-omit-frame-pointer'])
else:
myenv.ConfError('Failed to enable sanitizers with flag: {0}', sanitizer_option )
blackfiles_map = {
"address" : myenv.File("#etc/asan.blacklist"),
"leak" : myenv.File("#etc/asan.blacklist"),
"thread" : myenv.File("#etc/tsan.blacklist"),
"undefined" : myenv.File("#etc/ubsan.blacklist"),
}
blackfiles = set([v for (k, v) in blackfiles_map.iteritems() if k in sanitizer_list])
blacklist_options=["-fsanitize-blacklist=%s" % blackfile for blackfile in blackfiles]
for blacklist_option in blacklist_options:
if AddToCCFLAGSIfSupported(myenv, blacklist_option):
myenv.Append(LINKFLAGS=[blacklist_option])
llvm_symbolizer = get_option('llvm-symbolizer')
if os.path.isabs(llvm_symbolizer):
if not myenv.File(llvm_symbolizer).exists():
print("WARNING: Specified symbolizer '%s' not found" % llvm_symbolizer)
llvm_symbolizer = None
else:
llvm_symbolizer = myenv.WhereIs(llvm_symbolizer)
if llvm_symbolizer:
myenv['ENV']['ASAN_SYMBOLIZER_PATH'] = llvm_symbolizer
myenv['ENV']['LSAN_SYMBOLIZER_PATH'] = llvm_symbolizer
elif using_lsan:
myenv.ConfError("Using the leak sanitizer requires a valid symbolizer")
# When using msvc, check for VS 2013 Update 2+ so we can use new compiler flags
if using_msvc():
haveVS2013Update2OrLater = False
def CheckVS2013Update2(context):
test_body = """
#if _MSC_VER < 1800 || (_MSC_VER == 1800 && _MSC_FULL_VER < 180030501)
#error Old Version
#endif
int main(int argc, char* argv[]) {
return 0;
}
"""
context.Message('Checking for VS 2013 Update 2 or Later... ')
ret = context.TryCompile(textwrap.dedent(test_body), ".cpp")
context.Result(ret)
return ret
conf = Configure(myenv, help=False, custom_tests = {
'CheckVS2013Update2' : CheckVS2013Update2,
})
haveVS2013Update2OrLater = conf.CheckVS2013Update2()
conf.Finish()
if haveVS2013Update2OrLater and optBuild:
# http://blogs.msdn.com/b/vcblog/archive/2013/09/11/introducing-gw-compiler-switch.aspx
#
myenv.Append( CCFLAGS=["/Gw", "/Gy"] )
myenv.Append( LINKFLAGS=["/OPT:REF"])
# http://blogs.msdn.com/b/vcblog/archive/2014/03/25/linker-enhancements-in-visual-studio-2013-update-2-ctp2.aspx
#
myenv.Append( CCFLAGS=["/Zc:inline"])
# Apply any link time optimization settings as selected by the 'lto' option.
if has_option('lto'):
if using_msvc():
# Note that this is actually more aggressive than LTO, it is whole program
# optimization due to /GL. However, this is historically what we have done for
# windows, so we are keeping it.
#
# /GL implies /LTCG, so no need to say it in CCFLAGS, but we do need /LTCG on the
# link flags.
myenv.Append(CCFLAGS=['/GL'])
myenv.Append(LINKFLAGS=['/LTCG'])
myenv.Append(ARFLAGS=['/LTCG'])
elif using_gcc() or using_clang():
# For GCC and clang, the flag is -flto, and we need to pass it both on the compile
# and link lines.
if AddToCCFLAGSIfSupported(myenv, '-flto'):
myenv.Append(LINKFLAGS=['-flto'])
def LinkHelloWorld(context, adornment = None):
test_body = """
#include
int main() {
std::cout << "Hello, World!" << std::endl;
return 0;
}
"""
message = "Trying to link with LTO"
if adornment:
message = message + " " + adornment
message = message + "..."
context.Message(message)
ret = context.TryLink(textwrap.dedent(test_body), ".cpp")
context.Result(ret)
return ret
conf = Configure(myenv, help=False, custom_tests = {
'LinkHelloWorld' : LinkHelloWorld,
})
# Some systems (clang, on a system with the BFD linker by default) may need to
# explicitly request the gold linker for LTO to work. If we can't LTO link a
# simple program, see if -fuse=ld=gold helps.
if not conf.LinkHelloWorld():
conf.env.Append(LINKFLAGS=["-fuse-ld=gold"])
if not conf.LinkHelloWorld("(with -fuse-ld=gold)"):
myenv.ConfError("Error: Couldn't link with LTO")
myenv = conf.Finish()
else:
myenv.ConfError("Link time optimization requested, " +
"but selected compiler does not honor -flto" )
else:
myenv.ConfError("Don't know how to enable --lto on current toolchain")
# When using msvc, check for support for __declspec(thread), unless we have been asked
# explicitly not to use it. For other compilers, see if __thread works.
if using_msvc():
haveDeclSpecThread = False
if not has_option("disable-declspec-thread"):
def CheckDeclspecThread(context):
test_body = """
__declspec( thread ) int tsp_int;
int main(int argc, char* argv[]) {
tsp_int = argc;
return 0;
}
"""
context.Message('Checking for __declspec(thread)... ')
ret = context.TryLink(textwrap.dedent(test_body), ".cpp")
context.Result(ret)
return ret
conf = Configure(myenv, help=False, custom_tests = {
'CheckDeclspecThread' : CheckDeclspecThread,
})
haveDeclSpecThread = conf.CheckDeclspecThread()
conf.Finish()
if haveDeclSpecThread:
myenv.Append(CPPDEFINES=['MONGO_HAVE___DECLSPEC_THREAD'])
else:
def CheckUUThread(context):
test_body = """
__thread int tsp_int;
int main(int argc, char* argv[]) {
tsp_int = argc;
return 0;
}
"""
context.Message('Checking for __thread... ')
ret = context.TryLink(textwrap.dedent(test_body), ".cpp")
context.Result(ret)
return ret
conf = Configure(myenv, help=False, custom_tests = {
'CheckUUThread' : CheckUUThread,
})
haveUUThread = conf.CheckUUThread()
conf.Finish()
if haveUUThread:
myenv.Append(CPPDEFINES=['MONGO_HAVE___THREAD'])
def CheckCXX11Atomics(context):
test_body = """
#include
int main(int argc, char **argv) {
std::atomic a(0);
return a.fetch_add(1);
}
"""
context.Message('Checking for C++11 support... ')
ret = context.TryLink(textwrap.dedent(test_body), '.cpp')
context.Result(ret)
return ret;
def CheckGCCAtomicBuiltins(context):
test_body = """
int main(int argc, char **argv) {
int a = 0;
int b = 0;
int c = 0;
__atomic_compare_exchange(&a, &b, &c, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
return 0;
}
"""
context.Message('Checking for gcc __atomic builtins... ')
ret = context.TryLink(textwrap.dedent(test_body), '.cpp')
context.Result(ret)
return ret
def CheckGCCSyncBuiltins(context):
test_body = """
int main(int argc, char **argv) {
int a = 0;
return __sync_fetch_and_add(&a, 1);
}
//
// Figure out if we are using gcc older than 4.2 to target 32-bit x86. If so, error out
// even if we were able to compile the __sync statement, due to
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=40693
//
#if defined(__i386__)
#if !defined(__clang__)
#if defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ < 2)
#error "Refusing to use __sync in 32-bit mode with gcc older than 4.2"
#endif
#endif
#endif
"""
context.Message('Checking for useable __sync builtins... ')
ret = context.TryLink(textwrap.dedent(test_body), '.cpp')
context.Result(ret)
return ret
# not all C++11-enabled gcc versions have type properties
def CheckCXX11IsTriviallyCopyable(context):
test_body = """
#include
int main(int argc, char **argv) {
class Trivial {
int trivial1;
double trivial2;
struct {
float trivial3;
short trivial4;
} trivial_member;
};
class NotTrivial {
int x, y;
NotTrivial(const NotTrivial& o) : x(o.y), y(o.x) {}
};
static_assert(std::is_trivially_copyable::value,
"I should be trivially copyable");
static_assert(!std::is_trivially_copyable::value,
"I should not be trivially copyable");
return 0;
}
"""
context.Message('Checking for C++11 is_trivially_copyable support... ')
ret = context.TryCompile(textwrap.dedent(test_body), '.cpp')
context.Result(ret)
return ret
conf = Configure(myenv, help=False, custom_tests = {
'CheckCXX11Atomics': CheckCXX11Atomics,
'CheckGCCAtomicBuiltins': CheckGCCAtomicBuiltins,
'CheckGCCSyncBuiltins': CheckGCCSyncBuiltins,
'CheckCXX11IsTriviallyCopyable': CheckCXX11IsTriviallyCopyable,
})
# Figure out what atomics mode to use by way of the tests defined above.
#
# Non_windows: > __atomic > __sync
# Windows: > Interlocked functions / intrinsics.
#
# If we are in C++11 mode, try to use . This is unusual for us, as typically we
# only use __cplusplus >= 201103L to decide if we want to enable a feature. We make a
# special case for the atomics and use them on platforms that offer them even if they don't
# advertise full conformance. For MSVC systems, if we don't have then no more
# checks are required. Otherwise, we are on a GCC/clang system, where we may have __atomic
# or __sync, so try those in that order next.
#
# If we don't end up defining a MONGO_HAVE for the atomics, we will end up falling back to
# the Microsoft Interlocked functions/intrinsics when using MSVC, or the gcc_intel
# implementation of hand-rolled assembly if using gcc/clang.
if (using_msvc() or (cxx11_mode == "on")) and conf.CheckCXX11Atomics():
conf.env['MONGO_HAVE_CXX11_ATOMICS'] = True
elif using_gcc() or using_clang():
# Prefer the __atomic builtins. If we don't have those, try for __sync. Otherwise
# atomic_intrinsics.h will try to fall back to the hand-rolled assembly implementations
# in atomic_intrinsics_gcc_intel for x86 platforms.
if conf.CheckGCCAtomicBuiltins():
conf.env["MONGO_HAVE_GCC_ATOMIC_BUILTINS"] = True
else:
if conf.CheckGCCSyncBuiltins():
conf.env["MONGO_HAVE_GCC_SYNC_BUILTINS"] = True
if (cxx11_mode == "on") and conf.CheckCXX11IsTriviallyCopyable():
conf.env['MONGO_HAVE_STD_IS_TRIVIALLY_COPYABLE'] = True
myenv = conf.Finish()
if using_msvc():
# TODO: This is really only needed for MSVC 12, but we have no current way to know
# which MSVC version we have. Presuming that this is harmless on other MSVC
# implementations. Without this, gtest doesn't build. We need to apply universally, not
# just while builing gtest.
myenv.Append(CPPDEFINES=[('_VARIADIC_MAX', 10)])
conf = Configure(myenv)
conf.env["MONGO_SSL"] = bool(has_option("ssl"))
if conf.env["MONGO_SSL"]:
sslLibName = "ssl"
cryptoLibName = "crypto"
if windows:
sslLibName = "ssleay32"
cryptoLibName = "libeay32"
if not conf.CheckLibWithHeader(
sslLibName,
["openssl/ssl.h"],
"C",
"SSL_version(NULL);",
autoadd=True):
conf.env.ConfError("Couldn't find OpenSSL ssl.h header and library")
if not conf.CheckLibWithHeader(
cryptoLibName,
["openssl/crypto.h"],
"C",
"SSLeay_version(0);",
autoadd=True):
conf.env.ConfError("Couldn't find OpenSSL crypto.h header and library")
def CheckLinkSSL(context):
test_body = """
#include
#include
#include
int main() {
SSL_library_init();
SSL_load_error_strings();
ERR_load_crypto_strings();
OpenSSL_add_all_algorithms();
ERR_free_strings();
return EXIT_SUCCESS;
}
"""
context.Message("Checking that linking to OpenSSL works...")
ret = context.TryLink(textwrap.dedent(test_body), ".c")
context.Result(ret)
return ret
conf.AddTest("CheckLinkSSL", CheckLinkSSL)
if not conf.CheckLinkSSL():
conf.env.ConfError("SSL is enabled, but is unavailable")
if conf.CheckDeclaration(
"FIPS_mode_set",
includes="""
#include
#include
"""):
conf.env.Append(CPPDEFINES=["MONGO_HAVE_FIPS_MODE_SET"])
if not conf.CheckCXXHeader( "boost/version.hpp" ):
conf.env.ConfError("Could not find boost headers in include search path")
if (not windows) and boostSuffixList:
# We don't do this for windows because we rely on autolib.
for b in boostLibs:
boostCandidates = ["boost_" + b + suffix for suffix in boostSuffixList]
if not conf.CheckLib(boostCandidates, language="C++"):
conf.env.ConfError("can't find boost")
# We need xtime internally no matter what the local boost thread version may be since we
# cannot require the existence of chrono. It is important that no uses of xtime become part
# of the public interface of the library so that we do not impose this burden on our
# consumers.
conf.env.Append(CPPDEFINES=[("BOOST_THREAD_USES_DATETIME")])
if conf.CheckHeader('unistd.h'):
conf.env['MONGO_HAVE_HEADER_UNISTD_H'] = True
if posix_system:
conf.env.Append(CPPDEFINES=['MONGO_HAVE_HEADER_UNISTD_H'])
conf.CheckLib('rt')
if posix_monotonic_clock:
conf.env.Append(CPPDEFINES=['MONGO_HAVE_POSIX_MONOTONIC_CLOCK'])
if solaris:
conf.CheckLib( "nsl" )
conf.env['MONGO_SASL'] = bool(has_option("use-sasl-client"))
if conf.env['MONGO_SASL'] and not conf.env['MONGO_SSL']:
myenv.FatalError("SASL support requires --ssl")
if conf.env['MONGO_SASL'] and not conf.CheckLibWithHeader(
"sasl2",
["stddef.h","sasl/sasl.h"],
"C",
"sasl_version_info(0, 0, 0, 0, 0, 0);",
autoadd=True ):
myenv.ConfError("Couldn't find SASL header/libraries")
# requires ports devel/libexecinfo to be installed
if freebsd or openbsd:
if not conf.CheckLib("execinfo"):
myenv.ConfError("Cannot find libexecinfo, please install devel/libexecinfo")
# check for presence of timegm(3) and polyfill if needed
conf.env['MONGO_HAVE_TIMEGM'] = conf.CheckDeclaration(
'timegm', includes="#include ", language='C')
if conf.env['MONGO_HAVE_TIMEGM']:
conf.env.Append(CPPDEFINES=['MONGO_HAVE_TIMEGM'])
# check for presence of strnlen(3) and polyfill if needed
if conf.CheckDeclaration('strnlen', includes="#include ", language='C'):
conf.env['MONGO_HAVE_STRNLEN'] = True
return conf.Finish()
env = doConfigure( env )
env['PDB'] = '${TARGET.base}.pdb'
# ---- Docs ----
def build_docs(env, target, source):
buildscripts.docs.main()
env.Alias("docs", [], [build_docs])
env.AlwaysBuild("docs")
# --- lint ----
def doLint( env , target , source ):
import buildscripts.clang_format
if not buildscripts.clang_format.lint(None, []):
raise Exception("clang-format lint errors")
if not buildscripts.lint.run_lint( [ "src/mongo/" ] ):
raise Exception( "lint errors" )
env.Alias( "lint" , [] , [ doLint ] )
env.AlwaysBuild( "lint" )
# --- an uninstall target ---
if len(COMMAND_LINE_TARGETS) > 0 and 'uninstall' in COMMAND_LINE_TARGETS:
SetOption("clean", 1)
# By inspection, changing COMMAND_LINE_TARGETS here doesn't do
# what we want, but changing BUILD_TARGETS does.
BUILD_TARGETS.remove("uninstall")
BUILD_TARGETS.append("install")
# The following symbols are exported for use in subordinate SConscript files.
# Ideally, the SConscript files would be purely declarative. They would only
# import build environment objects, and would contain few or no conditional
# statements or branches.
#
# Currently, however, the SConscript files do need some predicates for
# conditional decision making that hasn't been moved up to this SConstruct file,
# and they are exported here, as well.
Export("env")
Export("get_option")
Export("has_option")
Export("darwin windows solaris linux freebsd nix")
Export("debugBuild optBuild")
Export("use_clang")
env.SConscript('src/SConscript', variant_dir='$VARIANT_DIR', duplicate=False)
# --- Coverage ---
if has_option("gcov"):
env['GCOV_BASE_DIR'] = env.Dir(".").abspath
env['GCOV_BUILD_DIR'] = env.Dir("$VARIANT_DIR").abspath
# Zero out all the counters -- depends on tests being built
env.Alias(
'zero_counters',
['unittests', 'clientTests', 'integration_tests'],
['lcov -z -b $GCOV_BASE_DIR -d $GCOV_BUILD_DIR']
)
env.AlwaysBuild('zero_counters')
# Generates test coverage information -- depends on tests being run
env.Command(
target='$VARIANT_DIR/coverage.info',
source=['zero_counters', 'test', 'smokeClient', 'integration'],
action='lcov --no-external -c -b $GCOV_BASE_DIR -d $GCOV_BUILD_DIR -o $TARGET'
)
env.AlwaysBuild('coverage.info')
# Strip third_party and build related coverage info
stripCmd = env.Command(
target=None,
source='$VARIANT_DIR/coverage.info',
action=[
'lcov -r $SOURCE src/third_party/\* -o $SOURCE',
'lcov -r $SOURCE build/\* -o $SOURCE',
'lcov -r $SOURCE \*_test.cpp -o $SOURCE',
'lcov -r $SOURCE src/mongo/client/examples/\* -o $SOURCE',
'lcov -r $SOURCE src/mongo/dbtests/\* -o $SOURCE',
'lcov -r $SOURCE src/mongo/unittest/\* -o $SOURCE',
'lcov -r $SOURCE src/mongo/bson/bsondemo/\* -o $SOURCE',
],
)
env.AlwaysBuild(stripCmd)
env.Alias('strip_coverage', stripCmd)
# Generates the HTML output in "coverage" directory
coverageCmd = env.Command(
env.Dir('$BUILD_DIR/coverage'),
'strip_coverage',
[
'rm -rf $BUILD_DIR/coverage',
'genhtml --frames --legend -t "MongoDB C++ Driver Coverage" -o $TARGET $VARIANT_DIR/coverage.info'
]
)
env.AlwaysBuild(coverageCmd)
env.Alias('coverage', coverageCmd)
env.Alias('all', ['driver', 'build-unit', 'build-integration', 'build-examples'])
env.Alias('test', ['unit', 'integration', 'examples'])
Default('driver')
mongo-cxx-driver-legacy-1.1.2/THIRD-PARTY-NOTICES 0000664 0000000 0000000 00000024100 12732311114 0020751 0 ustar 00root root 0000000 0000000 MongoDB uses third-party libraries or other resources that may
be distributed under licenses different than the MongoDB software.
In the event that we accidentally failed to list a required notice,
please bring it to our attention through any of the ways detailed here:
https://jira.mongodb.org/browse/CXX
The attached notices are provided for information only.
For any licenses that require disclosure of source, sources are available at
https://github.com/mongodb/mongo-cxx-driver.
1) License Notice for The Loki Library
--------------------------------------
Copyright (c) 2000 Andrei Alexandrescu
Copyright (c) 2000 Petru Marginean
Copyright (c) 2005 Joshua Lehrer
Permission to use, copy, modify, distribute and sell this software for any
purpose is hereby granted without fee, provided that the above copyright
notice appear in all copies and that both that copyright notice and this
permission notice appear in supporting documentation.
The author makes no representations about the suitability of this software
for any purpose. It is provided "as is" without express or implied
warranty.
2) License Notice for MurmurHash
--------------------------------
Copyright (c) 2010-2012 Austin Appleby
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
3) License Notice for The Google C++ Testing Framework (Google Test)
--------------------------------------------------------------------
Copyright 2005, Google Inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the distribution.
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from this
software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
4) License Notice for JsonCpp
-----------------------------
The JsonCpp library's source code, including accompanying documentation,
tests and demonstration applications, are licensed under the following
conditions...
The author (Baptiste Lepilleur) explicitly disclaims copyright in all
jurisdictions which recognize such a disclaimer. In such jurisdictions,
this software is released into the Public Domain.
In jurisdictions which do not recognize Public Domain property (e.g.
Germany as of 2010), this software is Copyright (c) 2007-2010 by Baptiste
Lepilleur, and is released under the terms of the MIT License (see below).
In jurisdictions which recognize Public Domain property, the user of this
software may choose to accept it either as 1) Public Domain, 2) under the
conditions of the MIT License (see below), or 3) under the terms of dual
Public Domain/MIT License conditions described here, as they choose.
The MIT License is about as close to Public Domain as a license can get, and is
described in clear, concise terms at:
http://en.wikipedia.org/wiki/MIT_License
The full text of the MIT License follows:
========================================================================
Copyright (c) 2007-2010 Baptiste Lepilleur
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy,
modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
========================================================================
(END LICENSE TEXT)
The MIT license is compatible with both the GPL and commercial
software, affording one all of the rights of Public Domain with the
minor nuisance of being required to keep the above copyright notice
and license text in the source code. Note also that by accepting the
Public Domain "license" you can re-license your copy using whatever
license you like.
5) License Notice for RestClient
--------------------------------
Copyright (c) 2010 Daniel Schauenberg
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
6) License Notice for the TZ Database
-------------------------------------
The tzcode library is published as part of the TZ Database by IANA at
https://www.iana.org/time-zones
Ownership is described in https://www.rfc-editor.org/bcp/bcp175.txt:
The TZ database itself is not an IETF Contribution or an IETF document.
Rather it is a pre-existing and regularly updated work that is in the
public domain, and is intended to remain in the public domain.
Therefore, BCPs 78 [RFC5378] and 79 [RFC3979] do not apply to the TZ
Database or contributions that individuals make to it. Should any
claims be made and substantiated against the TZ Database, the
organization that is providing the IANA Considerations defined in this
RFC, under the memorandum of understanding with the IETF, currently
ICANN, may act in accordance with all competent court orders. No
ownership claims will be made by ICANN or the IETF Trust on the
database or the code. Any person making a contribution to the database
or code waives all rights to future claims in that contribution or in
the TZ Database.
7) License Notice for Independent implementation of MD5 by Aladdin Enterprises
------------------------------------------------------------------------------
Copyright (C) 1999, 2002 Aladdin Enterprises. All rights reserved.
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software in a
product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
L. Peter Deutsch
ghost@aladdin.com
NOTE: Per restriction 2 above, this file has been altered by MongoDB as
follows:
1. The functions md5_init, md5_append, and md5_finish have been moved into
the 'mongo' namespace and given C++ linkage, so that static archives of
this library may be combined with other libraries that expose functions of
the same name.
mongo-cxx-driver-legacy-1.1.2/docs/ 0000775 0000000 0000000 00000000000 12732311114 0017110 5 ustar 00root root 0000000 0000000 mongo-cxx-driver-legacy-1.1.2/docs/.gitkeep 0000664 0000000 0000000 00000000000 12732311114 0020527 0 ustar 00root root 0000000 0000000 mongo-cxx-driver-legacy-1.1.2/etc/ 0000775 0000000 0000000 00000000000 12732311114 0016733 5 ustar 00root root 0000000 0000000 mongo-cxx-driver-legacy-1.1.2/etc/asan.blacklist 0000664 0000000 0000000 00000000000 12732311114 0021535 0 ustar 00root root 0000000 0000000 mongo-cxx-driver-legacy-1.1.2/etc/doxygen/ 0000775 0000000 0000000 00000000000 12732311114 0020410 5 ustar 00root root 0000000 0000000 mongo-cxx-driver-legacy-1.1.2/etc/doxygen/config 0000664 0000000 0000000 00000025315 12732311114 0021606 0 ustar 00root root 0000000 0000000 #---------------------------------------------------------------------------
# Project related configuration options
#---------------------------------------------------------------------------
DOXYFILE_ENCODING = UTF-8
PROJECT_NAME = "MongoDB C++ Driver"
PROJECT_NUMBER = legacy-1.1.2
OUTPUT_DIRECTORY = docs/doxygen
CREATE_SUBDIRS = NO
OUTPUT_LANGUAGE = English
BRIEF_MEMBER_DESC = YES
REPEAT_BRIEF = YES
ABBREVIATE_BRIEF = "The $name class" \
"The $name widget" \
"The $name file" \
is \
provides \
specifies \
contains \
represents \
a \
an \
the
ALWAYS_DETAILED_SEC = NO
INLINE_INHERITED_MEMB = NO
FULL_PATH_NAMES = NO
STRIP_FROM_PATH =
STRIP_FROM_INC_PATH =
SHORT_NAMES = NO
JAVADOC_AUTOBRIEF = YES
QT_AUTOBRIEF = NO
MULTILINE_CPP_IS_BRIEF = NO
INHERIT_DOCS = YES
SEPARATE_MEMBER_PAGES = NO
TAB_SIZE = 4
ALIASES =
OPTIMIZE_OUTPUT_FOR_C = NO
OPTIMIZE_OUTPUT_JAVA = NO
OPTIMIZE_FOR_FORTRAN = NO
OPTIMIZE_OUTPUT_VHDL = NO
EXTENSION_MAPPING =
BUILTIN_STL_SUPPORT = NO
CPP_CLI_SUPPORT = NO
SIP_SUPPORT = NO
IDL_PROPERTY_SUPPORT = YES
DISTRIBUTE_GROUP_DOC = NO
SUBGROUPING = YES
TYPEDEF_HIDES_STRUCT = NO
SYMBOL_CACHE_SIZE = 0
#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------
EXTRACT_ALL = NO
EXTRACT_PRIVATE = NO
EXTRACT_STATIC = NO
EXTRACT_LOCAL_CLASSES = NO
EXTRACT_LOCAL_METHODS = NO
EXTRACT_ANON_NSPACES = NO
HIDE_UNDOC_MEMBERS = NO
HIDE_UNDOC_CLASSES = NO
HIDE_FRIEND_COMPOUNDS = NO
HIDE_IN_BODY_DOCS = NO
INTERNAL_DOCS = NO
CASE_SENSE_NAMES = NO
HIDE_SCOPE_NAMES = NO
SHOW_INCLUDE_FILES = YES
INLINE_INFO = YES
SORT_MEMBER_DOCS = YES
SORT_BRIEF_DOCS = NO
SORT_GROUP_NAMES = NO
SORT_BY_SCOPE_NAME = NO
GENERATE_TODOLIST = YES
GENERATE_TESTLIST = YES
GENERATE_BUGLIST = YES
GENERATE_DEPRECATEDLIST= YES
ENABLED_SECTIONS =
MAX_INITIALIZER_LINES = 30
SHOW_USED_FILES = YES
SHOW_DIRECTORIES = NO
SHOW_FILES = YES
SHOW_NAMESPACES = YES
FILE_VERSION_FILTER =
LAYOUT_FILE =
#---------------------------------------------------------------------------
# configuration options related to warning and progress messages
#---------------------------------------------------------------------------
QUIET = NO
WARNINGS = YES
WARN_IF_UNDOCUMENTED = YES
WARN_IF_DOC_ERROR = YES
WARN_NO_PARAMDOC = NO
WARN_FORMAT = "$file:$line: $text"
WARN_LOGFILE =
#---------------------------------------------------------------------------
# configuration options related to the input files
#---------------------------------------------------------------------------
INPUT = src/mongo
INPUT_ENCODING = UTF-8
FILE_PATTERNS = *.c \
*.cc \
*.cxx \
*.cpp \
*.c++ \
*.d \
*.java \
*.ii \
*.ixx \
*.ipp \
*.i++ \
*.inl \
*.h \
*.hh \
*.hxx \
*.hpp \
*.h++ \
*.idl \
*.odl \
*.cs \
*.php \
*.php3 \
*.inc \
*.m \
*.mm \
*.dox \
*.py \
*.f90 \
*.f \
*.vhd \
*.vhdl
RECURSIVE = YES
EXCLUDE = src/mongo/bson/bsondemo \
src/mongo/client/examples \
src/mongo/client/private \
src/mongo/dbtests \
src/mongo/integration \
src/mongo/orchestration \
src/mongo/unittest
EXCLUDE_SYMLINKS = NO
EXCLUDE_PATTERNS =
EXCLUDE_SYMBOLS =
EXAMPLE_PATH =
EXAMPLE_PATTERNS = *
EXAMPLE_RECURSIVE = NO
IMAGE_PATH =
INPUT_FILTER =
FILTER_PATTERNS =
FILTER_SOURCE_FILES = NO
#---------------------------------------------------------------------------
# configuration options related to source browsing
#---------------------------------------------------------------------------
SOURCE_BROWSER = NO
INLINE_SOURCES = NO
STRIP_CODE_COMMENTS = YES
REFERENCED_BY_RELATION = NO
REFERENCES_RELATION = NO
REFERENCES_LINK_SOURCE = YES
USE_HTAGS = NO
VERBATIM_HEADERS = YES
#---------------------------------------------------------------------------
# configuration options related to the alphabetical class index
#---------------------------------------------------------------------------
ALPHABETICAL_INDEX = NO
COLS_IN_ALPHA_INDEX = 5
IGNORE_PREFIX =
#---------------------------------------------------------------------------
# configuration options related to the HTML output
#---------------------------------------------------------------------------
GENERATE_HTML = YES
HTML_OUTPUT = html
HTML_FILE_EXTENSION = .html
HTML_HEADER =
HTML_FOOTER =
HTML_STYLESHEET =
HTML_ALIGN_MEMBERS = YES
HTML_DYNAMIC_SECTIONS = NO
GENERATE_DOCSET = NO
DOCSET_FEEDNAME = "Doxygen generated docs"
DOCSET_BUNDLE_ID = org.doxygen.Project
GENERATE_HTMLHELP = NO
CHM_FILE =
HHC_LOCATION =
GENERATE_CHI = NO
CHM_INDEX_ENCODING =
BINARY_TOC = NO
TOC_EXPAND = NO
GENERATE_QHP = NO
QCH_FILE =
QHP_NAMESPACE =
QHP_VIRTUAL_FOLDER = doc
QHP_CUST_FILTER_NAME =
QHP_CUST_FILTER_ATTRS =
QHP_SECT_FILTER_ATTRS =
QHG_LOCATION =
DISABLE_INDEX = NO
ENUM_VALUES_PER_LINE = 4
GENERATE_TREEVIEW = NONE
TREEVIEW_WIDTH = 250
FORMULA_FONTSIZE = 10
#---------------------------------------------------------------------------
# configuration options related to the LaTeX output
#---------------------------------------------------------------------------
GENERATE_LATEX = YES
LATEX_OUTPUT = latex
LATEX_CMD_NAME = latex
MAKEINDEX_CMD_NAME = makeindex
COMPACT_LATEX = NO
PAPER_TYPE = a4wide
EXTRA_PACKAGES =
LATEX_HEADER =
PDF_HYPERLINKS = YES
USE_PDFLATEX = YES
LATEX_BATCHMODE = NO
LATEX_HIDE_INDICES = NO
#---------------------------------------------------------------------------
# configuration options related to the RTF output
#---------------------------------------------------------------------------
GENERATE_RTF = NO
RTF_OUTPUT = rtf
COMPACT_RTF = NO
RTF_HYPERLINKS = NO
RTF_STYLESHEET_FILE =
RTF_EXTENSIONS_FILE =
#---------------------------------------------------------------------------
# configuration options related to the man page output
#---------------------------------------------------------------------------
GENERATE_MAN = NO
MAN_OUTPUT = man
MAN_EXTENSION = .3
MAN_LINKS = NO
#---------------------------------------------------------------------------
# configuration options related to the XML output
#---------------------------------------------------------------------------
GENERATE_XML = NO
XML_OUTPUT = xml
XML_SCHEMA =
XML_DTD =
XML_PROGRAMLISTING = YES
#---------------------------------------------------------------------------
# configuration options for the AutoGen Definitions output
#---------------------------------------------------------------------------
GENERATE_AUTOGEN_DEF = NO
#---------------------------------------------------------------------------
# configuration options related to the Perl module output
#---------------------------------------------------------------------------
GENERATE_PERLMOD = NO
PERLMOD_LATEX = NO
PERLMOD_PRETTY = YES
PERLMOD_MAKEVAR_PREFIX =
#---------------------------------------------------------------------------
# Configuration options related to the preprocessor
#---------------------------------------------------------------------------
ENABLE_PREPROCESSING = YES
MACRO_EXPANSION = NO
EXPAND_ONLY_PREDEF = NO
SEARCH_INCLUDES = YES
INCLUDE_PATH =
INCLUDE_FILE_PATTERNS =
PREDEFINED =
EXPAND_AS_DEFINED =
SKIP_FUNCTION_MACROS = YES
#---------------------------------------------------------------------------
# Configuration::additions related to external references
#---------------------------------------------------------------------------
TAGFILES =
GENERATE_TAGFILE =
ALLEXTERNALS = NO
EXTERNAL_GROUPS = YES
PERL_PATH = /usr/bin/perl
#---------------------------------------------------------------------------
# Configuration options related to the dot tool
#---------------------------------------------------------------------------
CLASS_DIAGRAMS = YES
MSCGEN_PATH =
HIDE_UNDOC_RELATIONS = YES
HAVE_DOT = NO
DOT_FONTNAME =
DOT_FONTSIZE = 10
DOT_FONTPATH =
CLASS_GRAPH = YES
COLLABORATION_GRAPH = YES
GROUP_GRAPHS = YES
UML_LOOK = NO
TEMPLATE_RELATIONS = NO
INCLUDE_GRAPH = YES
INCLUDED_BY_GRAPH = YES
CALL_GRAPH = NO
CALLER_GRAPH = NO
GRAPHICAL_HIERARCHY = YES
DIRECTORY_GRAPH = YES
DOT_IMAGE_FORMAT = png
DOT_PATH =
DOTFILE_DIRS =
DOT_GRAPH_MAX_NODES = 50
MAX_DOT_GRAPH_DEPTH = 0
DOT_TRANSPARENT = NO
DOT_MULTI_TARGETS = NO
GENERATE_LEGEND = YES
DOT_CLEANUP = YES
#---------------------------------------------------------------------------
# Options related to the search engine
#---------------------------------------------------------------------------
SEARCHENGINE = YES
mongo-cxx-driver-legacy-1.1.2/etc/lsan.suppressions 0000664 0000000 0000000 00000000000 12732311114 0022355 0 ustar 00root root 0000000 0000000 mongo-cxx-driver-legacy-1.1.2/etc/pick_from_log.pl 0000775 0000000 0000000 00000014227 12732311114 0022113 0 ustar 00root root 0000000 0000000 #!/usr/bin/perl -w
use strict;
use Term::ANSIColor;
use Term::ReadKey;
use List::Util qw( min max );
use Getopt::Long;
my $cxx;
my $mongo;
GetOptions(
'cxx=s' => \$cxx,
'mongo=s' => \$mongo,
'help' => sub { HELP(0); },
) or HELP(1);
$cxx or print "Please enter a path to the mongodb cxx driver repository\n" and HELP(1);
$mongo or print "Please enter a path to the mongodb mongo repository\n" and HELP(1);
my @kept;
my $sha;
my @lines;
my $has_file = 0;
my @decisions;
open FILE, "cd $mongo; git log --stat --oneline --reverse @ARGV |" or die "Couldn't execute git log: $!";
my $total_shas = 0;
while (my $line = ) {
if ($line =~ /^\s/) {
if ($line =~ /^ \d+ files? changed/) {
push @lines, $line;
} else {
my ($path) = ($line =~ /^ (\S+)\s*\|/);
if (! $path) {
die $line;
}
if (-f "$cxx/$path") {
$has_file = 1;
push @lines, color('bold green') . $line . color('reset');
} else {
push @lines, color('bold red') . $line . color('reset');
}
}
} else {
if ($has_file) {
$total_shas++;
$has_file = 0;
push @decisions, [$sha, [@lines]];
}
@lines = ();
($sha) = ($line =~ /^(\S+)/);
push @lines, color('bold yellow') . $line . color('reset');
}
}
close FILE;
if ($has_file) {
$total_shas++;
$has_file = 0;
push @decisions, [$sha, [@lines]];
}
@kept = map { "" } @decisions;
ReadMode 4;
my $seen_shas;
for (my $i = 0; $i < scalar(@decisions); $i++) {
$seen_shas = $i + 1;
eval {
if (! decision($i, @{$decisions[$i]})) {
$i = max(-1, $i - 2);
}
};
if ($@) {
ReadMode 0;
die $@;
}
}
ReadMode 0;
print join('', map { "$_\n" } @kept);
exit 0;
sub debug {
warn @_;
sleep 1;
}
sub decision {
my ($index, $sha, $lines) = @_;
my $offset = 0;
my $y = $kept[$index] ? color('bold green') . 'Y' . color('reset') : 'y';
my $n = $kept[$index] ? 'n' : color('bold red') . 'N' . color('reset');
my $options = < sub {
$kept[$index] = $sha;
return 1;
},
'n' => sub {
$kept[$index] = "";
return 1;
},
'b' => sub {
return 2;
},
's' => sub {
system("cd $mongo; git show $sha");
return 0;
},
'q' => sub {
ReadMode 0;
exit 0;
},
chr(10) => sub {
return 1;
},
chr(32) => sub {
return 1;
},
chr(27) => sub {
my $key = ord(ReadKey(0));
if ($key == 91) {
$key = ord(ReadKey(0));
if ($key == 65) {
$offset--;
} elsif ($key == 66) {
$offset++;
} elsif ($key == 49) {
$key = ord(ReadKey(0));
if ($key == 126) {
$offset = 0;
} else {
debug "pressed 27.91.49." . $key . "\n";
}
} elsif ($key == 52) {
$key = ord(ReadKey(0));
if ($key == 126) {
$offset = scalar(@$lines);
} else {
debug "pressed 27.91.52." . $key . "\n";
}
} elsif ($key == 53) {
$key = ord(ReadKey(0));
if ($key == 126) {
$offset = max(0, $offset - 10);
} else {
debug "pressed 27.91.53." . $key . "\n";
}
} elsif ($key == 54) {
$key = ord(ReadKey(0));
if ($key == 126) {
$offset = min(scalar(@$lines), $offset + 10);
} else {
debug "pressed 27.91.54." . $key . "\n";
}
} else {
debug "pressed 27.91." . $key . "\n";
}
} else {
debug "pressed 27." . $key . "\n";
}
return 0;
},
);
if ($table{$key}) {
my $x = $table{$key}->();
if ($x == 1) {
last;
} elsif ($x == 2) {
return 0;
}
} else {
debug "pressed " . ord($key) . "\n";
}
display($lines, \$offset, $options);
}
return 1;
}
sub display {
my ($lines, $offset, $options) = @_;
print `clear`;
my ($width, $height) = GetTerminalSize();
my $window = $height - (scalar(split /\n/, $options) + 10);
$$offset = max($$offset, 0);
$$offset = min($$offset, max(scalar(@$lines) - $window - 1, 0));
my $min = $$offset;
my $max = min($window + $$offset, scalar(@$lines)-1);
printf("%d% (%d/%d)\n", (100 * $seen_shas / $total_shas), $seen_shas, $total_shas);
print map {
if (length($_) <= $width) {
$_;
} else {
substr($_, 0, $width - 3) . "...\n";
}
} @$lines[$min..$max];
print "\n", $options;
}
sub HELP {
my ($exit) = @_;
my $usage = <