├── .gitignore ├── CMakeLists-ExternalProjects.txt ├── CMakeLists.txt ├── README.rst └── src ├── app1 ├── CMakeLists.txt └── src │ └── main.cpp ├── app2 ├── CMakeLists.txt └── src │ └── main.cpp ├── lib1 ├── CMakeLists.txt ├── include │ └── lib1 │ │ └── api.h └── src │ └── lib1.cpp └── lib2 ├── CMakeLists.txt ├── include └── lib2 │ └── api.h └── src └── lib2.cpp /.gitignore: -------------------------------------------------------------------------------- 1 | 3rdparty/humblelogging 2 | 3rdparty/protobuf -------------------------------------------------------------------------------- /CMakeLists-ExternalProjects.txt: -------------------------------------------------------------------------------- 1 | include(ExternalProject) 2 | 3 | # Builds external third party projects. 4 | # The parent script needs to define the "GLOBAL_OUTPUT_PATH" variable, 5 | # which will be used as output directory for all *.lib, *.dll, *.a, *.so, *.pdb files. 6 | 7 | ############################################################################### 8 | # HumbleLogging 9 | ############################################################################### 10 | 11 | ExternalProject_Add( 12 | HumbleLogging 13 | 14 | GIT_REPOSITORY "https://github.com/mfreiholz/humble-logging-library.git" 15 | GIT_TAG "master" 16 | 17 | UPDATE_COMMAND "" 18 | PATCH_COMMAND "" 19 | 20 | SOURCE_DIR "${CMAKE_SOURCE_DIR}/3rdparty/humblelogging" 21 | CMAKE_ARGS -DBuildShared=ON -DBuildExamples=OFF -DCMAKE_INSTALL_PREFIX=${GLOBAL_OUTPUT_PATH}/humblelogging 22 | 23 | TEST_COMMAND "" 24 | ) 25 | 26 | ExternalProject_Add_Step( 27 | HumbleLogging CopyToBin 28 | COMMAND ${CMAKE_COMMAND} -E copy_directory ${GLOBAL_OUTPUT_PATH}/humblelogging/bin ${GLOBAL_OUTPUT_PATH} 29 | COMMAND ${CMAKE_COMMAND} -E copy_directory ${GLOBAL_OUTPUT_PATH}/humblelogging/lib ${GLOBAL_OUTPUT_PATH} 30 | DEPENDEES install 31 | ) 32 | 33 | set(HumbleLogging_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/3rdparty/humblelogging/include") 34 | set(HumbleLogging_LIBRARIES "${CMAKE_SHARED_LIBRARY_PREFIX}humblelogging${CMAKE_SHARED_LIBRARY_SUFFIX}") 35 | include_directories(${HumbleLogging_INCLUDE_DIRS}) 36 | 37 | ############################################################################### 38 | # Google Prototype Buffers (protobuf) 39 | # VS2008 Issue: Doesn't support OutDir/OutputPath 40 | ############################################################################### 41 | 42 | #if(WIN32) 43 | # 44 | # ExternalProject_Add( 45 | # protobuf 46 | # 47 | # URL https://protobuf.googlecode.com/files/protobuf-2.5.0.tar.gz 48 | # 49 | # UPDATE_COMMAND "" 50 | # PATCH_COMMAND "" 51 | # 52 | # SOURCE_DIR "${CMAKE_SOURCE_DIR}/3rdparty/protobuf" 53 | # CONFIGURE_COMMAND "" 54 | # 55 | # BUILD_COMMAND devenv /upgrade ${CMAKE_SOURCE_DIR}/3rdparty/protobuf/vsprojects/protobuf.sln 56 | # COMMAND msbuild /p:OutputPath=${GLOBAL_OUTPUT_PATH}/protobuf/ /p:OutDir=${GLOBAL_OUTPUT_PATH}/protobuf/ ${CMAKE_SOURCE_DIR}/3rdparty/protobuf/vsprojects/protobuf.sln 57 | # 58 | # INSTALL_COMMAND "" 59 | # 60 | # TEST_COMMAND "" 61 | # ) 62 | # 63 | # ExternalProject_Add_Step( 64 | # protobuf CopyToBin 65 | # COMMAND ${CMAKE_COMMAND} -E copy_directory ${GLOBAL_OUTPUT_PATH}/protobuf ${GLOBAL_OUTPUT_PATH} 66 | # DEPENDEES install 67 | # ) 68 | # 69 | # set(protobuf_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/3rdparty/protobuf/src/google/protobuf) 70 | # set(protobuf_LIBRARIES ${CMAKE_SHARED_LIBRARY_PREFIX}protobuf${CMAKE_SHARED_LIBRARY_SUFFIX}) 71 | # include_directories(${protobuf_INCLUDE_DIRS}) 72 | # 73 | #else(WIN32) 74 | # 75 | # ExternalProject_Add( 76 | # protobuf 77 | # 78 | # URL https://protobuf.googlecode.com/files/protobuf-2.5.0.tar.gz 79 | # 80 | # UPDATE_COMMAND "" 81 | # PATCH_COMMAND "" 82 | # 83 | # SOURCE_DIR "${CMAKE_SOURCE_DIR}/3rdparty/protobuf" 84 | # CONFIGURE_COMMAND "${CMAKE_SOURCE_DIR}/3rdparty/protobuf/configure" --prefix=${GLOBAL_OUTPUT_PATH}/protobuf 85 | # 86 | # BUILD_COMMAND make 87 | # 88 | # INSTALL_COMMAND make install 89 | # 90 | # TEST_COMMAND "" 91 | # ) 92 | # 93 | # ExternalProject_Add_Step( 94 | # protobuf CopyToBin 95 | # COMMAND ${CMAKE_COMMAND} -E copy_directory ${GLOBAL_OUTPUT_PATH}/protobuf ${GLOBAL_OUTPUT_PATH} 96 | # DEPENDEES install 97 | # ) 98 | # 99 | # set(protobuf_INCLUDE_DIRS ${GLOBAL_OUTPUT_PATH}/protobuf/include) 100 | # set(protobuf_LIBRARIES ${GLOBAL_OUTPUT_PATH}/protobuff/lib/) 101 | # include_directories(${protobuf_INCLUDE_DIRS}) 102 | # 103 | #endif(WIN32) 104 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.8.4) 2 | project(bigprojecttest) 3 | 4 | 5 | # Global settings 6 | set(GLOBAL_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) 7 | set(CMAKE_INSTALL_PREFIX ${PROJECT_BINARY_DIR}/install) 8 | 9 | # Sets global output directory for single configuration (GCC) 10 | set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${GLOBAL_OUTPUT_PATH}) 11 | set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${GLOBAL_OUTPUT_PATH}) 12 | set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${GLOBAL_OUTPUT_PATH}) 13 | 14 | # Sets global output directory for sub-configurations (msvc, mingw) 15 | foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES}) 16 | string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG) 17 | set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${GLOBAL_OUTPUT_PATH}) 18 | set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${GLOBAL_OUTPUT_PATH}) 19 | set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${GLOBAL_OUTPUT_PATH}) 20 | endforeach(OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES) 21 | 22 | 23 | # 3rdparty Libraries 24 | include(CMakeLists-ExternalProjects.txt) 25 | 26 | 27 | # Global compiler flags 28 | # -std=c++11 => Used by HumbleLogging 29 | if(CMAKE_COMPILER_IS_GNUCXX) 30 | set(CMAKE_CXX_FLAGS -std=c++11) 31 | else() 32 | add_definitions(-DWIN32) # TMP 33 | endif() 34 | 35 | 36 | # Global link directories 37 | link_directories(${GLOBAL_OUTPUT_PATH}) 38 | 39 | 40 | # Libraries (+ their includes) 41 | add_subdirectory(src/lib1) 42 | include_directories(src/lib1/include) 43 | 44 | add_subdirectory(src/lib2) 45 | include_directories(src/lib2/include) 46 | 47 | 48 | # Applications 49 | add_subdirectory(src/app1) 50 | add_subdirectory(src/app2) 51 | 52 | 53 | # Installation 54 | # Copies files from build directory into install directory. 55 | file(GLOB executables "${GLOBAL_OUTPUT_PATH}/*.exe") 56 | install(FILES ${executables} DESTINATION "bin") 57 | 58 | file(GLOB libraries "${GLOBAL_OUTPUT_PATH}/*.dll") 59 | install(FILES ${libraries} DESTINATION "bin") 60 | 61 | 62 | # SDK Installation 63 | install(DIRECTORY "src/lib1/include/" DESTINATION "include" FILES_MATCHING PATTERN "*.h") 64 | install(DIRECTORY "src/lib2/include/" DESTINATION "include" FILES_MATCHING PATTERN "*.h") 65 | 66 | 67 | 68 | 69 | # DEV STUFF 70 | # 71 | #install(TARGETS lib1 lib2 app1 app2 72 | # RUNTIME DESTINATION ${INSTALL_PATH}/bin 73 | # LIBRARY DESTINATION ${INSTALL_PATH}/bin 74 | # ARCHIVE DESTINATION ${INSTALL_PATH}/bin 75 | #) -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | This project serves as an example/test on how to use ExternalProject_Add 2 | Feel free to contribute suggestions. 3 | 4 | 5 | How to build 6 | ============ 7 | The project does not have any dependency you have to setup manually. 8 | Just type the following commands. 9 | :: 10 | 11 | cd $PROJECT_DIRECTORY 12 | mkdir build 13 | cd build 14 | cmake .. 15 | make 16 | 17 | -------------------------------------------------------------------------------- /src/app1/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # app1 2 | file(GLOB app1_sources src/*.cpp) 3 | add_executable(app1 ${app1_sources}) 4 | target_link_libraries(app1 lib1) -------------------------------------------------------------------------------- /src/app1/src/main.cpp: -------------------------------------------------------------------------------- 1 | #include "lib1/api.h" 2 | 3 | int main(int argc, char **argv) 4 | { 5 | lib1func(); 6 | return 0; 7 | } -------------------------------------------------------------------------------- /src/app2/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # app2 2 | file(GLOB app2_sources src/*.cpp) 3 | add_executable(app2 ${app2_sources}) 4 | target_link_libraries(app2 lib2) -------------------------------------------------------------------------------- /src/app2/src/main.cpp: -------------------------------------------------------------------------------- 1 | 2 | int main(int argc, char **argv) 3 | { 4 | return 0; 5 | } -------------------------------------------------------------------------------- /src/lib1/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # lib1 2 | include_directories(include) 3 | file(GLOB lib1_headers include/lib1/*.h) 4 | file(GLOB lib1_sources src/*.cpp) 5 | add_library(lib1 SHARED ${lib1_headers} ${lib1_sources}) 6 | 7 | # Link against external project "humblelogging" 8 | target_link_libraries(lib1 ${HumbleLogging_LIBRARIES}) 9 | add_dependencies(lib1 HumbleLogging) -------------------------------------------------------------------------------- /src/lib1/include/lib1/api.h: -------------------------------------------------------------------------------- 1 | #ifndef LIB1API_HEADER 2 | #define LIB1API_HEADER 3 | 4 | #ifdef WIN32 5 | #define LIB1_API __declspec(dllexport) 6 | #else 7 | #define LIB1_API 8 | #endif 9 | 10 | LIB1_API void lib1func(); 11 | 12 | #endif -------------------------------------------------------------------------------- /src/lib1/src/lib1.cpp: -------------------------------------------------------------------------------- 1 | #include "lib1/api.h" 2 | #include 3 | #include "humblelogging/api.h" 4 | 5 | using namespace humble::logging; 6 | 7 | HUMBLE_LOGGER(HL, "lib1"); 8 | 9 | void lib1func() 10 | { 11 | // Initialize humble logging. 12 | Factory &fac = Factory::getInstance(); 13 | 14 | // Change the default LogLevel, which every NEW Logger will have. 15 | fac.setDefaultLogLevel(LogLevel::All); 16 | 17 | // Change the default Formatter (optional). 18 | fac.setDefaultFormatter(new PatternFormatter("[%date] [%lls] [line=%line] [file=%filename] %m\n")); 19 | 20 | // Add Appender which doesn't log anywhere. 21 | fac.registerAppender(new NullAppender()); 22 | 23 | // Add Appender which logs to STDOUT. 24 | ConsoleAppender *consoleAppender = new ConsoleAppender(); 25 | fac.registerAppender(consoleAppender); 26 | 27 | fprintf(stdout, "lib1func\n"); 28 | HL_DEBUG(HL, "lib1func logging"); 29 | } -------------------------------------------------------------------------------- /src/lib2/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # lib2 2 | include_directories(include) 3 | file(GLOB lib2_headers include/lib2/*.h) 4 | file(GLOB lib2_sources src/*.cpp) 5 | add_library(lib2 SHARED ${lib2_headers} ${lib2_sources}) -------------------------------------------------------------------------------- /src/lib2/include/lib2/api.h: -------------------------------------------------------------------------------- 1 | #ifndef LIB2API_HEADER 2 | #define LIB2API_HEADER 3 | 4 | #ifdef WIN32 5 | #define LIB2_API __declspec(dllexport) 6 | #else 7 | #define LIB2_API 8 | #endif 9 | 10 | LIB2_API void lib2func(); 11 | 12 | #endif -------------------------------------------------------------------------------- /src/lib2/src/lib2.cpp: -------------------------------------------------------------------------------- 1 | #include "lib2/api.h" 2 | #include 3 | 4 | void lib2func() 5 | { 6 | fprintf(stdout, "lib2func\n"); 7 | } --------------------------------------------------------------------------------