diff --git a/.gitignore b/.gitignore index 259148fa..58da27f3 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,8 @@ *.exe *.out *.app + +# CMake results +/bin +/build64_debug +/build64_release diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..788f39dd --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "tdd_intro/3rd_party/googletest"] + path = tdd_intro/3rd_party/googletest + url = https://github.com/google/googletest.git diff --git a/GetSubdirList.cmake b/GetSubdirList.cmake new file mode 100644 index 00000000..55aafe4b --- /dev/null +++ b/GetSubdirList.cmake @@ -0,0 +1,11 @@ +MACRO(GETSUBDIRLIST result curdir) + file(GLOB children RELATIVE ${curdir} ${curdir}/*) + set(dirlist "") + foreach(child ${children}) + if(IS_DIRECTORY ${curdir}/${child} + AND NOT "CMakeFiles" STREQUAL ${child}) + list(APPEND dirlist ${child}) + endif() + endforeach() + set(${result} ${dirlist}) +ENDMACRO(GETSUBDIRLIST) diff --git a/build_debug.bat b/build_debug.bat new file mode 100644 index 00000000..39f46130 --- /dev/null +++ b/build_debug.bat @@ -0,0 +1,7 @@ +cmake -Htdd_intro -Bbuild64_debug -G"Visual Studio 14 2015 Win64" || goto :eof +cmake --build build64_debug --target install --config Debug || echo build64_debug failed && goto :eof + +:: to run tests +pushd build64_debug +ctest -VV -C Debug || echo Unit-tests failed && popd && goto :eof +popd \ No newline at end of file diff --git a/build_release.bat b/build_release.bat new file mode 100644 index 00000000..3bedc568 --- /dev/null +++ b/build_release.bat @@ -0,0 +1,7 @@ +cmake -Htdd_intro -Bbuild64_release -G"Visual Studio 14 2015 Win64" || goto :eof +cmake --build build64_release --target install --config Release || echo build64_release failed && goto :eof + +:: to run tests +pushd build64_release +ctest -C Release || echo Unit-tests failed && popd && goto :eof +popd \ No newline at end of file diff --git a/tdd_intro/3rd_party/googletest b/tdd_intro/3rd_party/googletest new file mode 160000 index 00000000..f5edb4f5 --- /dev/null +++ b/tdd_intro/3rd_party/googletest @@ -0,0 +1 @@ +Subproject commit f5edb4f542e155c75bc4b516f227911d99ec167c diff --git a/tdd_intro/CMakeLists.txt b/tdd_intro/CMakeLists.txt new file mode 100644 index 00000000..73ce01f0 --- /dev/null +++ b/tdd_intro/CMakeLists.txt @@ -0,0 +1,33 @@ +cmake_minimum_required(VERSION 3.0) +project(tdd-course-3) + +# to run tests after build +enable_testing() + +# to enable GETSUBDIRLIST macro +set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/..") +include(GetSubdirList) + +# turn on using solution folders for IDE +set_property(GLOBAL PROPERTY USE_FOLDERS ON) + +# Compiler flags +# /MT, /MTd - for static linkage +# /W4 - warning level 4 +# /MP - to compile by several threads +set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT") +set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4 /MP") + +# add gtest and gmock as subprojects +add_subdirectory(3rd_party/googletest EXCLUDE_FROM_ALL) + +# organize targets in an IDE +set_target_properties(gtest gtest_main gmock_main PROPERTIES FOLDER 3rd-party/GTest) + +include_directories(3rd_party/googletest/googletest/include) +include_directories(3rd_party/googletest/googlemock/include) + +add_subdirectory(homework) +add_subdirectory(demo) +add_subdirectory(cleanroom) diff --git a/tdd_intro/cleanroom/CMakeLists.txt b/tdd_intro/cleanroom/CMakeLists.txt new file mode 100644 index 00000000..8bc753e3 --- /dev/null +++ b/tdd_intro/cleanroom/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required(VERSION 3.0) + +# add subproject +add_subdirectory(chatclient) +set_target_properties(chatclient chatclient_test PROPERTIES FOLDER cleanroom) diff --git a/tdd_intro/cleanroom/chatclient/CMakeLists.txt b/tdd_intro/cleanroom/chatclient/CMakeLists.txt new file mode 100644 index 00000000..390af373 --- /dev/null +++ b/tdd_intro/cleanroom/chatclient/CMakeLists.txt @@ -0,0 +1,30 @@ +cmake_minimum_required(VERSION 3.0) +project(chatclient) + +add_library( + chatclient + igui.h + isocketwrapper.h + socketwrapper.h + socketwrapper.cpp +) +target_link_libraries(chatclient Ws2_32.lib Mswsock.lib AdvApi32.lib) + +add_executable( + chatclient_test + mocks.h + socketwrappertest.cpp + test.cpp +) +target_link_libraries(chatclient_test chatclient gtest_main gmock_main) + +add_test( + NAME chatclient_test + COMMAND chatclient_test +) + +install(TARGETS + chatclient + chatclient_test + DESTINATION ${CMAKE_SOURCE_DIR}/../bin +) diff --git a/tdd_intro/demo/CMakeLists.txt b/tdd_intro/demo/CMakeLists.txt new file mode 100644 index 00000000..6403edfe --- /dev/null +++ b/tdd_intro/demo/CMakeLists.txt @@ -0,0 +1,23 @@ +cmake_minimum_required(VERSION 3.0) + +GETSUBDIRLIST(PROJECTS ${CMAKE_CURRENT_SOURCE_DIR}) + +foreach(PROJ ${PROJECTS}) + project(${PROJ}) + + if(${PROJ} STREQUAL "01_bob") + # Steps.cpp contains compile errors + FILE(GLOB SOURCES_FILES ${PROJ}/test.cpp) + else() + FILE(GLOB SOURCES_FILES ${PROJ}/*.h ${PROJ}/*.cpp) + endif() + + add_executable(${PROJ} ${SOURCES_FILES}) + target_link_libraries(${PROJ} gtest_main gmock_main) + + add_test(NAME ${PROJ} COMMAND ${PROJ}) +endforeach() + +set_target_properties(${PROJECTS} PROPERTIES FOLDER demo) + +install(TARGETS ${PROJECTS} DESTINATION ${CMAKE_SOURCE_DIR}/../bin) diff --git a/tdd_intro/homework/CMakeLists.txt b/tdd_intro/homework/CMakeLists.txt new file mode 100644 index 00000000..d43f47cd --- /dev/null +++ b/tdd_intro/homework/CMakeLists.txt @@ -0,0 +1,17 @@ +cmake_minimum_required(VERSION 3.0) + +GETSUBDIRLIST(PROJECTS ${CMAKE_CURRENT_SOURCE_DIR}) + +foreach(PROJ ${PROJECTS}) + project(${PROJ}) + + FILE(GLOB SOURCES_FILES ${PROJ}/*.h ${PROJ}/*.cpp) + add_executable(${PROJ} ${SOURCES_FILES}) + target_link_libraries(${PROJ} gtest_main gmock_main) + + add_test(NAME ${PROJ} COMMAND ${PROJ}) +endforeach() + +set_target_properties(${PROJECTS} PROPERTIES FOLDER homework) + +install(TARGETS ${PROJECTS} DESTINATION ${CMAKE_SOURCE_DIR}/../bin)