view CMakeLists.txt @ 418:30e4a93f86c7

Pet doxygen a bit
author David Demelier <markand@malikania.fr>
date Thu, 08 Oct 2015 10:07:47 +0200
parents f16164e720ba
children cee5c74c1c83
line wrap: on
line source

#
# CMakeLists.txt -- code building for common code
#
# Copyright (c) 2013-2015 David Demelier <markand@malikania.fr>
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#

#
# This CMakeLists build system is primarily used for testing all
# modules.
#
cmake_minimum_required(VERSION 3.0)
project(code)

set(CMAKE_MODULE_PATH ${code_SOURCE_DIR}/cmake)

include(CMakeParseArguments)

add_subdirectory(extern)
add_subdirectory(tools)

enable_testing()

macro(define_module)
	set(oneValueArgs TARGET NAME DIRECTORY)
	set(multiValueArgs SOURCES RESOURCES LIBRARIES INCLUDES)

	cmake_parse_arguments(MOD "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})

	if (NOT MOD_TARGET)
		message(FATAL_ERROR "Argument TARGET not set")
	elseif (NOT MOD_NAME)
		message(FATAL_ERROR "Argument NAME not set")
	elseif (NOT MOD_DIRECTORY)
		message(FATAL_ERROR "Argument DIRECTORY not set")
	endif ()

	string(TOUPPER ${MOD_NAME} optionname)

	# Create the option for enabling the test
	option(WITH_${optionname} "Enable ${MOD_NAME}" On)

	if (WITH_${optionname})
		# Add the test executable
		set(MAIN ${code_SOURCE_DIR}/C++/tests/${MOD_DIRECTORY}/main.cpp)

		if (NOT EXISTS ${MAIN})
			message(FATAL_ERROR "${MAIN} file does not exists")
		endif ()

		add_executable(${MOD_TARGET} ${MOD_SOURCES} ${MOD_RESOURCES} ${MAIN})
		add_test(${MOD_TARGET}-test ${MOD_TARGET})
		target_include_directories(
			${MOD_TARGET}
			PRIVATE
				${code_SOURCE_DIR}/C++
				${code_SOURCE_DIR}/C++/modules/${MOD_DIRECTORY}
				${MOD_INCLUDES}
		)
		target_link_libraries(${MOD_TARGET} gtest ${MOD_LIBRARIES})

		# Copy optional resources
		if (MOD_RESOURCES)
			foreach (res ${MOD_RESOURCES})
				get_filename_component(inputname ${res} NAME)
				set(output ${CMAKE_BINARY_DIR}/${MOD_DIRECTORY}/${inputname})
				list(APPEND outputlist ${output})

				add_custom_command(
					OUTPUT ${output}
					COMMENT "Copying ${inputname}"
					DEPENDS ${res}
					COMMAND ${CMAKE_COMMAND} -E copy ${res} ${output}
				)
			endforeach()

			add_custom_target(${MOD_TARGET}-resources DEPENDS ${outputlist})
			add_dependencies(${MOD_TARGET} ${MOD_TARGET}-resources)
		endif ()
	endif ()
endmacro()

# Optional
find_package(Jansson)
find_package(OpenSSL)
find_package(ZIP)

# Doxygen target
find_package(Doxygen)

if (DOXYGEN_FOUND)
	configure_file(
		${CMAKE_SOURCE_DIR}/cmake/Doxyfile.in
		${CMAKE_BINARY_DIR}/Doxyfile
	)

	add_custom_target(
		doxygen ALL
		COMMENT "Generating doxygen documentation"
		COMMAND ${DOXYGEN_EXECUTABLE} Doxyfile
		WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
		VERBATIM
	)
endif ()

# ---------------------------------------------------------
# Base64
# ---------------------------------------------------------

define_module(
	TARGET base64
	NAME Base64
	DIRECTORY Base64
	SOURCES
		${code_SOURCE_DIR}/C++/modules/Base64/Base64.cpp
		${code_SOURCE_DIR}/C++/modules/Base64/Base64.h
)

# ---------------------------------------------------------
# Converter
# ---------------------------------------------------------

# No tests yet

# ---------------------------------------------------------
# Directory
# ---------------------------------------------------------

define_module(
	TARGET directory
	NAME Directory
	DIRECTORY Directory
	SOURCES
		${code_SOURCE_DIR}/C++/modules/Directory/Directory.cpp
		${code_SOURCE_DIR}/C++/modules/Directory/Directory.h
)

# ---------------------------------------------------------
# Dynlib
# ---------------------------------------------------------

if (WIN32)
	set(EXTENSION ".dll")
elseif (UNIX)
	set(EXTENSION ".so")
elseif (APPLE)
	set(EXTENSION ".dylib")
else ()
	message(FATAL_ERROR "Unsupported platform")
endif ()

define_module(
	TARGET dynlib
	NAME Dynlib
	DIRECTORY Dynlib
	SOURCES
		${code_SOURCE_DIR}/C++/modules/Dynlib/Dynlib.cpp
		${code_SOURCE_DIR}/C++/modules/Dynlib/Dynlib.h
)

if (WITH_DYNLIB)
	if (CMAKE_SYSTEM_NAME MATCHES "Linux")
		target_link_libraries(dynlib dl)
	endif ()

	target_compile_definitions(dynlib PRIVATE EXTENSION=\"${EXTENSION}\")

	add_library(dynlib-plugin MODULE ${code_SOURCE_DIR}/C++/tests/Dynlib/Plugin.cpp)
	set_target_properties(dynlib-plugin PROPERTIES PREFIX "")
	target_include_directories(dynlib-plugin PRIVATE ${code_SOURCE_DIR}/C++/modules/Dynlib)
endif ()

# ---------------------------------------------------------
# Flags
# ---------------------------------------------------------

#
# TODO: may be modified or deleted
#

#define_module(
#	TARGET flags
#	NAME Flags
#	DIRECTORY Flags
#	SOURCES ${code_SOURCE_DIR}/C++/modules/Flags/Flags.h
#)

# ---------------------------------------------------------
# Hash
# ---------------------------------------------------------

if (OPENSSL_FOUND)
	define_module(
		TARGET hash
		NAME Hash
		DIRECTORY Hash
		LIBRARIES ${OPENSSL_LIBRARIES}
		INCLUDES ${OPENSSL_INCLUDE_DIR}
		SOURCES
			${code_SOURCE_DIR}/C++/modules/Hash/Hash.cpp
			${code_SOURCE_DIR}/C++/modules/Hash/Hash.h
	)
endif ()

# ---------------------------------------------------------
# Ini
# ---------------------------------------------------------

if (WIN32)
	set(INI_LIBRARIES Shlwapi)
endif ()

define_module(
	TARGET ini
	NAME Ini
	DIRECTORY Ini
	SOURCES
		${code_SOURCE_DIR}/C++/modules/Ini/Ini.cpp
		${code_SOURCE_DIR}/C++/modules/Ini/Ini.h
	LIBRARIES
		${INI_LIBRARIES}
	RESOURCES
		${code_SOURCE_DIR}/C++/tests/Ini/configs/compact.conf
		${code_SOURCE_DIR}/C++/tests/Ini/configs/error-badcomment.conf
		${code_SOURCE_DIR}/C++/tests/Ini/configs/error-badsection.conf
		${code_SOURCE_DIR}/C++/tests/Ini/configs/error-lineassigment.conf
		${code_SOURCE_DIR}/C++/tests/Ini/configs/error-nosection.conf
		${code_SOURCE_DIR}/C++/tests/Ini/configs/includes.conf
		${code_SOURCE_DIR}/C++/tests/Ini/configs/multi.conf
		${code_SOURCE_DIR}/C++/tests/Ini/configs/novalue.conf
		${code_SOURCE_DIR}/C++/tests/Ini/configs/simple.conf
		${code_SOURCE_DIR}/C++/tests/Ini/configs/tokens.conf
)

# ---------------------------------------------------------
# Js (Duktape)
# ---------------------------------------------------------

define_module(
	TARGET js
	NAME Js
	DIRECTORY Js
	LIBRARIES duktape
	SOURCES
		${code_SOURCE_DIR}/C++/modules/Js/Js.cpp
		${code_SOURCE_DIR}/C++/modules/Js/Js.h
)

# ---------------------------------------------------------
# Json
# ---------------------------------------------------------

if (Jansson_FOUND)
	define_module(
		TARGET json
		NAME Json
		DIRECTORY Json
		INCLUDES ${Jansson_INCLUDE_DIRS}
		LIBRARIES ${Jansson_LIBRARIES}
		SOURCES
			${code_SOURCE_DIR}/C++/modules/Json/Json.cpp
			${code_SOURCE_DIR}/C++/modules/Json/Json.h
		RESOURCES
			${code_SOURCE_DIR}/C++/tests/Json/data/array-all.json
			${code_SOURCE_DIR}/C++/tests/Json/data/array.json
			${code_SOURCE_DIR}/C++/tests/Json/data/object-all.json
			${code_SOURCE_DIR}/C++/tests/Json/data/object.json
			${code_SOURCE_DIR}/C++/tests/Json/data/simple.json
	)
endif ()

# ---------------------------------------------------------
# OptionParser
# ---------------------------------------------------------

define_module(
	TARGET optionparser
	NAME OptionParser
	DIRECTORY OptionParser
	SOURCES
		${code_SOURCE_DIR}/C++/modules/OptionParser/OptionParser.cpp
		${code_SOURCE_DIR}/C++/modules/OptionParser/OptionParser.h
)

# ---------------------------------------------------------
# Sockets
# ---------------------------------------------------------

if (OPENSSL_FOUND)
	if (WIN32)
		set(SOCKET_LIBRARIES ws2_32)
	endif ()

	define_module(
		TARGET socket
		NAME Socket
		DIRECTORY Socket
		INCLUDES ${OPENSSL_INCLUDE_DIR}
		LIBRARIES
			${SOCKET_LIBRARIES}
			${OPENSSL_LIBRARIES}
		SOURCES
			${code_SOURCE_DIR}/C++/modules/Socket/SocketAddress.cpp
			${code_SOURCE_DIR}/C++/modules/Socket/SocketAddress.h
			${code_SOURCE_DIR}/C++/modules/Socket/Socket.cpp
			${code_SOURCE_DIR}/C++/modules/Socket/Socket.h
			${code_SOURCE_DIR}/C++/modules/Socket/SocketListener.cpp
			${code_SOURCE_DIR}/C++/modules/Socket/SocketListener.h
			${code_SOURCE_DIR}/C++/modules/Socket/SocketSsl.cpp
			${code_SOURCE_DIR}/C++/modules/Socket/SocketSsl.h
	)
endif ()

# ---------------------------------------------------------
# Treenode
# ---------------------------------------------------------

define_module(
	TARGET treenode
	NAME Treenode
	DIRECTORY Treenode
	SOURCES
		${code_SOURCE_DIR}/C++/modules/Treenode/TreeNode.h
)

# ---------------------------------------------------------
# Unicode
# ---------------------------------------------------------

define_module(
	TARGET unicode
	NAME Unicode
	DIRECTORY Unicode
	SOURCES
		${code_SOURCE_DIR}/C++/modules/Unicode/Unicode.cpp
		${code_SOURCE_DIR}/C++/modules/Unicode/Unicode.h
)

# ---------------------------------------------------------
# Xdg
# ---------------------------------------------------------

if (UNIX)
	define_module(
		TARGET xdg
		NAME Xdg
		DIRECTORY Xdg
		SOURCES
			${code_SOURCE_DIR}/C++/modules/Xdg/Xdg.cpp
			${code_SOURCE_DIR}/C++/modules/Xdg/Xdg.h
	)
endif ()

# ---------------------------------------------------------
# Zip
# ---------------------------------------------------------

if (ZIP_FOUND)
	define_module(
		TARGET zip
		NAME Zip
		DIRECTORY Zip
		INCLUDES ${ZIP_INCLUDE_DIRS}
		LIBRARIES ${ZIP_LIBRARIES}
		RESOURCES
			${code_SOURCE_DIR}/C++/tests/Zip/data/data.txt
			${code_SOURCE_DIR}/C++/tests/Zip/data/stats.zip
		SOURCES
			${code_SOURCE_DIR}/C++/modules/Zip/ZipArchive.cpp
			${code_SOURCE_DIR}/C++/modules/Zip/ZipArchive.h
	)
endif ()