| @@ -0,0 +1 @@ | |||||
| build/ | |||||
| @@ -0,0 +1,3 @@ | |||||
| [submodule "cmake/modules"] | |||||
| path = cmake/modules | |||||
| url = b3rgmann@git.bergmann89.de:cpp/CmakeModules.git | |||||
| @@ -0,0 +1,27 @@ | |||||
| # Initialize CMake ################################################################################ | |||||
| CMake_Minimum_Required ( VERSION 3.12.0 FATAL_ERROR ) | |||||
| # Set CMAKE_BUILD_TYPE | |||||
| If ( NOT CMAKE_BUILD_TYPE ) | |||||
| Set ( CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build!" FORCE ) | |||||
| EndIf ( NOT CMAKE_BUILD_TYPE ) | |||||
| Set_Property ( CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS Debug Release RelWithDebInfo MinSizeRel ) | |||||
| # Set CMAKE_MODULE_PATH | |||||
| If ( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/cmake/" ) | |||||
| Set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} | |||||
| "${CMAKE_CURRENT_SOURCE_DIR}/cmake/" ) | |||||
| EndIf ( ) | |||||
| If ( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/cmake/" ) | |||||
| Set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} | |||||
| "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules" ) | |||||
| EndIf ( ) | |||||
| # Projects ######################################################################################## | |||||
| Message ( WARNING "Please configure the subprojects of this project group!" ) | |||||
| Add_SubDirectory ( ${CMAKE_CURRENT_SOURCE_DIR}/projects/libhelloworld ) | |||||
| Add_SubDirectory ( ${CMAKE_CURRENT_SOURCE_DIR}/projects/helloworld ) | |||||
| @@ -0,0 +1 @@ | |||||
| Subproject commit 1e74005bc2f91434fecb2e5f698c21b73f7e3a13 | |||||
| @@ -0,0 +1,49 @@ | |||||
| # Initialize CMake ################################################################################ | |||||
| CMake_Minimum_Required ( VERSION 3.12.0 FATAL_ERROR ) | |||||
| # Set CMAKE_BUILD_TYPE | |||||
| If ( NOT CMAKE_BUILD_TYPE ) | |||||
| Set ( CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build!" FORCE ) | |||||
| EndIf ( NOT CMAKE_BUILD_TYPE ) | |||||
| Set_Property ( CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS Debug Release RelWithDebInfo MinSizeRel ) | |||||
| # Set CMAKE_MODULE_PATH | |||||
| If ( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/cmake/" ) | |||||
| Set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} | |||||
| "${CMAKE_CURRENT_SOURCE_DIR}/cmake/" ) | |||||
| EndIf ( ) | |||||
| If ( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/cmake/" ) | |||||
| Set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} | |||||
| "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules" ) | |||||
| EndIf ( ) | |||||
| # Project ######################################################################################### | |||||
| # Version | |||||
| Set ( HELLOWORLD_VERSION_MAJOR 1 ) | |||||
| Set ( HELLOWORLD_VERSION_MINOR 0 ) | |||||
| Set ( HELLOWORLD_VERSION_PATCH 0 ) | |||||
| Set ( HELLOWORLD_VERSION_BUILD 0 ) | |||||
| Set ( HELLOWORLD_VERSION_SHORT "${HELLOWORLD_VERSION_MAJOR}.${HELLOWORLD_VERSION_MINOR}" ) | |||||
| Set ( HELLOWORLD_VERSION "${HELLOWORLD_VERSION_SHORT}.${HELLOWORLD_VERSION_PATCH}.${HELLOWORLD_VERSION_BUILD}" ) | |||||
| Set ( HELLOWORLD_NAME "helloworld-${HELLOWORLD_VERSION_SHORT}" ) | |||||
| # Install directories | |||||
| Set ( HELLOWORLD_INSTALL_DIR_BIN "bin" ) | |||||
| # Project | |||||
| Project ( helloworld | |||||
| DESCRIPTION "A simple library" | |||||
| VERSION "${HELLOWORLD_VERSION}" ) | |||||
| Include ( CTest ) | |||||
| # C Standard | |||||
| Set ( CMAKE_C_STANDARD 11 ) | |||||
| Set ( CMAKE_CXX_STANDARD 17 ) | |||||
| Set ( CMAKE_C_STANDARD_REQUIRED ON ) | |||||
| Set ( CMAKE_CXX_STANDARD_REQUIRED ON ) | |||||
| # Subdirectories | |||||
| Add_SubDirectory ( ${CMAKE_CURRENT_SOURCE_DIR}/src ) | |||||
| Add_SubDirectory ( ${CMAKE_CURRENT_SOURCE_DIR}/test ) | |||||
| @@ -0,0 +1,3 @@ | |||||
| #pragma once | |||||
| #include <helloworld/dummy.h> | |||||
| @@ -0,0 +1,14 @@ | |||||
| #pragma once | |||||
| #include <libhelloworld.h> | |||||
| namespace helloworld | |||||
| { | |||||
| struct DummyEx | |||||
| : public libhelloworld::Dummy | |||||
| { | |||||
| static std::string getHelloWorldEx(); | |||||
| }; | |||||
| } | |||||
| @@ -0,0 +1,69 @@ | |||||
| # Initialize ###################################################################################### | |||||
| Include ( cotire OPTIONAL RESULT_VARIABLE HAS_COTIRE ) | |||||
| Include ( pedantic OPTIONAL RESULT_VARIABLE HAS_PEDANTIC ) | |||||
| Include ( strip_symbols OPTIONAL RESULT_VARIABLE HAS_STRIP_SYMBOLS ) | |||||
| If ( HAS_PEDANTIC ) | |||||
| Pedantic_Apply_Flags ( ALL ) | |||||
| EndIf ( ) | |||||
| Option ( HELLOWORLD_INSTALL_DEBUG | |||||
| "Install the stripped debug informations of helloworld." | |||||
| OFF ) | |||||
| Option ( HELLOWORLD_NO_STRIP | |||||
| "Do not strip debug symbols from binary." | |||||
| OFF ) | |||||
| Message ( WARNING "Please configure the dependencies of this project!" ) | |||||
| Find_Package ( libhelloworld REQUIRED ) | |||||
| # Object Library ################################################################################## | |||||
| Set ( HELLOWORLD_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../include ) | |||||
| File ( GLOB_RECURSE HELLOWORLD_HEADER_FILES ${HELLOWORLD_INCLUDE_DIR}/*.h ) | |||||
| File ( GLOB_RECURSE HELLOWORLD_INLINE_FILES ${HELLOWORLD_INCLUDE_DIR}/*.inl ) | |||||
| File ( GLOB_RECURSE HELLOWORLD_SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp ) | |||||
| List ( REMOVE_ITEM HELLOWORLD_SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp ) | |||||
| Add_Library ( helloworld-objects | |||||
| OBJECT | |||||
| ${HELLOWORLD_HEADER_FILES} | |||||
| ${HELLOWORLD_INLINE_FILES} | |||||
| ${HELLOWORLD_SOURCE_FILES} ) | |||||
| Target_Include_Directories ( helloworld-objects | |||||
| PUBLIC | |||||
| $<BUILD_INTERFACE:${HELLOWORLD_INCLUDE_DIR}> | |||||
| $<INSTALL_INTERFACE:${HELLOWORLD_INSTALL_DIR_INCLUDE}> ) | |||||
| Target_Link_Libraries ( helloworld-objects | |||||
| PUBLIC | |||||
| libhelloworld-shared ) | |||||
| # Executable ###################################################################################### | |||||
| Set ( HELLOWORLD_MAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp ) | |||||
| Add_Executable ( helloworld ${HELLOWORLD_MAIN_FILE} ) | |||||
| Target_Link_Libraries ( helloworld | |||||
| PUBLIC | |||||
| helloworld-objects ) | |||||
| # Optimization #################################################################################### | |||||
| If ( HAS_COTIRE ) | |||||
| Cotire ( helloworld-objects ) | |||||
| Cotire ( helloworld ) | |||||
| EndIf ( ) | |||||
| # Install ######################################################################################### | |||||
| # Executable | |||||
| Install ( TARGETS helloworld | |||||
| DESTINATION ${HELLOWORLD_INSTALL_DIR_BIN} ) | |||||
| # Debug | |||||
| If ( HAS_STRIP_SYMBOLS AND NOT HELLOWORLD_NO_STRIP ) | |||||
| Strip_Symbols ( helloworld HELLOWORLD_DBG_FILE ) | |||||
| If ( HELLOWORLD_INSTALL_DEBUG ) | |||||
| Install ( FILES ${HELLOWORLD_DBG_FILE} | |||||
| DESTINATION ${HELLOWORLD_INSTALL_DIR_LIB} ) | |||||
| EndIf ( ) | |||||
| EndIf ( ) | |||||
| @@ -0,0 +1,8 @@ | |||||
| #include <helloworld/dummy.h> | |||||
| using namespace ::helloworld; | |||||
| std::string DummyEx::getHelloWorldEx() | |||||
| { | |||||
| return Dummy::getHelloWorld() + "\nThis is a simple executable :)"; | |||||
| } | |||||
| @@ -0,0 +1,9 @@ | |||||
| #include <iostream> | |||||
| #include <helloworld.h> | |||||
| using namespace ::helloworld; | |||||
| int main(int argc, const char * argv[]) | |||||
| { | |||||
| std::cout << DummyEx::getHelloWorldEx() << std::endl; | |||||
| } | |||||
| @@ -0,0 +1,42 @@ | |||||
| # Initialize ###################################################################################### | |||||
| Include ( cotire OPTIONAL RESULT_VARIABLE HAS_COTIRE ) | |||||
| Include ( pedantic OPTIONAL RESULT_VARIABLE HAS_PEDANTIC ) | |||||
| Include ( cmake_tests OPTIONAL RESULT_VARIABLE HAS_CMAKE_TESTS ) | |||||
| If ( HAS_PEDANTIC ) | |||||
| Pedantic_Apply_Flags ( ALL ) | |||||
| EndIf ( ) | |||||
| # Test ############################################################################################ | |||||
| Find_Package ( GTest ) | |||||
| If ( NOT "${GTest_FOUND}" ) | |||||
| Return ( ) | |||||
| EndIf ( ) | |||||
| File ( GLOB_RECURSE HELLOWORLD_TEST_HEADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.h ) | |||||
| File ( GLOB_RECURSE HELLOWORLD_TEST_INLINE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.inl ) | |||||
| File ( GLOB_RECURSE HELLOWORLD_TEST_SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp ) | |||||
| Add_Executable ( helloworld-test | |||||
| EXCLUDE_FROM_ALL | |||||
| ${HELLOWORLD_TEST_HEADER_FILES} | |||||
| ${HELLOWORLD_TEST_INLINE_FILES} | |||||
| ${HELLOWORLD_TEST_SOURCE_FILES} ) | |||||
| Target_Link_Libraries ( helloworld-test | |||||
| PUBLIC | |||||
| helloworld-objects | |||||
| GTest::Main ) | |||||
| # optimization | |||||
| If ( HAS_COTIRE ) | |||||
| Cotire ( helloworld-test ) | |||||
| EndIf ( ) | |||||
| # test | |||||
| If ( HAS_CMAKE_TESTS ) | |||||
| Add_CMake_Test ( NAME helloworld TARGET helloworld-test ) | |||||
| Else ( ) | |||||
| Add_Test ( NAME helloworld COMMAND helloworld-test ) | |||||
| EndIf ( ) | |||||
| @@ -0,0 +1,11 @@ | |||||
| #include <gtest/gtest.h> | |||||
| #include <helloworld.h> | |||||
| using namespace ::testing; | |||||
| using namespace ::helloworld; | |||||
| TEST(helloworld, getHelloWorldEx) | |||||
| { | |||||
| EXPECT_EQ(DummyEx::getHelloWorldEx(), "Hello World!\nThis is a simple executable :)"); | |||||
| } | |||||
| @@ -0,0 +1,71 @@ | |||||
| # Initialize CMake ################################################################################ | |||||
| CMake_Minimum_Required ( VERSION 3.12.0 FATAL_ERROR ) | |||||
| # Set CMAKE_BUILD_TYPE | |||||
| If ( NOT CMAKE_BUILD_TYPE ) | |||||
| Set ( CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build!" FORCE ) | |||||
| EndIf ( NOT CMAKE_BUILD_TYPE ) | |||||
| Set_Property ( CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS Debug Release RelWithDebInfo MinSizeRel ) | |||||
| # Set CMAKE_MODULE_PATH | |||||
| If ( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/cmake/" ) | |||||
| Set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} | |||||
| "${CMAKE_CURRENT_SOURCE_DIR}/cmake/" ) | |||||
| EndIf ( ) | |||||
| If ( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/cmake/" ) | |||||
| Set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} | |||||
| "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules" ) | |||||
| EndIf ( ) | |||||
| # Project ######################################################################################### | |||||
| # Version | |||||
| Set ( LIBHELLOWORLD_VERSION_MAJOR 1 ) | |||||
| Set ( LIBHELLOWORLD_VERSION_MINOR 0 ) | |||||
| Set ( LIBHELLOWORLD_VERSION_PATCH 0 ) | |||||
| Set ( LIBHELLOWORLD_VERSION_BUILD 0 ) | |||||
| Set ( LIBHELLOWORLD_VERSION_SHORT "${LIBHELLOWORLD_VERSION_MAJOR}.${LIBHELLOWORLD_VERSION_MINOR}" ) | |||||
| Set ( LIBHELLOWORLD_VERSION "${LIBHELLOWORLD_VERSION_SHORT}.${LIBHELLOWORLD_VERSION_PATCH}.${LIBHELLOWORLD_VERSION_BUILD}" ) | |||||
| Set ( LIBHELLOWORLD_NAME "libhelloworld-${LIBHELLOWORLD_VERSION_SHORT}" ) | |||||
| # Install directories | |||||
| Set ( LIBHELLOWORLD_INSTALL_DIR_INCLUDE "include/${LIBHELLOWORLD_NAME}" ) | |||||
| Set ( LIBHELLOWORLD_INSTALL_DIR_LIB "lib/${LIBHELLOWORLD_NAME}" ) | |||||
| Set ( LIBHELLOWORLD_INSTALL_DIR_SHARE "share/${LIBHELLOWORLD_NAME}" ) | |||||
| # Project | |||||
| Project ( libhelloworld | |||||
| DESCRIPTION "A simple library" | |||||
| VERSION "${LIBHELLOWORLD_VERSION}" ) | |||||
| Include ( CTest ) | |||||
| # C Standard | |||||
| Set ( CMAKE_C_STANDARD 11 ) | |||||
| Set ( CMAKE_CXX_STANDARD 17 ) | |||||
| Set ( CMAKE_C_STANDARD_REQUIRED ON ) | |||||
| Set ( CMAKE_CXX_STANDARD_REQUIRED ON ) | |||||
| # Subdirectories | |||||
| Add_SubDirectory ( ${CMAKE_CURRENT_SOURCE_DIR}/src ) | |||||
| Add_SubDirectory ( ${CMAKE_CURRENT_SOURCE_DIR}/test ) | |||||
| # Install | |||||
| Include ( CMakePackageConfigHelpers ) | |||||
| Write_Basic_Package_Version_File ( "${CMAKE_CURRENT_BINARY_DIR}/cmake/libhelloworld-config-version.cmake" | |||||
| VERSION ${LIBHELLOWORLD_VERSION} | |||||
| COMPATIBILITY AnyNewerVersion ) | |||||
| Configure_File ( "${CMAKE_CURRENT_SOURCE_DIR}/cmake/libhelloworld-config.cmake" | |||||
| "${CMAKE_CURRENT_BINARY_DIR}/cmake/libhelloworld-config.cmake" | |||||
| @ONLY ) | |||||
| Set ( ConfigPackageLocation "${LIBHELLOWORLD_INSTALL_DIR_SHARE}/cmake" ) | |||||
| Install ( EXPORT libhelloworld | |||||
| DESTINATION ${ConfigPackageLocation} ) | |||||
| Install ( FILES | |||||
| "${CMAKE_CURRENT_BINARY_DIR}/cmake/libhelloworld-config.cmake" | |||||
| "${CMAKE_CURRENT_BINARY_DIR}/cmake/libhelloworld-config-version.cmake" | |||||
| DESTINATION | |||||
| ${ConfigPackageLocation} | |||||
| COMPONENT | |||||
| Devel ) | |||||
| @@ -0,0 +1,4 @@ | |||||
| # libhelloworld-config.cmake - package configuration file | |||||
| Get_Filename_Component ( CURRENT_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH ) | |||||
| Include ( ${CURRENT_DIR}/libhelloworld.cmake ) | |||||
| @@ -0,0 +1,3 @@ | |||||
| #pragma once | |||||
| #include <libhelloworld/dummy.h> | |||||
| @@ -0,0 +1,13 @@ | |||||
| #pragma once | |||||
| #include <string> | |||||
| namespace libhelloworld | |||||
| { | |||||
| struct Dummy | |||||
| { | |||||
| static std::string getHelloWorld(); | |||||
| }; | |||||
| } | |||||
| @@ -0,0 +1,107 @@ | |||||
| # Initialize ###################################################################################### | |||||
| Include ( cotire OPTIONAL RESULT_VARIABLE HAS_COTIRE ) | |||||
| Include ( pedantic OPTIONAL RESULT_VARIABLE HAS_PEDANTIC ) | |||||
| Include ( strip_symbols OPTIONAL RESULT_VARIABLE HAS_STRIP_SYMBOLS ) | |||||
| If ( HAS_PEDANTIC ) | |||||
| Pedantic_Apply_Flags ( ALL ) | |||||
| EndIf ( ) | |||||
| Option ( LIBHELLOWORLD_INSTALL_HEADER | |||||
| "Install headers of libhelloworld." | |||||
| ON ) | |||||
| Option ( LIBHELLOWORLD_INSTALL_STATIC | |||||
| "Install static library of libhelloworld." | |||||
| ON ) | |||||
| Option ( LIBHELLOWORLD_INSTALL_SHARED | |||||
| "Install shared library of libhelloworld." | |||||
| ON ) | |||||
| Option ( LIBHELLOWORLD_INSTALL_DEBUG | |||||
| "Install the stripped debug informations of libhelloworld." | |||||
| OFF ) | |||||
| Option ( LIBHELLOWORLD_NO_STRIP | |||||
| "Do not strip debug symbols from binary." | |||||
| OFF ) | |||||
| # Object Library ################################################################################## | |||||
| Set ( CMAKE_POSITION_INDEPENDENT_CODE ON ) | |||||
| Set ( LIBHELLOWORLD_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../include ) | |||||
| File ( GLOB_RECURSE LIBHELLOWORLD_HEADER_FILES ${LIBHELLOWORLD_INCLUDE_DIR}/*.h ) | |||||
| File ( GLOB_RECURSE LIBHELLOWORLD_INLINE_FILES ${LIBHELLOWORLD_INCLUDE_DIR}/*.inl ) | |||||
| File ( GLOB_RECURSE LIBHELLOWORLD_SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp ) | |||||
| Add_Library ( libhelloworld-objects | |||||
| OBJECT | |||||
| ${LIBHELLOWORLD_HEADER_FILES} | |||||
| ${LIBHELLOWORLD_INLINE_FILES} | |||||
| ${LIBHELLOWORLD_SOURCE_FILES} ) | |||||
| Target_Include_Directories ( libhelloworld-objects | |||||
| PUBLIC | |||||
| $<BUILD_INTERFACE:${LIBHELLOWORLD_INCLUDE_DIR}> | |||||
| $<INSTALL_INTERFACE:${LIBHELLOWORLD_INSTALL_DIR_INCLUDE}> ) | |||||
| # Static Library ################################################################################## | |||||
| Message ( WARNING "Please configure the output name of the static library target!" ) | |||||
| Add_Library ( libhelloworld-static STATIC $<TARGET_OBJECTS:libhelloworld-objects> ) | |||||
| Set_Target_Properties ( libhelloworld-static | |||||
| PROPERTIES | |||||
| OUTPUT_NAME "helloworld" ) | |||||
| Target_Include_Directories ( libhelloworld-static | |||||
| PUBLIC | |||||
| $<BUILD_INTERFACE:${LIBHELLOWORLD_INCLUDE_DIR}> | |||||
| $<INSTALL_INTERFACE:${LIBHELLOWORLD_INSTALL_DIR_INCLUDE}> ) | |||||
| # Shared Library ################################################################################## | |||||
| Message ( WARNING "Please configure the output name of the shared library target!" ) | |||||
| Add_Library ( libhelloworld-shared SHARED $<TARGET_OBJECTS:libhelloworld-objects> ) | |||||
| Set_Target_Properties ( libhelloworld-shared | |||||
| PROPERTIES | |||||
| OUTPUT_NAME "helloworld" ) | |||||
| Target_Include_Directories ( libhelloworld-shared | |||||
| PUBLIC | |||||
| $<BUILD_INTERFACE:${LIBHELLOWORLD_INCLUDE_DIR}> | |||||
| $<INSTALL_INTERFACE:${LIBHELLOWORLD_INSTALL_DIR_INCLUDE}> ) | |||||
| # Optimization #################################################################################### | |||||
| If ( HAS_COTIRE ) | |||||
| Cotire ( libhelloworld-objects ) | |||||
| Cotire ( libhelloworld-static ) | |||||
| Cotire ( libhelloworld-shared ) | |||||
| EndIf ( ) | |||||
| # Install ######################################################################################### | |||||
| # Header | |||||
| If ( LIBHELLOWORLD_INSTALL_HEADER ) | |||||
| Install ( FILES ${LIBHELLOWORLD_INCLUDE_DIR}/libhelloworld.h | |||||
| DESTINATION ${LIBHELLOWORLD_INSTALL_DIR_INCLUDE} ) | |||||
| Install ( DIRECTORY ${LIBHELLOWORLD_INCLUDE_DIR}/libhelloworld | |||||
| DESTINATION ${LIBHELLOWORLD_INSTALL_DIR_INCLUDE} ) | |||||
| EndIf ( ) | |||||
| # Static | |||||
| If ( LIBHELLOWORLD_INSTALL_STATIC ) | |||||
| Install ( TARGETS libhelloworld-static | |||||
| EXPORT libhelloworld | |||||
| DESTINATION ${LIBHELLOWORLD_INSTALL_DIR_LIB} ) | |||||
| EndIf ( ) | |||||
| # Shared | |||||
| If ( LIBHELLOWORLD_INSTALL_SHARED ) | |||||
| Install ( TARGETS libhelloworld-shared | |||||
| EXPORT libhelloworld | |||||
| DESTINATION ${LIBHELLOWORLD_INSTALL_DIR_LIB} ) | |||||
| EndIf ( ) | |||||
| # Debug | |||||
| If ( HAS_STRIP_SYMBOLS AND NOT LIBHELLOWORLD_NO_STRIP ) | |||||
| Strip_Symbols ( libhelloworld-shared LIBHELLOWORLD_DBG_FILE ) | |||||
| If ( LIBHELLOWORLD_INSTALL_DEBUG ) | |||||
| Install ( FILES ${LIBHELLOWORLD_DBG_FILE} | |||||
| DESTINATION ${LIBHELLOWORLD_INSTALL_DIR_LIB} ) | |||||
| EndIf ( ) | |||||
| EndIf ( ) | |||||
| @@ -0,0 +1,8 @@ | |||||
| #include <libhelloworld/dummy.h> | |||||
| using namespace ::libhelloworld; | |||||
| std::string Dummy::getHelloWorld() | |||||
| { | |||||
| return "Hello World!"; | |||||
| } | |||||
| @@ -0,0 +1,42 @@ | |||||
| # Initialize ###################################################################################### | |||||
| Include ( cotire OPTIONAL RESULT_VARIABLE HAS_COTIRE ) | |||||
| Include ( pedantic OPTIONAL RESULT_VARIABLE HAS_PEDANTIC ) | |||||
| Include ( cmake_tests OPTIONAL RESULT_VARIABLE HAS_CMAKE_TESTS ) | |||||
| If ( HAS_PEDANTIC ) | |||||
| Pedantic_Apply_Flags ( ALL ) | |||||
| EndIf ( ) | |||||
| # Test ############################################################################################ | |||||
| Find_Package ( GTest ) | |||||
| If ( NOT "${GTest_FOUND}" ) | |||||
| Return ( ) | |||||
| EndIf ( ) | |||||
| File ( GLOB_RECURSE LIBHELLOWORLD_TEST_HEADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.h ) | |||||
| File ( GLOB_RECURSE LIBHELLOWORLD_TEST_INLINE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.inl ) | |||||
| File ( GLOB_RECURSE LIBHELLOWORLD_TEST_SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp ) | |||||
| Add_Executable ( libhelloworld-test | |||||
| EXCLUDE_FROM_ALL | |||||
| ${LIBHELLOWORLD_TEST_HEADER_FILES} | |||||
| ${LIBHELLOWORLD_TEST_INLINE_FILES} | |||||
| ${LIBHELLOWORLD_TEST_SOURCE_FILES} ) | |||||
| Target_Link_Libraries ( libhelloworld-test | |||||
| PUBLIC | |||||
| libhelloworld-objects | |||||
| GTest::Main ) | |||||
| # optimization | |||||
| If ( HAS_COTIRE ) | |||||
| Cotire ( libhelloworld-test ) | |||||
| EndIf ( ) | |||||
| # test | |||||
| If ( HAS_CMAKE_TESTS ) | |||||
| Add_CMake_Test ( NAME libhelloworld TARGET libhelloworld-test ) | |||||
| Else ( ) | |||||
| Add_Test ( NAME libhelloworld COMMAND libhelloworld-test ) | |||||
| EndIf ( ) | |||||
| @@ -0,0 +1,11 @@ | |||||
| #include <gtest/gtest.h> | |||||
| #include <libhelloworld.h> | |||||
| using namespace ::testing; | |||||
| using namespace ::libhelloworld; | |||||
| TEST(libhelloworld, getHelloWorld) | |||||
| { | |||||
| EXPECT_EQ(Dummy::getHelloWorld(), "Hello World!"); | |||||
| } | |||||
| @@ -0,0 +1,299 @@ | |||||
| #!/bin/bash | |||||
| ScriptFile=$(readlink -f "${BASH_SOURCE[0]}") | |||||
| ScriptDir=$(dirname "${ScriptFile}") | |||||
| UseGit=1 | |||||
| Verbose=0 | |||||
| CMakeModules="" | |||||
| Operations=() | |||||
| function Log() | |||||
| { | |||||
| printf "$@\n" | |||||
| } | |||||
| function Verbose() | |||||
| { | |||||
| if [[ $Verbose -eq 1 ]]; then | |||||
| Log "$@" | |||||
| fi | |||||
| } | |||||
| function Error() | |||||
| { | |||||
| >&2 printf "$@\n" | |||||
| } | |||||
| function Panic() | |||||
| { | |||||
| Error $@ | |||||
| exit 1 | |||||
| } | |||||
| function PrintHelp() | |||||
| { | |||||
| printf "This is a tool to create a new project group or projects inside an exsisting group. | |||||
| Parameters: | |||||
| -g|--group <directory> | |||||
| Create a new project group at the given directory. | |||||
| -l|--library <name> <directory> | |||||
| Create a new library project with the given name at the given directory. | |||||
| -e|--executable <name ><directory> | |||||
| Create a new executable project with the given name at the given directory. | |||||
| -m|--modules <remote> | |||||
| Add the CMake Modules fromthe given remote repository as submodule of the new project. | |||||
| -n|--nogit | |||||
| Does not initialize a new git repository when creating a new project group. | |||||
| -v|--verbose | |||||
| Print extra debug output. | |||||
| -?|-h|--help | |||||
| Print this help. | |||||
| " | |||||
| } | |||||
| function Copy() | |||||
| { | |||||
| srcDir="$1" | |||||
| dstDir="$2" | |||||
| file="$3" | |||||
| oldName="$4" | |||||
| newName="$5" | |||||
| tmpSrc="$srcDir$file" | |||||
| tmpDst="$dstDir$file" | |||||
| if [[ -n "$oldName$newName" ]]; then | |||||
| tmpDst=${tmpDst//$oldName/$newName} | |||||
| fi | |||||
| tmpDir=$(dirname $tmpDst) | |||||
| Verbose " Copy .$file to $tmpDst" | |||||
| mkdir -p "$tmpDir" \ | |||||
| || Panic "Unable to create directory: $tmpDir!" | |||||
| cp "$tmpSrc" "$tmpDst" \ | |||||
| || Panic "Unable to copy file: $tmpSrc > $tmpDst!" | |||||
| if [[ -n "$oldName$newName" ]]; then | |||||
| oldUpper=$(echo $oldName | awk -F: '{ print toupper($1) }') | |||||
| newUpper=$(echo $newName | awk -F: '{ print toupper($1) }') | |||||
| sed -i -e "s/$oldName/$newName/g" "$tmpDst" \ | |||||
| || Panic "Unable to replace names!" | |||||
| sed -i -e "s/$oldUpper/$newUpper/g" "$tmpDst" \ | |||||
| || Panic "Unable to replace names!" | |||||
| fi | |||||
| } | |||||
| function CreateGroup() | |||||
| { | |||||
| dir="$1" | |||||
| Log "\nCreate Project Group: $dir" | |||||
| # Create directory | |||||
| Log " Create directory: $dir" | |||||
| mkdir -p "$dir" \ | |||||
| || Panic "Unable to create project group directory: $dir!" | |||||
| # Create git repository | |||||
| Log " Create git repository" | |||||
| if [[ $UseGit -eq 1 ]]; then | |||||
| git -C $dir init \ | |||||
| || Panic "Git init failed!" | |||||
| # Add cmake modules | |||||
| Log " Add git submodule for CMake modules" | |||||
| if [[ -n "$CMakeModules" ]]; then | |||||
| git -C $dir submodule add "$CMakeModules" "$dir/cmake/modules" \ | |||||
| || Panic "Git submodule add failed!" | |||||
| fi | |||||
| fi | |||||
| # Copy files | |||||
| Log " Copy files" | |||||
| srcDir="$ScriptDir" | |||||
| for file in $(find $srcDir -type f); do | |||||
| if [[ $file == $ScriptFile ]] \ | |||||
| || [[ $file == $srcDir/build/* ]] \ | |||||
| || [[ $file == $srcDir/.git/* ]] \ | |||||
| || [[ $file == $srcDir/.gitmodules ]] \ | |||||
| || [[ $file == $srcDir/.vscode/* ]] \ | |||||
| || [[ $file == $srcDir/projects/* ]] \ | |||||
| || [[ $file == $srcDir/cmake/modules/* ]] | |||||
| then | |||||
| relFile=.${file/$srcDir/} | |||||
| Verbose " Ignore $relFile" | |||||
| elif [[ $UseGit -eq 0 ]] \ | |||||
| && [[ $file == $srcDir/.git* ]] | |||||
| then | |||||
| relFile=.${file/$srcDir/} | |||||
| Verbose " Ignore $relFile" | |||||
| else | |||||
| Copy "$srcDir" "$dir" "${file/$srcDir/}" | |||||
| fi | |||||
| done | |||||
| } | |||||
| function CreateLibrary() | |||||
| { | |||||
| name="$1" | |||||
| dir="$2" | |||||
| Log "\nCreate Library: $1 $2" | |||||
| # Create directory | |||||
| Log " Create directory: $dir" | |||||
| mkdir -p "$dir" \ | |||||
| || Panic "Unable to create directory: $dir!" | |||||
| # Add cmake modules | |||||
| if [[ $UseGit -eq 1 ]] && [[ -n "$CMakeModules" ]]; then | |||||
| git -C $dir submodule add "$CMakeModules" "$dir/cmake/modules" \ | |||||
| || Panic "Git submodule add failed!" | |||||
| fi | |||||
| # Copy files | |||||
| Log " Copy files" | |||||
| srcDir="$ScriptDir/projects/libhelloworld" | |||||
| for file in $(find $srcDir -type f); do | |||||
| if [[ $file == $srcDir/build/* ]] \ | |||||
| || [[ $file == $srcDir/cmake/modules/* ]] | |||||
| then | |||||
| relFile=.${file/$srcDir/} | |||||
| Verbose " Ignore $relFile" | |||||
| elif [[ $UseGit -eq 0 ]] \ | |||||
| && [[ $file == $srcDir/.git* ]] | |||||
| then | |||||
| relFile=.${file/$srcDir/} | |||||
| Verbose " Ignore $relFile" | |||||
| else | |||||
| Copy "$srcDir" "$dir" "${file/$srcDir/}" "libhelloworld" "$name" | |||||
| fi | |||||
| done | |||||
| } | |||||
| function CreateExecutable() | |||||
| { | |||||
| name="$1" | |||||
| dir="$2" | |||||
| Log "\nCreate Executable: $1 $2" | |||||
| # Create directory | |||||
| Log " Create directory: $dir" | |||||
| mkdir -p "$dir" \ | |||||
| || Panic "Unable to create directory: $dir!" | |||||
| # Add cmake modules | |||||
| if [[ $UseGit -eq 1 ]] && [[ -n "$CMakeModules" ]]; then | |||||
| git -C $dir submodule add "$CMakeModules" "$dir/cmake/modules" \ | |||||
| || Panic "Git submodule add failed!" | |||||
| fi | |||||
| # Copy files | |||||
| Log " Copy files" | |||||
| srcDir="$ScriptDir/projects/helloworld" | |||||
| for file in $(find $srcDir -type f); do | |||||
| if [[ $file == $srcDir/build/* ]] \ | |||||
| || [[ $file == $srcDir/cmake/modules/* ]] | |||||
| then | |||||
| relFile=.${file/$srcDir/} | |||||
| Verbose " Ignore $relFile" | |||||
| elif [[ $UseGit -eq 0 ]] \ | |||||
| && [[ $file == $srcDir/.git* ]] | |||||
| then | |||||
| relFile=.${file/$srcDir/} | |||||
| Verbose " Ignore $relFile" | |||||
| else | |||||
| Copy "$srcDir" "$dir" "${file/$srcDir/}" "helloworld" "$name" | |||||
| fi | |||||
| done | |||||
| } | |||||
| # Parse arguments | |||||
| while [ $# -gt 0 ]; do | |||||
| case $1 in | |||||
| "-g" | "--group" ) | |||||
| if [ $# -lt 2 ]; then | |||||
| Panic "Parameter $1 expects exactly one parameter!" | |||||
| fi | |||||
| Operations+=("grp:$2") | |||||
| shift | |||||
| ;; | |||||
| "-l" | "--library" ) | |||||
| if [ $# -lt 3 ]; then | |||||
| Panic "Parameter $1 expects exactly two parameter!" | |||||
| fi | |||||
| Operations+=("lib:$2:$3") | |||||
| shift | |||||
| shift | |||||
| ;; | |||||
| "-e" | "--executable" ) | |||||
| if [ $# -lt 3 ]; then | |||||
| Panic "Parameter $1 expects exactly two parameter!" | |||||
| fi | |||||
| Operations+=("exe:$2:$3") | |||||
| shift | |||||
| shift | |||||
| ;; | |||||
| "-m" | "--modules" ) | |||||
| if [ $# -lt 2 ]; then | |||||
| Panic "Parameter $1 expects exactly one parameter!" | |||||
| fi | |||||
| CMakeModules="$2" | |||||
| shift | |||||
| ;; | |||||
| "-n" | "--nogit" ) | |||||
| UseGit=0 | |||||
| ;; | |||||
| "-v" | "--verbose" ) | |||||
| Verbose=1 | |||||
| ;; | |||||
| "-h" | "-?" | "--help" ) | |||||
| PrintHelp | |||||
| exit 0 | |||||
| ;; | |||||
| * ) | |||||
| Panic "Invalid or unknown parameter: $1" | |||||
| ;; | |||||
| esac | |||||
| shift | |||||
| done | |||||
| # Execute operations | |||||
| for data in "${Operations[@]}"; do | |||||
| op=$(echo $data | awk -F: '{ print $1 }') | |||||
| case $op in | |||||
| grp) | |||||
| dir=$(echo $data | awk -F: '{ print $2 }') | |||||
| CreateGroup "$dir" | |||||
| ;; | |||||
| lib) | |||||
| name=$(echo $data | awk -F: '{ print $2 }') | |||||
| dir=$(echo $data | awk -F: '{ print $3 }') | |||||
| CreateLibrary "$name" "$dir" | |||||
| ;; | |||||
| exe) | |||||
| name=$(echo $data | awk -F: '{ print $2 }') | |||||
| dir=$(echo $data | awk -F: '{ print $3 }') | |||||
| CreateExecutable "$name" "$dir" | |||||
| ;; | |||||
| *) | |||||
| Panic "Invalid or unknown operation: $op" | |||||
| ;; | |||||
| esac | |||||
| done | |||||