Large updates to webserver

Do not merge yet

Change-Id: I38c56844c1b0e3e8e5493c2705e62e6db7ee2102
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 45cefec..a6fc351 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -3,15 +3,12 @@
 cmake_policy(SET CMP0054 NEW)
 
 set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})
+message(CMAKE_MODULE_PATH=${CMAKE_MODULE_PATH})
 
-message("${CMAKE_MODULE_PATH}")
+option(BUILD_STATIC_LIBS "Built static libraries" ON)
 
-SET(BUILD_SHARED_LIBRARIES OFF)
-
-#SET(HUNTER_STATUS_DEBUG ON)
 option(HUNTER_ENABLED "Enable hunter package pulling" OFF)
-#SET(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} -fno-rtti")
-#SET(CMAKE_C_FLAGS  "${CMAKE_C_FLAGS} -fno-rtti")
+
 include("cmake/HunterGate.cmake")
 HunterGate(
     URL "https://github.com/ruslo/hunter/archive/v0.18.64.tar.gz"
@@ -27,74 +24,19 @@
 
 set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
 
-if (MSAN)
-  if(NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang")
-    message(FATAL_ERROR "Cannot enable MSAN unless using Clang")
-  endif()
-
-  if (ASAN)
-    message(FATAL_ERROR "ASAN and MSAN are mutually exclusive")
-  endif()
-
-  SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MSAN_CXX_FLAGS}")
-  SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${MSAN_LINKER_EXE_FLAGS}")
-
-  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=memory -fsanitize-memory-track-origins -fno-omit-frame-pointer")
-  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=memory -fsanitize-memory-track-origins -fno-omit-frame-pointer")
-  set(OPENSSL_NO_ASM "1")
-  set(LIBC++ ON)
-endif(MSAN)
-
-if (ASAN)
-  if(NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang")
-    message(FATAL_ERROR "Cannot enable ASAN unless using Clang")
-  endif()
-
-  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fsanitize-address-use-after-scope -fno-omit-frame-pointer")
-  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fsanitize-address-use-after-scope -fno-omit-frame-pointer")
-  set(OPENSSL_NO_ASM "1")
-endif(ASAN)
-
-if (GCOV)
-  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage")
-  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
-endif(GCOV)
-
-if ( ${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR} )
-    message( FATAL_ERROR "In-source builds not allowed. Please make a new directory (usually called build) and run CMake from there. You may need to remove CMakeCache.txt." )
-endif()
-
-if(LIBC++)
-  SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
-  SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lc++abi")
-  if (MSAN)
-    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I/home/ed/libcxx_msan/include -I/home/ed/libcxx_msan/include/c++/v1")
-    SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/home/ed/libcxx_msan/lib -Wl,-rpath,I/home/ed/libcxx_msan/lib")
-  endif(MSAN)
-endif(LIBC++)
-
-#SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -Wall")
+SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -Werror -Wall")
 
 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti")
 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-rtti")
 
 # general
-option(BUILD_SHARED_LIBS "Build as shared library" OFF)
-option(BUILD_UT "Enable Unit test" ON)
-
-# This needs to be before the crow and other module includes so headers get overriden correctly
-include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
+option(BMCWEB_BUILD_UT "Enable Unit test" ON)
 
 # security flags
-#SET(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} -fstack-protector-strong -fPIE -fPIC -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security" )
-#SET(CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} -z noexecstack -z relro -z now")
-
-# Boost
-#add_definitions(-DBOOST_NO_RTTI -DBOOST_NO_TYPEID)
-
-# TinyXML2
-#add_subdirectory(tinyxml2)
-#include_directories(tinyxml2)
+SET(SECURITY_FLAGS " -fstack-protector-strong -fPIE -fPIC -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security")
+SET(CMAKE_CXX_FLAGS_RELEASE  "${CMAKE_CXX_FLAGS_RELEASE} ${SECURITY_FLAGS}" )
+SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO  "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} ${SECURITY_FLAGS}" )
+SET(CMAKE_C_FLAGS_MINSIZEREL  "${CMAKE_C_FLAGS_MINSIZEREL} ${SECURITY_FLAGS}" )
 
 #add_definitions(-DBOOST_ASIO_ENABLE_HANDLER_TRACKING)
 add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)
