diff CMakeLists.txt @ 334:0b576ee64d45

* Create brand new hierarchy * Rename DynLib to Dynlib * Remove some warnings
author David Demelier <markand@malikania.fr>
date Sun, 08 Mar 2015 14:26:33 +0100
parents d52a69f9f029
children 486767e1d165
line wrap: on
line diff
--- a/CMakeLists.txt	Sun Mar 08 11:07:36 2015 +0100
+++ b/CMakeLists.txt	Sun Mar 08 14:26:33 2015 +0100
@@ -25,103 +25,372 @@
 
 set(CMAKE_MODULE_PATH ${code_SOURCE_DIR}/cmake)
 
+include(CMakeParseArguments)
+
+add_subdirectory(extern)
+add_subdirectory(tools)
+
 enable_testing()
 
-include_directories(
-	${code_SOURCE_DIR}/C++
+macro(define_module)
+	set(oneValueArgs TARGET NAME DIRECTORY)
+	set(multiValueArgs SOURCES RESOURCES DOCS 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} ${MOD_DOCS} ${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 ()
+
+		# Generate documentation locally
+		if (MOD_DOCS)
+			foreach (doc ${MOD_DOCS})
+				file(RELATIVE_PATH inputbase ${code_SOURCE_DIR}/C++/doc/${MOD_DIRECTORY} ${doc})
+				string(REGEX REPLACE "^(.*)\\.md" "\\1.html" outputname ${inputbase})
+				set(output ${CMAKE_BINARY_DIR}/doc/${MOD_DIRECTORY}/${outputname})
+
+				pandoc(
+					SOURCES ${doc}
+					OUTPUT ${output}
+					FROM markdown TO html5
+					MAKE_DIRECTORY STANDALONE
+					FILTER $<TARGET_FILE:mdtohtml>
+				)
+
+				list(APPEND docoutputlist ${output})
+			endforeach ()
+
+			add_custom_target(${MOD_TARGET}-doc DEPENDS ${docoutputlist})
+			add_dependencies(${MOD_TARGET} ${MOD_TARGET}-doc)
+		endif ()
+	endif ()
+endmacro()
+
+find_package(Pandoc REQUIRED)
+find_package(OpenSSL REQUIRED)
+find_package(Jansson REQUIRED)
+
+# ---------------------------------------------------------
+# 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
 )
 
-# GoogleTest library
-add_subdirectory(extern)
+# ---------------------------------------------------------
+# Converter
+# ---------------------------------------------------------
+
+# No tests yet
 
-function(define_test name sources)
-	# The executable
-	add_executable(
-		${name}
-		${sources}
-	)
+# ---------------------------------------------------------
+# Directory
+# ---------------------------------------------------------
 
-	target_link_libraries(${name} gtest)
-	add_test(${name}-test ${name})
-endfunction()
+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
+)
 
-option(WITH_BASE64 "Enable base64 tests" On)
-option(WITH_CONVERTER "Enable converter tests" On)
-option(WITH_DIRECTORY "Enable directory tests" On)
-option(WITH_DRIVER "Enable SQL drivers tests" On)
-option(WITH_DYNLIB "Enable DynLib tests" On)
-option(WITH_FLAGS "Enable Flags tests" On)
-option(WITH_HASH "Enable hash functions tests" On)
-option(WITH_INI "Enable .ini parser" On)
-option(WITH_JSON "Enable Jansson wrapper tests" On)
-option(WITH_OPTIONPARSER "Enable option parser tests" On)
-option(WITH_PACK "Enable pack functions" On)
-option(WITH_PARSER "Enable parser tests (deprecated)" On)
-option(WITH_SOCKETS "Enable sockets tests" On)
-option(WITH_TREENODE "Enable treenode tests" On)
-option(WITH_UTF8 "Enable Utf8 functions tests" On)
-option(WITH_ZIP "Enable ZipArchive tests" On)
+# ---------------------------------------------------------
+# Driver
+# ---------------------------------------------------------
+
+# No tests yet
 
-if (UNIX)
-	option(WITH_XDG "Enable XDG standard directories tests" On)
+# ---------------------------------------------------------
+# Dynlib
+# ---------------------------------------------------------
+
+if (WIN32)
+	set(EXTENSION ".dll")
+elseif (UNIX)
+	set(EXTENSION ".so")
+elseif (APPLE)
+	set(EXTENSION ".dylib")
+else ()
+	message(FATAL_ERROR "Unsupported platform")
 endif ()
 
-if (WITH_BASE64)
-	add_subdirectory(C++/Tests/Base64)
-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
+	DOCS
+		${code_SOURCE_DIR}/C++/doc/Dynlib/Home.md
+		${code_SOURCE_DIR}/C++/doc/Dynlib/class/Dynlib.md
+		${code_SOURCE_DIR}/C++/doc/Dynlib/class/Dynlib/Constructor.md
+		${code_SOURCE_DIR}/C++/doc/Dynlib/class/Dynlib/Destructor.md
+		${code_SOURCE_DIR}/C++/doc/Dynlib/class/Dynlib/Policy.md
+		${code_SOURCE_DIR}/C++/doc/Dynlib/class/Dynlib/sym.md
+		${code_SOURCE_DIR}/C++/doc/Dynlib/macro/DYNLIB_EXPORT.md
+)
 
