cmake_minimum_required (VERSION 2.8)

IF (NOT ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} LESS 3.1)
  cmake_policy(SET CMP0054 OLD)
ENDIF ()

project (lib3MF)

# Define Version
set(LIB3MF_VERSION_MAJOR 1)				# increase on every backward-compatibility breaking change of the API
set(LIB3MF_VERSION_MINOR 1)				# increase on every backward compatible change of the API
set(LIB3MF_VERSION_MICRO 5)				# increase on on every change that does not alter the API

set(CMAKE_INSTALL_BINDIR bin CACHE PATH "directory for installing binary files")
set(CMAKE_INSTALL_LIBDIR lib CACHE PATH "directory for installing library files")
set(CMAKE_INSTALL_INCLUDEDIR include/lib3mf CACHE PATH "directory for installing header files")

set(NMR_COM_NATIVE FALSE) # by default, do not actually implement a COM interface
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
  # using GCC
  add_definitions(-DBUILD_DLL)
  add_compile_options(-Wall)
  SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -O2")
elseif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
  # using GCC
  add_definitions(-DBUILD_DLL)
  add_compile_options(-Wall) 
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -O2")
  set(CMAKE_MACOSX_RPATH ON)
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
  # using Visual Studio C++
  add_definitions(-DBUILD_DLL -DLIB3MF_EXPORTS /W3)
  SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} xmllite.lib")
  add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS)
  if(NMR_COM_NATIVE)
	add_definitions(-DNMR_COM_NATIVE)
  endif()
  
  string(REGEX REPLACE "/bin/[^/]*$" "" VCINSTALLDIR "${CMAKE_C_COMPILER}")
  message(STATUS "Guessed MSVC directory: ${VCINSTALLDIR}")
  link_directories ("${VCINSTALLDIR}/../../../UnitTest/lib")
endif()

configure_file("${CMAKE_CURRENT_SOURCE_DIR}/Include/Model/COM/NMR_COMVersion.h.in" "${CMAKE_CURRENT_BINARY_DIR}/Include/Model/COM/NMR_COMVersion.h")

include(Source/CMakeLists.txt)

if (WIN32)
	SET(SRCS_MAIN_PLATFORM
	"${SRCS_WIN_MAIN}"
	)
else()
	# Linux and MAC
	SET(SRCS_MAIN_PLATFORM
	"${SRCS_UNIX_MAIN}"
	)
endif()


#########################################################
# Set version info
if(DEFINED ENV{BUILD_NUMBER})
	set(BUILD_NUMBER $ENV{BUILD_NUMBER})
else()
	set(BUILD_NUMBER 0)
endif()

if (WIN32)
	message("BUILD_NUMBER ... " ${BUILD_NUMBER})
	set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/Release/VersionInfo)
	
	include(generate_product_version)
	generate_product_version(
	   VERSION_FILES_OUTPUTLOCATION
	   NAME "lib3MF"
	   FILE_DESCRIPTION "Lib3MF is the reference-implementation of the 3D Manufacturing Format file standard"
	   BUNDLE "3MF Consortium"
	   VERSION_MAJOR ${LIB3MF_VERSION_MAJOR}
	   VERSION_MINOR ${LIB3MF_VERSION_MINOR}
	   VERSION_PATCH ${LIB3MF_VERSION_MICRO}
	   VERSION_REVISION ${BUILD_NUMBER}
	   PRODUCT_VERSION_MAJOR ${LIB3MF_VERSION_MAJOR}
	   PRODUCT_VERSION_MINOR ${LIB3MF_VERSION_MINOR}
	   PRODUCT_VERSION_PATCH ${LIB3MF_VERSION_MICRO}
	   COMPANY_NAME "3MF Consortium"
	)
	message("VERSION_FILES_OUTPUTLOCATION ... " ${VERSION_FILES_OUTPUTLOCATION})
else()
	set(VERSION_FILES_OUTPUTLOCATION "")
endif()