@@ -104,7 +46,7 @@
 add_definitions(-DBOOST_NO_TYPEID)
 #set(Boost_USE_STATIC_LIBS ON)
 hunter_add_package(Boost)
-find_package(Boost REQUIRED)
+find_package(Boost)
 include_directories(${Boost_INCLUDE_DIRS}) 
 
 #Openssl
@@ -113,18 +55,6 @@
 include_directories(${OPENSSL_INCLUDE_DIR})
 message("OPENSSL_INCLUDE_DIR ${OPENSSL_INCLUDE_DIR}")
 
-#lib jpeg
-set(BUILD_STATIC ON)
-#include_directories(libjpeg)
-#include_directories(${CMAKE_CURRENT_BINARY_DIR}/libjpeg)
-#add_subdirectory(libjpeg)
-
-
-# dbus
-hunter_add_package(dbus)
-find_package(dbus REQUIRED) # Include functions provided by PkgConfig module.
-include_directories(${DBUS_INCLUDE_DIRS})
-
 # Crow
 #add_definitions(-DCROW_DISABLE_LOGGING)
 add_definitions(-DCROW_ENABLE_SSL)
@@ -135,31 +65,24 @@
 find_package(ZLIB REQUIRED)
 include_directories(${ZLIB_INCLUDE_DIRS})
 
+#tinyxml2
+add_subdirectory(tinyxml2)
 
 # PAM
-find_package(PAM REQUIRED)
+option(WEBSERVER_ENABLE_PAM "enable pam authentication" ON)
+if ("${WEBSERVER_ENABLE_PAM}")
+    find_package(PAM REQUIRED)
+else()
+    add_definitions("-DWEBSERVER_DISABLE_PAM")
+endif()
+
 
 # Boost-dbus
-if(${BUILD_UT})
-    add_subdirectory(boost-dbus)
-endif()
-include_directories(boost-dbus/include)
+set(BOOST_DBUS_BUILD_UT ${BMCWEB_BUILD_UT})
+add_subdirectory(boost-dbus)
 
 set(WEBSERVER_MAIN src/webserver_main.cpp)
 
-set(HDR_FILES
-    include/ssl_key_handler.hpp
-)
-
-set(GENERATED_SRC_FILES 
-    ${CMAKE_BINARY_DIR}/generated/webassets.cpp
-    ${CMAKE_BINARY_DIR}/generated/webassets.hpp
-)
-
-include_directories(${CMAKE_BINARY_DIR}/generated)
-
-set_source_files_properties(${GENERATED_SRC_FILES} PROPERTIES GENERATED TRUE)
-
 # the webassets file has a non-ideal beahvior, where it loads binary data into a std::string
 # due to the way crow is constructed.  This causes GCC warnings.  Filter them out.
 if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
@@ -168,78 +91,87 @@
     endif(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.9)
 endif()
 
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
 
 set(SRC_FILES
     src/base64.cpp
     ${GENERATED_SRC_FILES}
 )
 
-set(UT_FILES
-    src/crow_test.cpp
-    src/gtest_main.cpp
-    src/base64_test.cpp
-    src/token_authorization_middleware_test.cpp
-    src/security_headers_middleware_test.cpp
-    src/webassets_test.cpp
-    src/crow_getroutes_test.cpp
-    src/ast_jpeg_decoder_test.cpp
-    src/kvm_websocket_test.cpp
-    src/test_utils.cpp
-    src/msan_test.cpp
-    src/ci_map_tests.cpp
-    src/ast_video_puller_test.cpp
-    ${CMAKE_BINARY_DIR}/generated/blns.hpp
-)
-
-
-file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/generated")
-
 file(COPY src/test_resources DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
 
+file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/generated)
+
 # Unit Tests
