#-----------------------------------------------------------------
# CMake file for the MRPT C++ library
#  Run with "cmake ." at the root directory
#
#  October 2007, Jose Luis Blanco <jlblanco@ctima.uma.es>
#-----------------------------------------------------------------

PROJECT(mrpt-core)

#MESSAGE(STATUS "Makefile for: mrpt-core C++ LIBRARY ")

# ---------------------------------------------
# TARGET: The MRPT-CORE C++ library
# ---------------------------------------------
# List of C++ files:
SET(mrpt_lib_srcs "")
SET(mrpt_lib_hdrs "")

# -----------------------------------------------------------
# A macro to add files to the project and at the same time
#  divide them into IDE's solution folders, if applicable.
# -----------------------------------------------------------
MACRO(ADD_MRPT_CORE_SOURCES dir)
	# The .cpp files:
	FILE(GLOB aux_srcs1 ${dir}/*.cpp)
	FILE(GLOB aux_srcs2 ${dir}/*.c)
	FILE(GLOB aux_srcs3 ${dir}/*.h)
	SET(aux_srcs ${aux_srcs1} ${aux_srcs2} ${aux_srcs3})
#	AUX_SOURCE_DIRECTORY(${dir} aux_srcs)
	SET(mrpt_lib_srcs ${mrpt_lib_srcs} ${aux_srcs})
	SOURCE_GROUP("${dir}" FILES ${aux_srcs})

	# The corresponding .h files:
	FILE(GLOB aux_hdrs ${CMAKE_SOURCE_DIR}/include/mrpt/${dir}/*.h)
	SOURCE_GROUP("${dir}" FILES ${aux_hdrs})
	SET(mrpt_lib_hdrs ${mrpt_lib_hdrs} ${aux_hdrs})
ENDMACRO(ADD_MRPT_CORE_SOURCES)

# Global files:
AUX_SOURCE_DIRECTORY(. mrpt_lib_srcs)
FILE(GLOB aux_hdrs_1 ${CMAKE_SOURCE_DIR}/include/mrpt/*.h)
SET(mrpt_lib_srcs ${mrpt_lib_srcs} ${aux_hdrs_1})

ADD_MRPT_CORE_SOURCES(bayes)
ADD_MRPT_CORE_SOURCES(compress)
ADD_MRPT_CORE_SOURCES(gui)
ADD_MRPT_CORE_SOURCES(math)
ADD_MRPT_CORE_SOURCES(opengl)
ADD_MRPT_CORE_SOURCES(poses)
ADD_MRPT_CORE_SOURCES(random)
ADD_MRPT_CORE_SOURCES(scan_matching)
ADD_MRPT_CORE_SOURCES(slam)
ADD_MRPT_CORE_SOURCES(synch)
ADD_MRPT_CORE_SOURCES(system)
ADD_MRPT_CORE_SOURCES(utils)
ADD_MRPT_CORE_SOURCES(utils/simpleini)
ADD_MRPT_CORE_SOURCES(utils/xmlparser)
ADD_MRPT_CORE_SOURCES(vision)
ADD_MRPT_CORE_SOURCES(topography)

# Embedded version of libjpeg for (mostly) Windows:
IF (CMAKE_MRPT_HAS_JPEG AND NOT CMAKE_MRPT_HAS_JPEG_SYSTEM)
	ADD_MRPT_CORE_SOURCES(utils/jpeglib)
ENDIF (CMAKE_MRPT_HAS_JPEG AND NOT CMAKE_MRPT_HAS_JPEG_SYSTEM)

# Embedded version of freeglut-2.4.0 for Windows:
IF (WIN32)
	ADD_MRPT_CORE_SOURCES(opengl/freeglut-2.4.0)
ENDIF (WIN32)

# Sift-hess sources:
#SET(aux_srcs
#	"${CMAKE_SOURCE_DIR}/src/core/vision/sift-hess/imgfeatures.c"
#	"${CMAKE_SOURCE_DIR}/src/core/vision/sift-hess/sift.c"
#	"${CMAKE_SOURCE_DIR}/src/core/vision/sift-hess/utils.c")
#SET(mrpt_lib_srcs ${mrpt_lib_srcs} ${aux_srcs})
#SOURCE_GROUP("vision/sift-hess" FILES ${aux_srcs})
#FILE(GLOB phdrs_ignore "${MRPT_SOURCE_DIR}/src/core/vision/sift-hess/*.c*")
#set_source_files_properties(${phdrs_ignore} PROPERTIES COMPILE_FLAGS "/wd4244")
	
# List of .H files:
FILE(GLOB_RECURSE mrpt_lib_hdrs1 ${CMAKE_SOURCE_DIR}/include/doc_files/*.h)
SET(mrpt_lib_hdrs ${mrpt_lib_hdrs} ${mrpt_lib_hdrs1})

# Only if compiling with WXWIDGETS, also add the wxMathPlot library:
# ----------------------------------------------------------------------------------
IF(CMAKE_MRPT_HAS_WXWIDGETS)
	SET(mrpt_lib_srcs ${mrpt_lib_srcs} "${CMAKE_SOURCE_DIR}/otherlibs/mathplot/mathplot.cpp")
	SET(mrpt_lib_hdrs ${mrpt_lib_hdrs} "${CMAKE_SOURCE_DIR}/include/mrpt/otherlibs/mathplot/mathplot.h")
ENDIF(CMAKE_MRPT_HAS_WXWIDGETS)


# Remove _LIN files when compiling under Windows, and _WIN files when compiling under Linux.
# ----------------------------------------------------------------------------------
SET(aux_var "")
FOREACH(FIL ${mrpt_lib_srcs})
	SET(THIS_COUNTS 1)
	IF(${FIL} MATCHES ".*_LIN.cpp")
		IF(WIN32)
			SET(THIS_COUNTS 0)
		ENDIF(WIN32)
	ENDIF(${FIL} MATCHES ".*_LIN.cpp")

	IF(${FIL} MATCHES ".*_WIN.cpp")
		IF(UNIX)
			SET(THIS_COUNTS 0)
		ENDIF(UNIX)
	ENDIF(${FIL} MATCHES ".*_WIN.cpp")

	IF(THIS_COUNTS)
		SET(aux_var "${aux_var}" "${FIL}")
	ENDIF(THIS_COUNTS)
ENDFOREACH(FIL)
SET(mrpt_lib_srcs ${aux_var})

# ----------------------------------------------------------------------------------
# 				Define the MRPT C++ library target:
# ----------------------------------------------------------------------------------
ADD_LIBRARY(mrpt-core ${mrpt_lib_srcs} ${mrpt_lib_hdrs})

SET_TARGET_PROPERTIES(mrpt-core PROPERTIES PROJECT_LABEL lib-mrpt-core)

# The target file will have "-dbg" for DEBUG:
# ----------------------------------------------------------------------------------
SET(the_trg mrpt-core)

# For dynamic link numbering convenions in Linux:
SET_TARGET_PROPERTIES(${the_trg} PROPERTIES 
	OUTPUT_NAME ${MRPT_LIB_PREFIX}${the_trg}
	ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib/"
	RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/"
	VERSION "${CMAKE_MRPT_VERSION_NUMBER_MAJOR}.${CMAKE_MRPT_VERSION_NUMBER_MINOR}.${CMAKE_MRPT_VERSION_NUMBER_PATCH}"
	SOVERSION ${CMAKE_MRPT_VERSION_NUMBER_MAJOR}.${CMAKE_MRPT_VERSION_NUMBER_MINOR}
	)

# Add the required libraries for linking:
TARGET_LINK_LIBRARIES(mrpt-core ${MRPTLIB_LINKER_LIBS})

# Link against wx libs (for dlls only):
IF(BUILD_SHARED_LIBS)
		TARGET_LINK_LIBRARIES(mrpt-core ${wxWidgets_LIBRARIES})
ENDIF(BUILD_SHARED_LIBS)

# Dependencies of the MRPT library:
ADD_DEPENDENCIES(mrpt-core mrpt-ann)
ADD_DEPENDENCIES(mrpt-core mrpt-3ds)
ADD_DEPENDENCIES(mrpt-core mrpt-sift-hess)

IF (NOT CMAKE_MRPT_HAS_WXWIDGETS AND CMAKE_MRPT_HAS_ZLIB AND NOT CMAKE_MRPT_HAS_ZLIB_SYSTEM)
	ADD_DEPENDENCIES(mrpt-core mrpt-zlib)
ENDIF (NOT CMAKE_MRPT_HAS_WXWIDGETS AND CMAKE_MRPT_HAS_ZLIB AND NOT CMAKE_MRPT_HAS_ZLIB_SYSTEM)

#IF (CMAKE_MRPT_HAS_JPEG AND NOT CMAKE_MRPT_HAS_JPEG_SYSTEM)
#	ADD_DEPENDENCIES(mrpt-core mrpt-jpeg)
#ENDIF (CMAKE_MRPT_HAS_JPEG AND NOT CMAKE_MRPT_HAS_JPEG_SYSTEM)

# This indicates we are compiling the libmrpt-core project (for internal use of precomp. headers)
ADD_DEFINITIONS(-DMRPT_IS_BUILDING_LIBMRPT_CORE)

# --------------------------------------------
#     Add precompiled headers options
# --------------------------------------------
IF(MRPT_ENABLE_PRECOMPILED_HDRS)
	# --------------------------------------
	# Precompiled hdrs for MSVC:
	# --------------------------------------
	IF (MSVC)
		# Symbol used in precomp_core.h
		ADD_DEFINITIONS(-DMRPT_CORE_USE_PRECOMPILED_HEADER)

		# The "use precomp.headr" for all the files...
		set_target_properties(mrpt-core
			PROPERTIES
			COMPILE_FLAGS "/Yumrpt/precomp_core.h")

		# But for the file "registerAllClasses.cpp", used to build the precomp. header:
		set_source_files_properties("${CMAKE_SOURCE_DIR}/src/core/registerAllClasses.cpp"
			PROPERTIES
			COMPILE_FLAGS "/Ycmrpt/precomp_core.h")

		# ignore precompiled headers in non-mrpt sources:
		FILE(GLOB phdrs_ignore "${MRPT_SOURCE_DIR}/src/core/utils/jpeglib/*.cpp")
		set_source_files_properties(${phdrs_ignore} PROPERTIES COMPILE_FLAGS "/Y- /wd4267")

		FILE(GLOB phdrs_ignore "${MRPT_SOURCE_DIR}/src/core/utils/simpleini/*.c*")
		set_source_files_properties(${phdrs_ignore} PROPERTIES COMPILE_FLAGS "/Y-")

		FILE(GLOB phdrs_ignore "${MRPT_SOURCE_DIR}/src/core/utils/xmlparser/*.cpp")
		set_source_files_properties(${phdrs_ignore} PROPERTIES COMPILE_FLAGS "/Y-")

		FILE(GLOB phdrs_ignore "${MRPT_SOURCE_DIR}/src/core/opengl/freeglut-2.4.0/*.c")
		set_source_files_properties(${phdrs_ignore} PROPERTIES COMPILE_FLAGS "/Y- /DFREEGLUT_STATIC /D_LIB /wd4244 /wd4267 /wd4311")

		
#		FILE(GLOB phdrs_ignore "${MRPT_SOURCE_DIR}/src/core/vision/sift-hess/*.c*")
#		set_source_files_properties(${phdrs_ignore} PROPERTIES COMPILE_FLAGS "/Y- /wd4244")

		set_source_files_properties("${CMAKE_SOURCE_DIR}/otherlibs/mathplot/mathplot.cpp" PROPERTIES COMPILE_FLAGS "/Y-")

	ENDIF (MSVC)

	# --------------------------------------
	# Precompiled hdrs for GCC
	# --------------------------------------
	IF(CMAKE_COMPILER_IS_GNUCXX)
		# Symbol used in precomp_core.h

		SET(PCH_HDR_FILE "${MRPT_SOURCE_DIR}/include/mrpt/precomp_core.h")

if(0)
		SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${MRPT_BINARY_DIR}/src/core/ -Winvalid-pch")

		#GET_TARGET_PROPERTY(MRPT_CORE_MY_CFLAGS mrpt-core COMPILE_FLAGS)
		#MESSAGE(flags: ${MRPT_CORE_MY_CFLAGS} ${CMAKE_CXX_FLAGS} ${CMAKE_C_FLAGS} )

		SET(CMAKE_MODULE_PATH "${MRPT_SOURCE_DIR}/cmakemodules" ${CMAKE_MODULE_PATH})
		INCLUDE(PCHSupport_26)

		ADD_PRECOMPILED_HEADER(mrpt-core ${PCH_HDR_FILE} mrpt)
endif(0)

if(0)
		# The target .gch header:
		GET_FILENAME_COMPONENT(_name ${PCH_HDR_FILE} NAME)
		GET_FILENAME_COMPONENT(_path ${PCH_HDR_FILE} PATH)
		SET(_outdir "${CMAKE_CURRENT_BINARY_DIR}/pch/${_name}.gch")


		IF(CMAKE_BUILD_TYPE)
			SET(_output "${_outdir}/${CMAKE_BUILD_TYPE}.c++")
		ELSE(CMAKE_BUILD_TYPE)
			SET(_output "${_outdir}/${_name}.c++")
		ENDIF(CMAKE_BUILD_TYPE)

		ADD_CUSTOM_COMMAND(
			OUTPUT	"${_outdir}"
			COMMAND "${CMAKE_COMMAND}" -E make_directory "${_outdir}"
			)

		ADD_CUSTOM_COMMAND(
			OUTPUT	"${CMAKE_CURRENT_BINARY_DIR}/pch/${_name}"
			COMMAND "${CMAKE_COMMAND}" -E copy "${PCH_HDR_FILE}" "${CMAKE_CURRENT_BINARY_DIR}/pch/${_name}"
			)

		# Build flags string without quotes:
		MESSAGE(STATUS "Creating pch:" )
		MESSAGE(STATUS "${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS} -x c++-header -o ${_output} ${PCH_HDR_FILE}" )
		execute_process(
			COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS} -x c++-header -o ${_output} ${PCH_HDR_FILE}
			)

#		ADD_CUSTOM_COMMAND(
#			OUTPUT "${_output}"
#			COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS} -x c++-header -o ${_output} ${PCH_HDR_FILE}
#			DEPENDS "${PCH_HDR_FILE}" "${_outdir}"
#			)

		ADD_CUSTOM_TARGET(mrpt-core_pch
			DEPENDS	${_output}
			)

		ADD_DEPENDENCIES(mrpt-core mrpt-core_pch )

		SET_TARGET_PROPERTIES(${mrpt-core}
			PROPERTIES
			COMPILE_FLAGS "-include ${PCH_HDR_FILE} -Winvalid-pch"
			)

		# Required:
		INCLUDE_DIRECTORIES(BEFORE "${CMAKE_CURRENT_BINARY_DIR}/pch/")
endif(0)

	ENDIF(CMAKE_COMPILER_IS_GNUCXX)

ENDIF(MRPT_ENABLE_PRECOMPILED_HDRS)

INSTALL(TARGETS mrpt-core
	RUNTIME DESTINATION ${libmrpt_INSTALL_PREFIX}bin
	LIBRARY DESTINATION ${libmrpt_INSTALL_PREFIX}lib${LIB_SUFFIX}
	ARCHIVE DESTINATION ${libmrpt_INSTALL_PREFIX}lib${LIB_SUFFIX}
    )

