#*******************************************************************************
#**  This file is part of Qt Mocks.                                          ***
#**                                                                          ***
#**  Copyright (C) 2018, 2019, 2020, 2021                                    ***
#**  John Schneiderman <Licencing _AT_ Schneiderman _DOT_ me>                ***
#**                                                                          ***
#**  This program is free software: you can redistribute it and/or modify it ***
#**  under the terms of the GNU Lesser General Public License as published   ***
#**  by the Free Software Foundation, either version 3 of the License, or    ***
#**  (at your option) any later version.                                     ***
#**                                                                          ***
#**  This program is distributed in the hope that it will be useful, but     ***
#**  WITHOUT ANY WARRANTY; without even the implied warranty of              ***
#**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.                    ***
#**  See the GNU Lesser General Public License for more details.             ***
#**                                                                          ***
#**  You should have received a copy of the GNU Lesser General Public License***
#**  along with this program. If not, see <http://www.gnu.org/licenses/>.    ***
#*******************************************************************************
cmake_minimum_required(VERSION 3.13 FATAL_ERROR)
project(
	qt-mocks
	DESCRIPTION ${Qt-Mocks_DESCRIPTION}
	VERSION ${Qt-Mocks_VERSION}
	LANGUAGES CXX
)

configure_file(
	"${CMAKE_CURRENT_SOURCE_DIR}/config.hpp.in"
	"${PROJECT_BINARY_DIR}/internal/config.hpp"
)

find_package(Qt5
	REQUIRED
	COMPONENTS
		Core
		Test
)

set(${PROJECT_NAME}_PUBLIC_DECLARATIONS
	external/${PROJECT_NAME}/Matchers.h
	external/${PROJECT_NAME}/Mock.hpp
	external/${PROJECT_NAME}/Information.h
	external/${PROJECT_NAME}/Output.h
	external/${PROJECT_NAME}/Verify.hpp
	"${PROJECT_BINARY_DIR}/${PROJECT_NAME}_export.h"
)
set(${PROJECT_NAME}_PUBLIC_DEFINITIONS
	external/${PROJECT_NAME}/Matchers.cpp
	external/${PROJECT_NAME}/Mock.hpp
	external/${PROJECT_NAME}/Information.cpp
	external/${PROJECT_NAME}/Output.cpp
	external/${PROJECT_NAME}/Verify.hpp
	"${PROJECT_BINARY_DIR}/${PROJECT_NAME}_export.h"
)
set(${PROJECT_NAME}_PRIVATE_DECLARATIONS
	internal/config.hpp
)
set(${PROJECT_NAME}_PRIVATE_DEFINITIONS
	internal/config.hpp
)

add_library(${PROJECT_NAME}
	${Qt-Mocks_LIBRARY_TYPE}
	${${PROJECT_NAME}_PUBLIC_DEFINITIONS}
	${${PROJECT_NAME}_PRIVATE_DEFINITIONS}
	${${PROJECT_NAME}_PUBLIC_DECLARATIONS}
	${${PROJECT_NAME}_PRIVATE_DECLARATIONS}
)
target_include_directories(${PROJECT_NAME}
	PUBLIC
		$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/external>
	PRIVATE
		$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
		$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}>
		$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/external/${PROJECT_NAME}>
)
target_link_libraries(${PROJECT_NAME} PUBLIC Qt5::Core)
target_link_libraries(${PROJECT_NAME} PUBLIC Qt5::Test)

set_target_properties(${PROJECT_NAME} PROPERTIES
	VERSION ${PROJECT_VERSION}
	SOVERSION ${PROJECT_VERSION_MAJOR}
	LINKER_LANGUAGE CXX
	COMPATIBLE_INTERFACE_STRING ${PROJECT_VERSION_MAJOR}
)
set_property(TARGET ${PROJECT_NAME} PROPERTY INTERFACE_${PROJECT_NAME}_MAJOR_VERSION ${PROJECT_VERSION_MAJOR})

include(GenerateExportHeader)
generate_export_header(${PROJECT_NAME})

if (Qt-Mocks_ENABLE_TESTS)
	add_subdirectory(unit-tests)
endif (Qt-Mocks_ENABLE_TESTS)

install(
	TARGETS ${PROJECT_NAME}
	EXPORT ${PROJECT_NAME}Targets
	RUNTIME DESTINATION bin
	LIBRARY DESTINATION ${Qt-Mocks_LIBRARY_INSTALL_DIR}
	ARCHIVE DESTINATION ${Qt-Mocks_LIBRARY_INSTALL_DIR}
	INCLUDES DESTINATION include
)
install(
	FILES ${${PROJECT_NAME}_PUBLIC_DECLARATIONS}
	DESTINATION include/${PROJECT_NAME}
)
if (WIN32 AND Qt-Mocks_BUILD_SHARED_LIBRARY)
	install(
		FILES $<TARGET_PDB_FILE:${PROJECT_NAME}>
		DESTINATION bin
	)
endif(WIN32 AND Qt-Mocks_BUILD_SHARED_LIBRARY)

include(CMakePackageConfigHelpers)
write_basic_package_version_file(
	${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}Version.cmake
	VERSION ${PROJECT_VERSION}
	COMPATIBILITY SameMajorVersion
)
export(EXPORT ${PROJECT_NAME}Targets
	FILE ${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}Targets.cmake
)
configure_file(
	${PROJECT_NAME}Config.cmake.in
	"${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}Config.cmake"
	@ONLY
)
install(
	EXPORT ${PROJECT_NAME}Targets
	FILE ${PROJECT_NAME}Targets.cmake
	DESTINATION ${Qt-Mocks_LIBRARY_INSTALL_DIR}/cmake/${PROJECT_NAME}
)
install(
	FILES
		${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}Config.cmake
		${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}Version.cmake
	DESTINATION ${Qt-Mocks_LIBRARY_INSTALL_DIR}/cmake/${PROJECT_NAME}
)

if(NOT TARGET uninstall)
	configure_file(
		"${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
		"${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
		IMMEDIATE @ONLY
	)

	add_custom_target(
		uninstall
		COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake
	)
endif()

set(CPACK_PACKAGE_VENDOR "John M. Schneiderman")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY ${Qt-Mocks_DESCRIPTION})
set(CPACK_PACKAGE_INSTALL_DIRECTORY "Qt-Mocks")
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING")
include(CPack)
