From 02a80bd60967423dea58faea0896b055ea77e9c3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=EC=98=A4=ED=98=95=EC=84=9D/On-Device=20Lab=28SR=29/Staff?= =?utf8?q?=20Engineer/=EC=82=BC=EC=84=B1=EC=A0=84=EC=9E=90?= Date: Wed, 27 Nov 2019 10:05:22 +0900 Subject: [PATCH] [cmake] Introduce external package build helper (#9210) Introduce cmake helper function for external package build and install in overlay directory Signed-off-by: Hyeongseok Oh --- infra/cmake/modules/ExternalBuildTools.cmake | 46 ++++++++++++++++++++++++ infra/cmake/packages/FlatBuffersConfig.cmake | 47 ++++--------------------- infra/cmake/packages/GTestConfig.cmake | 48 +++---------------------- infra/cmake/packages/ProtobufConfig.cmake | 52 ++++------------------------ 4 files changed, 65 insertions(+), 128 deletions(-) create mode 100644 infra/cmake/modules/ExternalBuildTools.cmake diff --git a/infra/cmake/modules/ExternalBuildTools.cmake b/infra/cmake/modules/ExternalBuildTools.cmake new file mode 100644 index 0000000..0c8e31d --- /dev/null +++ b/infra/cmake/modules/ExternalBuildTools.cmake @@ -0,0 +1,46 @@ +function(ExternalBuild_CMake) + include(CMakeParseArguments) + cmake_parse_arguments(ARG "" "CMAKE_DIR;BUILD_DIR;INSTALL_DIR;PKG_NAME" "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") + + if(EXISTS ${STAMP_PATH}) + return() + endif(EXISTS ${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}") + + execute_process(COMMAND ${CMAKE_COMMAND} + -DCMAKE_INSTALL_PREFIX=${ARG_INSTALL_DIR} + -DCMAKE_BUILD_TYPE=Release + -DCMAKE_CXX_FLAGS=${ARG_BUILD_FLAGS} + ${ARG_EXTRA_OPTS} + ${ARG_CMAKE_DIR} + OUTPUT_FILE ${LOG_PATH} + ERROR_FILE ${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)") + endif(NOT BUILD_EXITCODE EQUAL 0) + + execute_process(COMMAND ${CMAKE_COMMAND} --build . -- install + OUTPUT_FILE ${LOG_PATH} + ERROR_FILE ${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)") + endif(NOT INSTALL_EXITCODE EQUAL 0) + + message(STATUS "${ARG_PKG_NAME} Package: Done") +endfunction(ExternalBuild_CMake) diff --git a/infra/cmake/packages/FlatBuffersConfig.cmake b/infra/cmake/packages/FlatBuffersConfig.cmake index b70b824..a0e9356 100644 --- a/infra/cmake/packages/FlatBuffersConfig.cmake +++ b/infra/cmake/packages/FlatBuffersConfig.cmake @@ -15,51 +15,18 @@ function(_FlatBuffers_build) return() endif(NOT FlatBuffersSource_FOUND) - # TODO Introduce helper functions - set(FLATBUFFERS_BUILD "${CMAKE_BINARY_DIR}/externals/FLATBUFFERS/build") - set(FLATBUFFERS_INSTALL "${NNAS_OVERLAY_DIR}") - - set(STAMP_PATH "${FLATBUFFERS_INSTALL}/FLATBUFFERS.stamp") - set(LOG_PATH "${FLATBUFFERS_INSTALL}/FLATBUFFERS.log") - - if(EXISTS ${STAMP_PATH}) - return() - endif(EXISTS ${STAMP_PATH}) - - message(STATUS "Build Flatbuffers from ${FlatBuffersSource_DIR}") - - file(MAKE_DIRECTORY ${FLATBUFFERS_BUILD}) - file(MAKE_DIRECTORY ${FLATBUFFERS_INSTALL}) - - # NOTE Do NOT retry Flatbuffers build once it fails - file(WRITE "${STAMP_PATH}") - set(ADDITIONAL_CXX_FLAGS "") if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 8.0) set(ADDITIONAL_CXX_FLAGS "-Wno-error=class-memaccess") endif() - execute_process(COMMAND ${CMAKE_COMMAND} - -DCMAKE_INSTALL_PREFIX=${FLATBUFFERS_INSTALL} - -DCMAKE_BUILD_TYPE=Release - -DCMAKE_CXX_FLAGS=${ADDITIONAL_CXX_FLAGS} - ${FlatBuffersSource_DIR} - OUTPUT_FILE ${LOG_PATH} - ERROR_FILE ${LOG_PATH} - WORKING_DIRECTORY ${FLATBUFFERS_BUILD} - RESULT_VARIABLE BUILD_EXITCODE) - - execute_process(COMMAND ${CMAKE_COMMAND} --build . -- install - OUTPUT_FILE ${LOG_PATH} - ERROR_FILE ${LOG_PATH} - WORKING_DIRECTORY ${FLATBUFFERS_BUILD} - RESULT_VARIABLE INSTALL_EXITCODE) - - if(BUILD_EXITCODE EQUAL 0 AND INSTALL_EXITCODE EQUAL 0) - message(STATUS "Succeeded in building Flatbuffers") - else() - message(FATAL_ERROR "Fail to build Flatbuffers (check '${LOG_PATH}' for details)") - endif(BUILD_EXITCODE EQUAL 0 AND INSTALL_EXITCODE EQUAL 0) + nnas_include(ExternalBuildTools) + ExternalBuild_CMake(CMAKE_DIR ${FlatBuffersSource_DIR} + BUILD_DIR ${CMAKE_BINARY_DIR}/externals/FLATBUFFERS/build + INSTALL_DIR ${NNAS_OVERLAY_DIR} + BUILD_FLAGS ${ADDITIONAL_CXX_FLAGS} + PKG_NAME "FLATBUFFERS") + endfunction(_FlatBuffers_build) _FlatBuffers_build() diff --git a/infra/cmake/packages/GTestConfig.cmake b/infra/cmake/packages/GTestConfig.cmake index bcc8af9..bcec282 100644 --- a/infra/cmake/packages/GTestConfig.cmake +++ b/infra/cmake/packages/GTestConfig.cmake @@ -9,50 +9,12 @@ function(_GTest_build) return() endif(NOT GTestSource_FOUND) - # TODO Introduce helper functions - set(GTEST_SOURCE_DIR "${GTestSource_DIR}") - set(GTEST_BUILD_DIR "${CMAKE_BINARY_DIR}/externals/GTEST/build") - set(GTEST_INSTALL_DIR "${NNAS_OVERLAY_DIR}") + nnas_include(ExternalBuildTools) + ExternalBuild_CMake(CMAKE_DIR ${GTestSource_DIR} + BUILD_DIR ${CMAKE_BINARY_DIR}/externals/GTEST/build + INSTALL_DIR ${NNAS_OVERLAY_DIR} + PKG_NAME "GTEST") - set(STAMP_PATH "${GTEST_INSTALL_DIR}/GTEST.stamp") - set(LOG_PATH "${GTEST_INSTALL_DIR}/GTEST.log") - - if(EXISTS ${STAMP_PATH}) - return() - endif(EXISTS ${STAMP_PATH}) - - message(STATUS "Google Test Package: Source found (path: ${GTEST_SOURCE_DIR})") - - file(MAKE_DIRECTORY ${GTEST_BUILD_DIR}) - file(MAKE_DIRECTORY ${GTEST_INSTALL_DIR}) - - # NOTE Do NOT retry build once it failed - file(WRITE "${STAMP_PATH}") - - execute_process(COMMAND ${CMAKE_COMMAND} - -DCMAKE_INSTALL_PREFIX=${GTEST_INSTALL_DIR} - -DCMAKE_BUILD_TYPE=Release - ${GTestSource_DIR} - OUTPUT_FILE ${LOG_PATH} - ERROR_FILE ${LOG_PATH} - WORKING_DIRECTORY ${GTEST_BUILD_DIR} - RESULT_VARIABLE BUILD_EXITCODE) - - if(NOT BUILD_EXITCODE EQUAL 0) - message(FATAL_ERROR "Google Test Package: Build failed (check '${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} - WORKING_DIRECTORY ${GTEST_BUILD_DIR} - RESULT_VARIABLE INSTALL_EXITCODE) - - if(NOT INSTALL_EXITCODE EQUAL 0) - message(FATAL_ERROR "Google Test Package: Installation failed (check '${LOG_PATH}' for details)") - endif(NOT INSTALL_EXITCODE EQUAL 0) - - message(STATUS "Google Test Package: Done") endfunction(_GTest_build) _GTest_build() diff --git a/infra/cmake/packages/ProtobufConfig.cmake b/infra/cmake/packages/ProtobufConfig.cmake index 0176a82..5be9ade 100644 --- a/infra/cmake/packages/ProtobufConfig.cmake +++ b/infra/cmake/packages/ProtobufConfig.cmake @@ -52,52 +52,14 @@ function(_Protobuf_build) return() endif(NOT ProtobufSource_FOUND) - # TODO Introduce helper functions - set(PROTOBUF_BUILD_DIR "${CMAKE_BINARY_DIR}/externals/PROTOBUF/build") - set(PROTOBUF_INSTALL_DIR "${NNAS_OVERLAY_DIR}") + nnas_include(ExternalBuildTools) + ExternalBuild_CMake(CMAKE_DIR ${ProtobufSource_DIR}/cmake + BUILD_DIR ${CMAKE_BINARY_DIR}/externals/PROTOBUF/build + INSTALL_DIR ${NNAS_OVERLAY_DIR} + BUILD_FLAGS -fPIC + EXTRA_OPTS -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_WITH_ZLIB=OFF + PKG_NAME "PROTOBUF") - set(STAMP_PATH "${PROTOBUF_INSTALL_DIR}/PROTOBUF.stamp") - set(LOG_PATH "${PROTOBUF_INSTALL_DIR}/PROTOBUF.log") - - if(EXISTS ${STAMP_PATH}) - return() - endif(EXISTS ${STAMP_PATH}) - - message(STATUS "Build Protocol Buffer from ${ProtobufSource_DIR}") - - file(MAKE_DIRECTORY ${PROTOBUF_BUILD_DIR}) - file(MAKE_DIRECTORY ${PROTOBUF_INSTALL_DIR}) - - # NOTE Do NOT retry Protocol Buffer build - file(WRITE "${STAMP_PATH}") - - execute_process(COMMAND ${CMAKE_COMMAND} - -DCMAKE_INSTALL_PREFIX=${PROTOBUF_INSTALL_DIR} - -DCMAKE_BUILD_TYPE=Release - -DCMAKE_CXX_FLAGS="-fPIC" - -Dprotobuf_BUILD_TESTS=OFF - -Dprotobuf_WITH_ZLIB=OFF - "${ProtobufSource_DIR}/cmake" - OUTPUT_FILE ${LOG_PATH} - ERROR_FILE ${LOG_PATH} - WORKING_DIRECTORY ${PROTOBUF_BUILD_DIR} - RESULT_VARIABLE CONFIGURE_EXITCODE) - - if(NOT CONFIGURE_EXITCODE EQUAL 0) - message(FATAL_ERROR "Fail to configure Protocol Buffer (check '${LOG_PATH}' for details)") - endif(NOT CONFIGURE_EXITCODE EQUAL 0) - - execute_process(COMMAND ${CMAKE_COMMAND} --build . -- install - OUTPUT_FILE ${LOG_PATH} - ERROR_FILE ${LOG_PATH} - WORKING_DIRECTORY ${PROTOBUF_BUILD_DIR} - RESULT_VARIABLE BUILD_AND_INSTALL_EXITCODE) - - if(NOT BUILD_AND_INSTALL_EXITCODE EQUAL 0) - message(FATAL_ERROR "Fail to build/install Protocol Buffer (check '${LOG_PATH}' for details)") - endif(NOT BUILD_AND_INSTALL_EXITCODE EQUAL 0) - - message(STATUS "Succeeded in building Protocol Buffer") endfunction(_Protobuf_build) _Protobuf_build() -- 2.7.4