#########################################################
# Static library (as base for other targets)
add_library(${PROJECT_NAME}_s STATIC ${SRCS_MAIN_PLATFORM} ${SRCS_COMMON})
target_include_directories(${PROJECT_NAME}_s PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/Include)
target_include_directories(${PROJECT_NAME}_s PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/Include)
SET_TARGET_PROPERTIES(${PROJECT_NAME}_s PROPERTIES PREFIX "" IMPORT_PREFIX "")
if (UNIX)
	target_compile_options(${PROJECT_NAME}_s PUBLIC "-fPIC")
	# Uncomment the following to but the version info into the .so-file.
	SET_TARGET_PROPERTIES(${PROJECT_NAME}_s PROPERTIES VERSION "${LIB3MF_VERSION_MAJOR}.${LIB3MF_VERSION_MINOR}.${LIB3MF_VERSION_MICRO}.${BUILD_NUMBER}")
	SET_TARGET_PROPERTIES(${PROJECT_NAME}_s PROPERTIES SOVERSION "${LIB3MF_VERSION_MAJOR}")
	if (NOT APPLE)
		SET_TARGET_PROPERTIES(${PROJECT_NAME}_s PROPERTIES LINK_FLAGS -s)
	endif()
	find_library(LIBUUID_PATH uuid)
	if(NOT LIBUUID_PATH)
		message(FATAL_ERROR "libuuid not found")
	endif()
	target_link_libraries(${PROJECT_NAME}_s ${LIBUUID_PATH})
else()
	# wd4996 masks the deprecated-warning
	target_compile_options(${PROJECT_NAME}_s PUBLIC "$<$<CONFIG:DEBUG>:/Od;/Ob0;/Gm;/sdl;/W3;/WX;/FC;/wd4996>")
	target_compile_options(${PROJECT_NAME}_s PUBLIC "$<$<CONFIG:RELEASE>:/O2;/sdl;/WX;/Oi;/Gy;/FC;/wd4996>")
endif()


#########################################################
# Shared library
add_library(${PROJECT_NAME} SHARED ${SRCS_MAIN_PLATFORM}
	"./Source/Model/COM/NMR_DLLInterfaces.cpp"
	${VERSION_FILES_OUTPUTLOCATION}
)
set(STARTUPPROJECT ${PROJECT_NAME})
SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES PREFIX "" IMPORT_PREFIX "")
target_link_libraries(${PROJECT_NAME} ${PROJECT_NAME}_s)
if (UNIX)
	# Uncomment the following to but the version info into the .so-file.
	SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES VERSION "${LIB3MF_VERSION_MAJOR}.${LIB3MF_VERSION_MINOR}.${LIB3MF_VERSION_MICRO}.${BUILD_NUMBER}")
	SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES SOVERSION "${LIB3MF_VERSION_MAJOR}")
endif()
install(TARGETS ${PROJECT_NAME}
	ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
	LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
	RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
install(DIRECTORY Include/Model DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
install(DIRECTORY Include/Common DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/Include/ DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")

#########################################################
if(NOT DEFINED LIB3MF_TESTS)
	set(LIB3MF_TESTS TRUE)
endif()
message("LIB3MF_TESTS ... " ${LIB3MF_TESTS})
if(LIB3MF_TESTS)
	# platform independent tests on the C-interface of the library
	add_subdirectory(UnitTests)
	
	# windows specific tests
	if (WIN32)
		SET(UNITTEST_NAME "${PROJECT_NAME}unittests")
		add_library(${UNITTEST_NAME} SHARED "${SRCS_WIN_MANAGEDTEST}")
		target_include_directories(${UNITTEST_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/Include)
		target_include_directories(${UNITTEST_NAME} PUBLIC "${VCINSTALLDIR}/../../../UnitTest/include")
		target_include_directories(${UNITTEST_NAME} PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/Include)
	
		target_compile_options(${UNITTEST_NAME} PUBLIC "$<$<CONFIG:DEBUG>:/Od;/Ob0;/Gm;/sdl;/W3;/WX;/FC;-DNMR_USEASSERTIONS;-DNMR_UNITTESTS;/wd4996>")
		target_compile_options(${UNITTEST_NAME} PUBLIC "$<$<CONFIG:RELEASE>:/O2;/sdl;/WX;/Oi;/Gy;/FC;/wd4996>")
		
		add_dependencies(${UNITTEST_NAME} ${PROJECT_NAME}_s)
		target_link_libraries(${UNITTEST_NAME} ${PROJECT_NAME}_s)
		
		file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/TestOutput")
	endif()
endif()


if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
	IF(${CMAKE_VERSION} VERSION_LESS 3.6.3)
		MESSAGE ("Note: You need to manually select a StartUp-project in Visual Studio.")
	ELSE()
		set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT ${STARTUPPROJECT})
	ENDIF()
endif()