[cmake] Change external package rebuild policy (#9239)
author오형석/On-Device Lab(SR)/Staff Engineer/삼성전자 <hseok82.oh@samsung.com>
Thu, 28 Nov 2019 04:18:48 +0000 (13:18 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Thu, 28 Nov 2019 04:18:48 +0000 (13:18 +0900)
* [cmake] Change external package rebuild policy

- Divide build stamp and install stamp
- Introduce identifier and check version
- Skip if build stamp exists (build success/fail on  workspace)
- Skip if install stamp exists (installed)

Signed-off-by: Hyeongseok Oh <hseok82.oh@samsung.com>
infra/cmake/modules/ExternalBuildTools.cmake
infra/cmake/packages/FlatBuffersConfig.cmake
infra/cmake/packages/GTestConfig.cmake
infra/cmake/packages/ProtobufConfig.cmake

index 0c8e31d..391fd04 100644 (file)
@@ -1,21 +1,51 @@
 function(ExternalBuild_CMake)
+  # CMAKE_DIR   Path to cmake root script to build (required)
+  # BUILD_DIR   Path to build workspace (required)
+  # INSTALL_DIR Path to install (required)
+  # PKG_NAME    External package name word for logging and stamp file name (required)
+  # IDENTIFIER  String to identify package version (optional)
+  # BUILD_FLAGS Multiple argument to set compiler flag
+  # EXTRA_OPTS  Multiple argument to pass options, etc for cmake configuration
   include(CMakeParseArguments)
-  cmake_parse_arguments(ARG "" "CMAKE_DIR;BUILD_DIR;INSTALL_DIR;PKG_NAME" "BUILD_FLAGS;EXTRA_OPTS" ${ARGN})
+  cmake_parse_arguments(ARG
+                        ""
+                        "CMAKE_DIR;BUILD_DIR;INSTALL_DIR;PKG_NAME;IDENTIFIER"
+                        "BUILD_FLAGS;EXTRA_OPTS"
+                        ${ARGN}
+  )
 
-  set(STAMP_PATH "${ARG_INSTALL_DIR}/${ARG_PKG_NAME}.stamp")
-  set(LOG_PATH "${ARG_INSTALL_DIR}/${ARG_PKG_NAME}.log")
+  set(BUILD_STAMP_PATH "${ARG_BUILD_DIR}/${ARG_PKG_NAME}.stamp")
+  set(BUILD_LOG_PATH "${ARG_BUILD_DIR}/${ARG_PKG_NAME}.log")
+  set(INSTALL_STAMP_PATH "${ARG_INSTALL_DIR}/${ARG_PKG_NAME}.stamp")
+  set(INSTALL_LOG_PATH "${ARG_INSTALL_DIR}/${ARG_PKG_NAME}.log")
 
-  if(EXISTS ${STAMP_PATH})
-    return()
-  endif(EXISTS ${STAMP_PATH})
+  set(PKG_IDENTIFIER "")
+  if(${ARG_IDENTIFIER})
+    set(PKG_IDENTIFIER "${ARG_IDENTIFIER}")
+  endif(${ARG_IDENTIFIER})
+
+  # NOTE Do NOT retry build once it fails
+  if(EXISTS ${BUILD_STAMP_PATH})
+    file(READ ${BUILD_STAMP_PATH} READ_IDENTIFIER)
+    if("${READ_IDENTIFIER}" STREQUAL "${PKG_IDENTIFIER}")
+      return()
+    endif("${READ_IDENTIFIER}" STREQUAL "${PKG_IDENTIFIER}")
+  endif(EXISTS ${BUILD_STAMP_PATH})
+
+  # NOTE Do NOT build pre-installed exists
+  if(EXISTS ${INSTALL_STAMP_PATH})
+    file(READ ${INSTALL_STAMP_PATH} READ_IDENTIFIER)
+    if("${READ_IDENTIFIER}" STREQUAL "${PKG_IDENTIFIER}")
+      return()
+    endif("${READ_IDENTIFIER}" STREQUAL "${PKG_IDENTIFIER}")
+  endif(EXISTS ${INSTALL_STAMP_PATH})
 
   message(STATUS "Build ${ARG_PKG_NAME} from ${ARG_CMAKE_DIR}")
 
   file(MAKE_DIRECTORY ${ARG_BUILD_DIR})
   file(MAKE_DIRECTORY ${ARG_INSTALL_DIR})
 
-  # NOTE Do NOT retry Flatbuffers build once it fails
-  file(WRITE "${STAMP_PATH}")
+  file(WRITE "${BUILD_STAMP_PATH}" "${PKG_IDENTIFIER}")
 
   execute_process(COMMAND ${CMAKE_COMMAND}
                             -DCMAKE_INSTALL_PREFIX=${ARG_INSTALL_DIR}
@@ -23,24 +53,26 @@ function(ExternalBuild_CMake)
                             -DCMAKE_CXX_FLAGS=${ARG_BUILD_FLAGS}
                             ${ARG_EXTRA_OPTS}
                             ${ARG_CMAKE_DIR}
-                  OUTPUT_FILE ${LOG_PATH}
-                  ERROR_FILE ${LOG_PATH}
+                  OUTPUT_FILE ${BUILD_LOG_PATH}
+                  ERROR_FILE ${BUILD_LOG_PATH}
                   WORKING_DIRECTORY ${ARG_BUILD_DIR}
                   RESULT_VARIABLE BUILD_EXITCODE)
 
   if(NOT BUILD_EXITCODE EQUAL 0)
-    message(FATAL_ERROR "${ARG_PKG_NAME} Package: Build failed (check '${LOG_PATH}' for details)")
+    message(FATAL_ERROR "${ARG_PKG_NAME} Package: Build failed (check '${BUILD_LOG_PATH}' for details)")
   endif(NOT BUILD_EXITCODE EQUAL 0)
 
   execute_process(COMMAND ${CMAKE_COMMAND} --build . -- install
-                  OUTPUT_FILE ${LOG_PATH}
-                  ERROR_FILE ${LOG_PATH}
+                  OUTPUT_FILE ${INSTALL_LOG_PATH}
+                  ERROR_FILE ${INSTALL_LOG_PATH}
                   WORKING_DIRECTORY ${ARG_BUILD_DIR}
                   RESULT_VARIABLE INSTALL_EXITCODE)
 
   if(NOT INSTALL_EXITCODE EQUAL 0)
-    message(FATAL_ERROR "${ARG_PKG_NAME} Package: Installation failed (check '${LOG_PATH}' for details)")
+    message(FATAL_ERROR "${ARG_PKG_NAME} Package: Installation failed (check '${INSTALL_LOG_PATH}' for details)")
   endif(NOT INSTALL_EXITCODE EQUAL 0)
 
+  file(WRITE "${INSTALL_STAMP_PATH}" "${PKG_IDENTIFIER}")
+
   message(STATUS "${ARG_PKG_NAME} Package: Done")
 endfunction(ExternalBuild_CMake)
index a0e9356..ed3f466 100644 (file)
@@ -25,6 +25,7 @@ function(_FlatBuffers_build)
                       BUILD_DIR   ${CMAKE_BINARY_DIR}/externals/FLATBUFFERS/build
                       INSTALL_DIR ${NNAS_OVERLAY_DIR}
                       BUILD_FLAGS ${ADDITIONAL_CXX_FLAGS}
+                      IDENTIFIER  "1.10"
                       PKG_NAME    "FLATBUFFERS")
 
 endfunction(_FlatBuffers_build)
index bcec282..9c74e57 100644 (file)
@@ -13,6 +13,7 @@ function(_GTest_build)
   ExternalBuild_CMake(CMAKE_DIR   ${GTestSource_DIR}
                       BUILD_DIR   ${CMAKE_BINARY_DIR}/externals/GTEST/build
                       INSTALL_DIR ${NNAS_OVERLAY_DIR}
+                      IDENTIFIER  "1.8.0"
                       PKG_NAME    "GTEST")
 
 endfunction(_GTest_build)
index 5be9ade..f517b49 100644 (file)
@@ -58,6 +58,7 @@ function(_Protobuf_build)
                       INSTALL_DIR ${NNAS_OVERLAY_DIR}
                       BUILD_FLAGS -fPIC
                       EXTRA_OPTS  -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_WITH_ZLIB=OFF
+                      IDENTIFIER  "3.5.2"
                       PKG_NAME    "PROTOBUF")
 
 endfunction(_Protobuf_build)