-if(${BUILD_UT})
+if(${BMCWEB_BUILD_UT})
+    set(UT_FILES
+        src/crow_test.cpp
+        src/gtest_main.cpp
+        src/base64_test.cpp
+        src/token_authorization_middleware_test.cpp
+        src/security_headers_middleware_test.cpp
+        src/webassets_test.cpp
+        src/crow_getroutes_test.cpp
+        src/ast_jpeg_decoder_test.cpp
+        src/kvm_websocket_test.cpp
+        src/msan_test.cpp
+        src/ci_map_tests.cpp
+        src/ast_video_puller_test.cpp
+        ${CMAKE_BINARY_DIR}/generated/blns.hpp
+    )
     # big list of naughty strings
     add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/generated/blns.hpp
         COMMAND xxd -i ${CMAKE_CURRENT_SOURCE_DIR}/src/test_resources/blns ${CMAKE_BINARY_DIR}/generated/blns.hpp)
-
+    
+    set_source_files_properties(${CMAKE_BINARY_DIR}/generated/blns.hpp
+        PROPERTIES GENERATED TRUE)
     # googletest
     enable_testing()
 
-    #hunter_add_package(GTest)
-    add_subdirectory(googletest)
+    hunter_add_package(GTest)
+    find_package(GTest REQUIRED)
     #find_package(GMock CONFIG REQUIRED)
 
-    add_executable(webtest ${HDR_FILES} ${SRC_FILES} ${UT_FILES})
+    add_executable(webtest ${SRC_FILES} ${UT_FILES})
     target_link_libraries(webtest gmock gtest)
     target_link_libraries(webtest pthread)
-    
+    target_link_libraries(webtest boost-dbus)
     target_link_libraries(webtest ${OPENSSL_LIBRARIES})
     target_link_libraries(webtest ${ZLIB_LIBRARIES})
     target_link_libraries(webtest pam)
-    add_dependencies(webtest packagestaticcpp)
+    add_dependencies(webtest tinyxml2_static)
+    target_link_libraries(webtest tinyxml2_static)
+    target_link_libraries(webtest -lstdc++fs)
     add_test(webtest webtest "--gtest_output=xml:webtest.xml")
 
-endif(${BUILD_UT})
+endif(${BMCWEB_BUILD_UT})
 
 # web static assets
-add_subdirectory(static)
-
+#add_subdirectory(static)
 
 # bmcweb
 add_executable(bmcweb ${WEBSERVER_MAIN} ${HDR_FILES} ${SRC_FILES})
+target_link_libraries(bmcweb boost-dbus)
 target_link_libraries(bmcweb pthread)
 target_link_libraries(bmcweb ${OPENSSL_LIBRARIES})
 target_link_libraries(bmcweb ${ZLIB_LIBRARIES})
-target_link_libraries(bmcweb  ${DBUS_LIBRARIES})
 target_link_libraries(bmcweb pam)
-add_dependencies(bmcweb packagestaticcpp)
-install (TARGETS bmcweb DESTINATION bin)
+target_link_libraries(bmcweb -lstdc++fs)
+add_dependencies(bmcweb tinyxml2_static)
+target_link_libraries(bmcweb tinyxml2_static)
+install(TARGETS bmcweb DESTINATION bin)
 
 add_executable(getvideo src/getvideo_main.cpp)
 target_link_libraries(getvideo pthread)
 
 # Visual Studio Code helper
 # this needs to be at the end to make sure all includes are handled correctly
-
+include(CMakeExtraGeneratorDetermineCompilerMacrosAndIncludeDirs)
 get_property(C_INCLUDE_DIRS DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES)
-execute_process(COMMAND python3 ${CMAKE_CURRENT_SOURCE_DIR}/scripts/prime_vscode_compile_db.py ${C_INCLUDE_DIRS})
+
+execute_process(
+    COMMAND python3 ${CMAKE_CURRENT_SOURCE_DIR}/scripts/prime_vscode_compile_db.py 
+    ${C_INCLUDE_DIRS} 
+    ${CMAKE_EXTRA_GENERATOR_C_SYSTEM_INCLUDE_DIRS} 
+    ${CMAKE_EXTRA_GENERATOR_CXX_SYSTEM_INCLUDE_DIRS}
+)