Mercurial > code
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 +)