Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cmake improvements (install target) #239

Merged
merged 2 commits into from
Dec 28, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -42,3 +42,4 @@ out.xml
cereal_version.out
xml_ordering.out
build
/out/
32 changes: 31 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,38 @@ cmake_minimum_required (VERSION 2.6.2)
project (cereal)

option(SKIP_PORTABILITY_TEST "Skip portability tests" OFF)
if(NOT CMAKE_VERSION VERSION_LESS 3.0) # installing cereal requires INTERFACE lib
option(JUST_INSTALL_CEREAL "Don't do anything besides installing the library" OFF)
endif()

set(CMAKE_CXX_FLAGS "-std=c++11 -Wall -Werror -g -Wextra -Wshadow -pedantic ${CMAKE_CXX_FLAGS}")
if(NOT MSVC)
set(CMAKE_CXX_FLAGS "-Wall -Werror -g -Wextra -Wshadow -pedantic ${CMAKE_CXX_FLAGS}")
if(CMAKE_VERSION VERSION_LESS 3.1)
set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
else()
if(NOT DEFINED CMAKE_CXX_STANDARD OR CMAKE_CXX_STANDARD STREQUAL "98")
set(CMAKE_CXX_STANDARD 11)
endif()
set(CMAKE_CXX_STANDARD_REQUIRED ON)
endif()
endif()

if(NOT CMAKE_VERSION VERSION_LESS 3.0)
add_library(cereal INTERFACE)
target_include_directories(cereal INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
install(TARGETS cereal EXPORT cereal
DESTINATION lib) # ignored
install(EXPORT cereal FILE cereal-config.cmake
DESTINATION share/cmake/cereal)
install(DIRECTORY include/cereal DESTINATION include)
endif()

if(JUST_INSTALL_CEREAL)
return()
endif()

include_directories(./include)

Expand Down
8 changes: 6 additions & 2 deletions unittests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ foreach(TEST_SOURCE ${TESTS})
## If we are on a 64-bit machine, create an extra 32-bit version of the test
#if(${CMAKE_SIZEOF_VOID_P} EQUAL 8)
# add_executable(${TEST_TARGET}_32 ${TEST_SOURCE})
# set_target_properties(${TEST_TARGET}_32 PROPERTIES
# set_target_properties(${TEST_TARGET}_32 PROPERTIES
# COMPILE_DEFINITIONS "BOOST_TEST_DYN_LINK;BOOST_TEST_MODULE=${TEST_TARGET}"
# COMPILE_FLAGS "-m32" LINK_FLAGS "-m32")
# target_link_libraries(${TEST_TARGET}_32 ${Boost_LIBRARIES})
Expand Down Expand Up @@ -66,7 +66,7 @@ foreach(TEST_SOURCE ${TESTS})

if(IS_SPECIAL_TEST EQUAL -1)
add_dependencies(coverage ${COVERAGE_TARGET})

add_executable(${COVERAGE_TARGET} EXCLUDE_FROM_ALL ${TEST_SOURCE})
set_target_properties(${COVERAGE_TARGET} PROPERTIES COMPILE_DEFINITIONS "BOOST_TEST_DYN_LINK;BOOST_TEST_MODULE=${COVERAGE_TARGET}")
set_target_properties(${COVERAGE_TARGET} PROPERTIES COMPILE_FLAGS "-coverage")
Expand All @@ -75,3 +75,7 @@ foreach(TEST_SOURCE ${TESTS})
target_link_libraries(${COVERAGE_TARGET} ${Boost_LIBRARIES})
endif()
endforeach()

if(NOT CMAKE_VERSION VERSION_LESS 3.0)
add_test(test_cmake_config_module ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake-config-module.cmake)
endif()
123 changes: 123 additions & 0 deletions unittests/cmake-config-module.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
if(CMAKE_VERSION LESS 3.0)
message(FATAL_ERROR "Cereal can't be installed with CMake < 3.0")
endif()

get_filename_component(BINARY_DIR ${CMAKE_CURRENT_LIST_DIR}/../build ABSOLUTE)
get_filename_component(INSTALL_DIR ${CMAKE_CURRENT_LIST_DIR}/../out ABSOLUTE)

# cmake configure step for cereal
file(MAKE_DIRECTORY ${BINARY_DIR}/cereal)
execute_process(
COMMAND ${CMAKE_COMMAND}
-DJUST_INSTALL_CEREAL=1
-DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}
${CMAKE_CURRENT_LIST_DIR}/..
WORKING_DIRECTORY ${BINARY_DIR}/cereal
RESULT_VARIABLE result
)
if(result)
message(FATAL_ERROR "Cereal cmake configure-step failed")
endif()

# cmake install cereal
execute_process(
COMMAND ${CMAKE_COMMAND}
--build ${BINARY_DIR}/cereal
--target install
RESULT_VARIABLE result
)
if(result)
message(FATAL_ERROR "Cereal cmake install-step failed")
endif()

# create test project sources
file(WRITE ${BINARY_DIR}/test_source/CMakeLists.txt "
cmake_minimum_required(VERSION ${CMAKE_VERSION})
project(cereal-test-config-module)
if(NOT MSVC)
if(CMAKE_VERSION VERSION_LESS 3.1)
set(CMAKE_CXX_FLAGS \"-std=c++11 \${CMAKE_CXX_FLAGS}\")
else()
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
endif()
endif()
find_package(cereal REQUIRED)
add_executable(cereal-test-config-module main.cpp)
target_link_libraries(cereal-test-config-module cereal)
enable_testing()
add_test(test-cereal-test-config-module cereal-test-config-module)
")
file(WRITE ${BINARY_DIR}/test_source/main.cpp "
#include <cereal/archives/binary.hpp>
#include <sstream>
#include <cstdlib>
struct MyData
{
int x = 0, y = 0, z = 0;
void set() { x = 1; y = 2; z = 3; }
bool is_set() const { return x == 1 && y == 2 && z == 3; }

// This method lets cereal know which data members to serialize
template<class Archive>
void serialize(Archive & archive)
{
archive( x, y, z ); // serialize things by passing them to the archive
}
};
int main()
{
std::stringstream ss; // any stream can be used

{
cereal::BinaryOutputArchive oarchive(ss); // Create an output archive

MyData m1, m2, m3;
m1.set();
m2.set();
m3.set();
oarchive(m1, m2, m3); // Write the data to the archive
}

{
cereal::BinaryInputArchive iarchive(ss); // Create an input archive

MyData m1, m2, m3;
iarchive(m1, m2, m3); // Read the data from the archive

return (m1.is_set() && m2.is_set() && m3.is_set())
? EXIT_SUCCESS : EXIT_FAILURE;
}
}"
)
file(MAKE_DIRECTORY ${BINARY_DIR}/test)
execute_process(
COMMAND ${CMAKE_COMMAND}
-DCMAKE_PREFIX_PATH=${INSTALL_DIR}
${BINARY_DIR}/test_source
WORKING_DIRECTORY ${BINARY_DIR}/test
RESULT_VARIABLE result
)
if(result)
message(FATAL_ERROR "Test cmake configure-step failed")
endif()

# cmake install cereal
execute_process(
COMMAND ${CMAKE_COMMAND}
--build ${BINARY_DIR}/test
RESULT_VARIABLE result
)
if(result)
message(FATAL_ERROR "Test cmake build-step failed")
endif()

execute_process(
COMMAND ${CMAKE_CTEST_COMMAND}
WORKING_DIRECTORY ${BINARY_DIR}/test
RESULT_VARIABLE result
)

if(result)
message(FATAL_ERROR "Test run failed")
endif()