diff --git a/CMakeLists.txt b/CMakeLists.txt index 6e0c32a22e..b5b8c34ca3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,6 +31,8 @@ option(OGRE_STATIC "Link static build of Ogre and Ogre Plugins into the binaries option(BUILD_ESMTOOL "build ESM inspector" ON) option(BUILD_LAUNCHER "build Launcher" ON) option(BUILD_MWINIIMPORTER "build MWiniImporter" ON) +option(BUILD_WITH_CODE_COVERAGE "Enable code coverage with gconv" OFF) +option(BUILD_UNITTESTS "Enable Unittests with Google C++ Unittest ang GMock frameworks" OFF) # Sound source selection option(USE_FFMPEG "use ffmpeg for sound" OFF) @@ -459,6 +461,11 @@ if (BUILD_MWINIIMPORTER) add_subdirectory( apps/mwiniimporter ) endif() +# UnitTests +if (BUILD_UNITTESTS) + add_subdirectory( apps/openmw_test_suite ) +endif() + if (WIN32) if (MSVC) if (USE_DEBUG_CONSOLE) @@ -622,3 +629,34 @@ if (APPLE) " COMPONENT Runtime) include(CPack) endif (APPLE) + +## Linux building +# paths +set(BINDIR "${CMAKE_INSTALL_PREFIX}/usr/bin" CACHE PATH "Where to install binaries") +set(DATAROOTDIR "${CMAKE_INSTALL_PREFIX}/share" CACHE PATH "Sets the root of data directories to a non-default location") +set(DATADIR "${DATAROOTDIR}/openmw" CACHE PATH "Sets the openmw data directories to a non-default location") +set(DOCDIR "${DATAROOTDIR}/doc/openmw" CACHE PATH "Sets the doc directory to a non-default location.") +set(MANDIR "${DATAROOTDIR}/man" CACHE PATH "Where to install manpages") +set(SYSCONFDIR "${CMAKE_INSTALL_PREFIX}/etc/openmw" CACHE PATH "Set config dir") +set(ICONDIR "${DATAROOTDIR}/pixmaps" CACHE PATH "Set icon dir") + +# Install binaries +INSTALL(PROGRAMS "${OpenMW_BINARY_DIR}/openmw" DESTINATION "${BINDIR}" ) +INSTALL(PROGRAMS "${OpenMW_BINARY_DIR}/omwlauncher" DESTINATION "${BINDIR}" ) +INSTALL(PROGRAMS "${OpenMW_BINARY_DIR}/esmtool" DESTINATION "${BINDIR}" ) +INSTALL(PROGRAMS "${OpenMW_BINARY_DIR}/mwiniimport" DESTINATION "${BINDIR}" ) + +# Install icon and .desktop +INSTALL(FILES "${OpenMW_SOURCE_DIR}/apps/launcher/resources/images/openmw.png" DESTINATION "${ICONDIR}") +INSTALL(FILES "${OpenMW_BINARY_DIR}/openmw.desktop" DESTINATION "${DATAROOTDIR}/applications") + +# Install global configuration files +INSTALL(FILES "${OpenMW_BINARY_DIR}/openmw.cfg.install" DESTINATION "${SYSCONFDIR}" RENAME "openmw.cfg" ) +#INSTALL(FILES "${OpenMW_BINARY_DIR}/plugins.cfg" DESTINATION "${SYSCONFDIR}" ) +INSTALL(FILES "${OpenMW_BINARY_DIR}/settings-default.cfg" DESTINATION "${SYSCONFDIR}" ) +INSTALL(FILES "${OpenMW_BINARY_DIR}/transparency-overrides.cfg" DESTINATION "${SYSCONFDIR}" ) +INSTALL(FILES "${OpenMW_BINARY_DIR}/launcher.cfg" DESTINATION "${SYSCONFDIR}" ) + +# Install resources +INSTALL(DIRECTORY "${OpenMW_BINARY_DIR}/resources" DESTINATION "${DATADIR}" ) +INSTALL(FILES "${OpenMW_BINARY_DIR}/launcher.qss" DESTINATION "${DATADIR}/resources" ) diff --git a/apps/esmtool/CMakeLists.txt b/apps/esmtool/CMakeLists.txt index af3dc090e0..bd397d554a 100644 --- a/apps/esmtool/CMakeLists.txt +++ b/apps/esmtool/CMakeLists.txt @@ -17,3 +17,8 @@ target_link_libraries(esmtool # find_library(CARBON_FRAMEWORK Carbon) # target_link_libraries(openmw ${CARBON_FRAMEWORK}) #endif (APPLE) + +if (BUILD_WITH_CODE_COVERAGE) + add_definitions (--coverage) + target_link_libraries(esmtool gcov) +endif() diff --git a/apps/launcher/CMakeLists.txt b/apps/launcher/CMakeLists.txt index ed3559fdca..2bc43db80a 100644 --- a/apps/launcher/CMakeLists.txt +++ b/apps/launcher/CMakeLists.txt @@ -100,3 +100,8 @@ else() configure_file(${CMAKE_SOURCE_DIR}/files/launcher.cfg "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/launcher.cfg") endif() + +if (BUILD_WITH_CODE_COVERAGE) + add_definitions (--coverage) + target_link_libraries(omwlauncher gcov) +endif() diff --git a/apps/mwiniimporter/CMakeLists.txt b/apps/mwiniimporter/CMakeLists.txt index 2a8c0f5fea..deab88ce28 100644 --- a/apps/mwiniimporter/CMakeLists.txt +++ b/apps/mwiniimporter/CMakeLists.txt @@ -18,3 +18,7 @@ target_link_libraries(mwiniimport components ) +if (BUILD_WITH_CODE_COVERAGE) + add_definitions (--coverage) + target_link_libraries(mwiniimport gcov) +endif() diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index a64ab1ed4f..3851529433 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -123,3 +123,8 @@ endif(APPLE) if(DPKG_PROGRAM) INSTALL(TARGETS openmw RUNTIME DESTINATION games COMPONENT openmw) endif(DPKG_PROGRAM) + +if (BUILD_WITH_CODE_COVERAGE) + add_definitions (--coverage) + target_link_libraries(openmw gcov) +endif() diff --git a/apps/openmw_test_suite/CMakeLists.txt b/apps/openmw_test_suite/CMakeLists.txt new file mode 100644 index 0000000000..cdf8bc74b0 --- /dev/null +++ b/apps/openmw_test_suite/CMakeLists.txt @@ -0,0 +1,28 @@ +# TODO: This should not be needed, check how it was done in FindGTEST +set(GMOCK_ROOT "/usr/include") +set(GMOCK_BUILD "/usr/lib") + +find_package(GTest REQUIRED) +find_package(GMock REQUIRED) + +if (GTEST_FOUND AND GMOCK_FOUND) + + include_directories(${GTEST_INCLUDE_DIRS}) + include_directories(${GMOCK_INCLUDE_DIRS}) + + file(GLOB UNITTEST_SRC_FILES + components/misc/*.cpp + ) + + source_group(apps\\openmw_test_suite FILES openmw_test_suite.cpp ${UNITTEST_SRC_FILES}) + + add_executable(openmw_test_suite openmw_test_suite.cpp ${UNITTEST_SRC_FILES}) + + target_link_libraries(openmw_test_suite ${GMOCK_BOTH_LIBRARIES} ${GTEST_BOTH_LIBRARIES}) + # Fix for not visible pthreads functions for linker with glibc 2.15 + if (UNIX AND NOT APPLE) + target_link_libraries(openmw_test_suite ${CMAKE_THREAD_LIBS_INIT}) + endif() +endif() + + diff --git a/apps/openmw_test_suite/components/misc/test_stringops.cpp b/apps/openmw_test_suite/components/misc/test_stringops.cpp new file mode 100644 index 0000000000..b125841966 --- /dev/null +++ b/apps/openmw_test_suite/components/misc/test_stringops.cpp @@ -0,0 +1,7 @@ +#include + +TEST(simple_test, dummy) +{ + EXPECT_EQ(true, true); +} + diff --git a/apps/openmw_test_suite/openmw_test_suite.cpp b/apps/openmw_test_suite/openmw_test_suite.cpp new file mode 100644 index 0000000000..0a09b3028a --- /dev/null +++ b/apps/openmw_test_suite/openmw_test_suite.cpp @@ -0,0 +1,12 @@ +#include +#include + + +int main(int argc, char** argv) { + // The following line causes Google Mock to throw an exception on failure, + // which will be interpreted by your testing framework as a test failure. + ::testing::GTEST_FLAG(throw_on_failure) = true; + ::testing::InitGoogleMock(&argc, argv); + + return RUN_ALL_TESTS(); +} \ No newline at end of file diff --git a/cmake/FindGMock.cmake b/cmake/FindGMock.cmake new file mode 100644 index 0000000000..eda7d4d72f --- /dev/null +++ b/cmake/FindGMock.cmake @@ -0,0 +1,91 @@ +# Locate the Google C++ Mocking Framework. +# +# Defines the following variables: +# +# GMOCK_FOUND - Found the Google Mocking framework +# GMOCK_INCLUDE_DIRS - Include directories +# +# Also defines the library variables below as normal +# variables. These contain debug/optimized keywords when +# a debugging library is found. +# +# GMOCK_BOTH_LIBRARIES - Both libgmock & libgmock-main +# GMOCK_LIBRARIES - libgmock +# GMOCK_MAIN_LIBRARIES - libgmock-main +# +# Accepts the following variables as input: +# +# GMOCK_ROOT - (as CMake or env. variable) +# The root directory of the gmock install prefix +# +#----------------------- +# Example Usage: +# +# enable_testing(true) +# find_package(GMock REQUIRED) +# include_directories(${GMOCK_INCLUDE_DIRS}) +# +# add_executable(foo foo.cc) +# target_link_libraries(foo ${GMOCK_BOTH_LIBRARIES}) +# +# add_test(AllTestsInFoo foo) +# + +#set (GMOCK_FOUND FALSE) + + +#set (GMOCK_ROOT $ENV{GMOCK_ROOT} CACHE PATH "Path to the gmock root directory.") +if (NOT EXISTS ${GMOCK_ROOT}) + message (FATAL_ERROR "GMOCK_ROOT does not exist.") +endif () + +#set (GMOCK_BUILD ${GMOCK_ROOT}/build CACHE PATH "Path to the gmock build directory.") +if (NOT EXISTS ${GMOCK_BUILD}) + message (FATAL_ERROR "GMOCK_BUILD does not exist.") +endif () + +# Find the include directory +find_path(GMOCK_INCLUDE_DIRS gmock/gmock.h + HINTS + $ENV{GMOCK_ROOT}/include + ${GMOCK_ROOT}/include +) +mark_as_advanced(GMOCK_INCLUDE_DIRS) + +function(_gmock_find_library _name) + find_library(${_name} + NAMES ${ARGN} + HINTS + $ENV{GMOCK_BUILD} + ${GMOCK_BUILD} + ) + mark_as_advanced(${_name}) +endfunction() + +# Find the gmock libraries +if (MSVC) + _gmock_find_library (GMOCK_LIBRARIES_DEBUG gmock ${GMOCK_BUILD}/Debug) + _gmock_find_library (GMOCK_LIBRARIES_RELEASE gmock ${GMOCK_BUILD}/Release) + _gmock_find_library (GMOCK_MAIN_LIBRARIES_DEBUG gmock_main ${GMOCK_BUILD}/Debug) + _gmock_find_library (GMOCK_MAIN_LIBRARIES_RELEASE gmock_main ${GMOCK_BUILD}/Release) + set (GMOCK_LIBRARIES + debug ${GMOCK_LIBRARIES_DEBUG} + optimized ${GMOCK_LIBRARIES_RELEASE} + ) + set (GMOCK_MAIN_LIBRARIES + debug ${GMOCK_MAIN_LIBRARIES_DEBUG} + optimized ${GMOCK_MAIN_LIBRARIES_RELEASE} + ) +else () + _gmock_find_library (GMOCK_LIBRARIES gmock ${GMOCK_BUILD}) + _gmock_find_library (GMOCK_MAIN_LIBRARIES gmock_main ${GMOCK_BUILD} ${GMOCK_BUILD}/Debug) +endif () + +FIND_PACKAGE_HANDLE_STANDARD_ARGS(GMock DEFAULT_MSG GMOCK_LIBRARIES GMOCK_INCLUDE_DIRS GMOCK_MAIN_LIBRARIES) + +if(GMOCK_FOUND) + set(GMOCK_INCLUDE_DIRS ${GMOCK_INCLUDE_DIR}) + set(GMOCK_BOTH_LIBRARIES ${GMOCK_LIBRARIES} ${GMOCK_MAIN_LIBRARIES}) +endif() + +