diff --git a/CMake/install_test_project/CMakeLists.txt b/CMake/install_test_project/CMakeLists.txt new file mode 100644 index 000000000..b8e27dd1a --- /dev/null +++ b/CMake/install_test_project/CMakeLists.txt @@ -0,0 +1,27 @@ +# +# Copyright 2019 The Abseil Authors. +# +# 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 +# +# https://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. + +# A simple CMakeLists.txt for testing cmake installation + +cmake_minimum_required(VERSION 3.5) +project(absl_cmake_testing) + +set(CMAKE_CXX_STANDARD 11) + +add_executable(simple simple.cc) + +find_package(absl REQUIRED) + +target_link_libraries(simple absl::strings) diff --git a/CMake/install_test_project/simple.cc b/CMake/install_test_project/simple.cc new file mode 100644 index 000000000..e9e352912 --- /dev/null +++ b/CMake/install_test_project/simple.cc @@ -0,0 +1,23 @@ +// +// Copyright 2019 The Abseil Authors. +// +// 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 +// +// https://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. + +#include +#include "absl/strings/substitute.h" + +int main(int argc, char** argv) { + for (int i = 0; i < argc; ++i) { + std::cout << absl::Substitute("Arg $0: $1\n", i, argv[i]); + } +} diff --git a/CMake/install_test_project/test.sh b/CMake/install_test_project/test.sh new file mode 100755 index 000000000..4b19bb558 --- /dev/null +++ b/CMake/install_test_project/test.sh @@ -0,0 +1,105 @@ +#!/bin/bash +# +# Copyright 2019 The Abseil Authors. +# +# 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 +# +# https://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. + +# "Unit" and integration tests for Absl CMake installation + +# TODO(absl-team): This script isn't fully hermetic because +# -DABSL_USE_GOOGLETEST_HEAD=ON means that this script isn't pinned to a fixed +# version of GoogleTest. This means that an upstream change to GoogleTest could +# break this test. Fix this by allowing this script to pin to a known-good +# version of GoogleTest. + +# Fail on any error. Treat unset variables an error. Print commands as executed. +set -euox pipefail +absl_dir=/abseil-cpp +absl_build_dir=/buildfs/absl-build +project_dir="${absl_dir}"/CMake/install_test_project +project_build_dir=/buildfs/project-build +install_dir="${project_build_dir}"/install + +install_absl() { + if [[ "${#}" -eq 1 ]]; then + cmake -DCMAKE_INSTALL_PREFIX="${1}" -B "${absl_build_dir}" -S "${absl_dir}" + else + cmake -B "${absl_build_dir}" -S "${absl_dir}" + fi + cmake --build "${absl_build_dir}" --target install -- -j +} + +uninstall_absl() { + xargs rm < "${absl_build_dir}"/install_manifest.txt + rm -rf "${absl_build_dir}" +} + +# Test build, install, and link against installed abseil +install_absl "${install_dir}" +cmake \ + -H"${project_dir}" \ + -B"${project_build_dir}" \ + -DCMAKE_PREFIX_PATH="${install_dir}" +cmake --build "${project_build_dir}" --target simple + +output="$(${project_build_dir}/simple "printme" 2>&1)" +if [[ "${output}" != *"Arg 1: printme"* ]]; then + echo "Faulty output on simple project:" + echo "${output}" + exit 1 +fi + +# Test that we haven't accidentally made absl::abslblah +pushd "${install_dir}" + +# Starting in CMake 3.12 the default install dir is lib$bit_width +if [[ -d lib ]]; then + libdir="lib" +elif [[ -d lib64 ]]; then + libdir="lib64" +else + echo "ls *, */*, */*/*:" + ls * + ls */* + ls */*/* + echo "unknown lib dir" +fi + +if ! grep absl::strings "${libdir}"/cmake/absl/abslTargets.cmake; then + cat "${libdir}"/cmake/absl/abslTargets.cmake + echo "CMake targets named incorrectly" + exit 1 +fi + +uninstall_absl +popd + +# Test that we warn if installed without a prefix or a system prefix +output="$(install_absl 2>&1)" +if [[ "${output}" != *"Please set CMAKE_INSTALL_PREFIX"* ]]; then + echo "Install without prefix didn't warn as expected. Output:" + echo "${output}" + exit 1 +fi +uninstall_absl + +output="$(install_absl /usr 2>&1)" +if [[ "${output}" != *"Please set CMAKE_INSTALL_PREFIX"* ]]; then + echo "Install with /usr didn't warn as expected. Output:" + echo "${output}" + exit 1 +fi +uninstall_absl + +echo "Install test complete!" +exit 0 diff --git a/CMakeLists.txt b/CMakeLists.txt index e3bb8d052..3f4fbdcfc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -121,17 +121,17 @@ add_subdirectory(absl) # install as a subdirectory only install(EXPORT ${PROJECT_NAME}Targets NAMESPACE absl:: - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" ) configure_package_config_file( CMake/abslConfig.cmake.in "${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" - INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake" + INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" ) install(FILES "${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" - DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" ) install(DIRECTORY absl diff --git a/absl/types/optional.h b/absl/types/optional.h index 58906aa46..f0ae9a173 100644 --- a/absl/types/optional.h +++ b/absl/types/optional.h @@ -36,6 +36,7 @@ #define ABSL_TYPES_OPTIONAL_H_ #include "absl/base/config.h" +#include "absl/memory/memory.h" #include "absl/utility/utility.h" #ifdef ABSL_HAVE_STD_OPTIONAL @@ -60,7 +61,6 @@ using std::nullopt; #include #include "absl/base/attributes.h" -#include "absl/memory/memory.h" #include "absl/meta/type_traits.h" #include "absl/types/bad_optional_access.h" @@ -400,23 +400,24 @@ class optional_assign_base { }; template -constexpr copy_traits get_ctor_copy_traits() { - return std::is_copy_constructible::value - ? copy_traits::copyable - : std::is_move_constructible::value ? copy_traits::movable - : copy_traits::non_movable; -} +struct ctor_copy_traits { + static constexpr copy_traits traits = + std::is_copy_constructible::value + ? copy_traits::copyable + : std::is_move_constructible::value ? copy_traits::movable + : copy_traits::non_movable; +}; template -constexpr copy_traits get_assign_copy_traits() { - return absl::is_copy_assignable::value && - std::is_copy_constructible::value - ? copy_traits::copyable - : absl::is_move_assignable::value && - std::is_move_constructible::value - ? copy_traits::movable - : copy_traits::non_movable; -} +struct assign_copy_traits { + static constexpr copy_traits traits = + absl::is_copy_assignable::value && std::is_copy_constructible::value + ? copy_traits::copyable + : absl::is_move_assignable::value && + std::is_move_constructible::value + ? copy_traits::movable + : copy_traits::non_movable; +}; // Whether T is constructible or convertible from optional. template @@ -482,9 +483,9 @@ struct optional_hash_base >()( template class optional : private optional_internal::optional_data, private optional_internal::optional_ctor_base< - optional_internal::get_ctor_copy_traits()>, + optional_internal::ctor_copy_traits::traits>, private optional_internal::optional_assign_base< - optional_internal::get_assign_copy_traits()> { + optional_internal::assign_copy_traits::traits> { using data_base = optional_internal::optional_data; public: diff --git a/ci/cmake_install_test.sh b/ci/cmake_install_test.sh new file mode 100755 index 000000000..e54b78379 --- /dev/null +++ b/ci/cmake_install_test.sh @@ -0,0 +1,33 @@ +#!/bin/bash +# +# Copyright 2019 The Abseil Authors. +# +# 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 +# +# https://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. + +set -euox pipefail + +if [ -z ${ABSEIL_ROOT:-} ]; then + ABSEIL_ROOT="$(realpath $(dirname ${0})/..)" +fi + +time docker run \ + --volume="${ABSEIL_ROOT}:/abseil-cpp:ro" \ + --workdir=/abseil-cpp \ + --tmpfs=/buildfs:exec \ + --cap-add=SYS_PTRACE \ + --rm \ + -e CFLAGS="-Werror" \ + -e CXXFLAGS="-Werror" \ + gcr.io/google.com/absl-177019/linux_gcc-4.8:20190316 \ + /bin/bash CMake/install_test_project/test.sh +