-if (WITH_DIRECTORY)
-	add_subdirectory(C++/Tests/Directory)
+if (CMAKE_SYSTEM_NAME MATCHES "Linux")
+	target_link_libraries(dynlib dl)
 endif ()
 
-if (WITH_DYNLIB)
-	add_subdirectory(C++/Tests/DynLib)
-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)
+
+# ---------------------------------------------------------
+# Flags
+# ---------------------------------------------------------
+
+define_module(
+	TARGET flags
+	NAME Flags
+	DIRECTORY Flags
+	SOURCES ${code_SOURCE_DIR}/C++/modules/Flags/Flags.h
+)
+
+# ---------------------------------------------------------
+# Hash
+# ---------------------------------------------------------
+
+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
+)
+
+# ---------------------------------------------------------
+# Ini
+# ---------------------------------------------------------
 
-if (WITH_FLAGS)
-	add_subdirectory(C++/Tests/Flags)
-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
+	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
+)
+
+# ---------------------------------------------------------
+# Json
+# ---------------------------------------------------------
+
+define_module(
+	TARGET json
+	NAME Json
+	DIRECTORY Json
+	INCLUDES ${Jansson_INCLUDES}
+	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
+)
+
+# ---------------------------------------------------------
+# 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
+)
 
-if (WITH_HASH)
-	add_subdirectory(C++/Tests/Hash)
-endif ()
+# ---------------------------------------------------------
+# Pack
+# ---------------------------------------------------------
+
+define_module(
+	TARGET pack
+	NAME Pack
+	DIRECTORY Pack
+	SOURCES
+		${code_SOURCE_DIR}/C++/modules/Pack/Pack.cpp
+		${code_SOURCE_DIR}/C++/modules/Pack/Pack.h
+)
+
+# ---------------------------------------------------------
+# Parser (DEPRECATED)
+# ---------------------------------------------------------
+
+define_module(
+	TARGET parser
+	NAME Parser
+	DIRECTORY Parser
+	RESOURCES
+		${code_SOURCE_DIR}/C++/tests/Parser/configs/simple.conf
+		${code_SOURCE_DIR}/C++/tests/Parser/configs/multi.conf
+	SOURCES
+		${code_SOURCE_DIR}/C++/modules/Parser/Parser.cpp
+		${code_SOURCE_DIR}/C++/modules/Parser/Parser.h
+)
+
+# ---------------------------------------------------------
+# Sockets
+# ---------------------------------------------------------
 
-if (WITH_JSON)
-	add_subdirectory(C++/Tests/Json)
-endif ()
+define_module(
+	TARGET socket
+	NAME Socket
+	DIRECTORY Socket
+	INCLUDES ${OPENSSL_INCLUDE_DIR}
+	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
+		${code_SOURCE_DIR}/C++/modules/Socket/SocketTcp.cpp
+		${code_SOURCE_DIR}/C++/modules/Socket/SocketTcp.h
+		${code_SOURCE_DIR}/C++/modules/Socket/SocketUdp.cpp
+		${code_SOURCE_DIR}/C++/modules/Socket/SocketUdp.h
+)
+
+# ---------------------------------------------------------
+# Treenode
+# ---------------------------------------------------------
 
-if (WITH_INI)
-	add_subdirectory(C++/Tests/Ini)
-endif ()
+define_module(
+	TARGET treenode
+	NAME Treenode
+	DIRECTORY Treenode
+	SOURCES
+		${code_SOURCE_DIR}/C++/modules/Treenode/TreeNode.h
+)
+
+# ---------------------------------------------------------
+# Utf8
+# ---------------------------------------------------------
 
-if (WITH_OPTIONPARSER)
-	add_subdirectory(C++/Tests/OptionParser)
+define_module(
+	TARGET utf8
+	NAME Utf8
+	DIRECTORY Utf8
+	SOURCES
+		${code_SOURCE_DIR}/C++/modules/Utf8/Utf8.cpp
+		${code_SOURCE_DIR}/C++/modules/Utf8/Utf8.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 ()
 
-if (WITH_PACK)
-	add_subdirectory(C++/Tests/Pack)
-endif ()
+# ---------------------------------------------------------
+# Zip
+# ---------------------------------------------------------
 
-if (WITH_PARSER)
-	add_subdirectory(C++/Tests/Parser)
-endif ()
-
-if (WITH_SOCKETS)
-	add_subdirectory(C++/Tests/Sockets)
-endif ()
+find_package(ZIP REQUIRED)
 
-if (WITH_TREENODE)
-	add_subdirectory(C++/Tests/TreeNode)
-endif ()
-
-if (WITH_UTF8)
-	add_subdirectory(C++/Tests/Utf8)
-endif ()
-
-if (WITH_XDG AND UNIX)
-	add_subdirectory(C++/Tests/Xdg)
-endif ()
-
-if (WITH_ZIP)
-	add_subdirectory(C++/Tests/Zip)
-endif ()
+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
+)