| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| cmake_minimum_required(VERSION 3.1 FATAL_ERROR) |
| |
| list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/../../../../../hadoop-common-project/hadoop-common) |
| include(HadoopCommon) |
| |
| # Set gtest path |
| set(GTEST_SRC_DIR ${CMAKE_SOURCE_DIR}/../../../../../hadoop-common-project/hadoop-common/src/main/native/gtest) |
| |
| # determine if container-executor.conf.dir is an absolute |
| # path in case the OS we're compiling on doesn't have |
| # a hook in get_executable. We'll use this define |
| # later in the code to potentially throw a compile error |
| string(REGEX MATCH . HCD_ONE "${HADOOP_CONF_DIR}") |
| string(COMPARE EQUAL ${HCD_ONE} / HADOOP_CONF_DIR_IS_ABS) |
| |
| set (CMAKE_C_STANDARD 99) |
| set (CMAKE_CXX_STANDARD 11) |
| |
| include(CheckIncludeFiles) |
| check_include_files("sys/types.h;sys/sysctl.h" HAVE_SYS_SYSCTL_H) |
| |
| include(CheckFunctionExists) |
| check_function_exists(canonicalize_file_name HAVE_CANONICALIZE_FILE_NAME) |
| check_function_exists(fcloseall HAVE_FCLOSEALL) |
| check_function_exists(fchmodat HAVE_FCHMODAT) |
| check_function_exists(fdopendir HAVE_FDOPENDIR) |
| check_function_exists(fstatat HAVE_FSTATAT) |
| check_function_exists(openat HAVE_OPENAT) |
| check_function_exists(unlinkat HAVE_UNLINKAT) |
| |
| include(CheckSymbolExists) |
| check_symbol_exists(sysctl "sys/types.h;sys/sysctl.h" HAVE_SYSCTL) |
| |
| if(APPLE) |
| include_directories( /System/Library/Frameworks ) |
| find_library(COCOA_LIBRARY Cocoa) |
| mark_as_advanced(COCOA_LIBRARY) |
| set(EXTRA_LIBS ${COCOA_LIBRARY}) |
| endif(APPLE) |
| |
| include(CheckCCompilerFlag) |
| |
| # Building setuid = attempt to enable stack protection. |
| # assumption here is that the C compiler and the C++ |
| # compiler match. need both so that gtest gets same |
| # stack treatment that the real c-e does |
| IF(CMAKE_C_COMPILER_ID STREQUAL "GNU") |
| CHECK_C_COMPILER_FLAG("-fstack-check" STACKRESULT) |
| IF(STACKRESULT) |
| SET (CMAKE_C_FLAGS "-fstack-check ${CMAKE_C_FLAGS}") |
| SET (CMAKE_CXX_FLAGS "-fstack-check ${CMAKE_CXX_FLAGS}") |
| ENDIF() |
| ELSEIF(CMAKE_C_COMPILER_ID STREQUAL "Clang" OR |
| CMAKE_C_COMPILER_ID STREQUAL "AppleClang") |
| |
| # clang is a bit difficult here: |
| # - some versions don't support the flag |
| # - some versions support the flag, despite not having |
| # the library that is actually required (!) |
| # Notably, Xcode is a problem here. |
| # In the end, this is needlessly complex. :( |
| |
| SET(PRE_SANITIZE ${CMAKE_REQUIRED_FLAGS}) |
| SET(CMAKE_REQUIRED_FLAGS "-fsanitize=safe-stack ${CMAKE_REQUIRED_FLAGS}") |
| CHECK_C_COMPILER_FLAG("" STACKRESULT) |
| SET(CMAKE_REQUIRED_FLAGS ${PRE_SANITIZE}) |
| IF(STACKRESULT) |
| SET(CMAKE_C_FLAGS "-fsanitize=safe-stack ${CMAKE_C_FLAGS}") |
| SET(CMAKE_CXX_FLAGS "-fsanitize=safe-stack ${CMAKE_CXX_FLAGS}") |
| ENDIF() |
| ELSEIF(CMAKE_C_COMPILER_ID STREQUAL "SunPro") |
| |
| # this appears to only be supported on SPARC, for some reason |
| |
| CHECK_C_COMPILER_FLAG("-xcheck=stkovf" STACKRESULT) |
| IF(STACKRESULT) |
| SET (CMAKE_C_FLAGS "-xcheck=stkovf ${CMAKE_C_FLAGS}") |
| SET (CMAKE_CXX_FLAGS "-xcheck=stkovf ${CMAKE_CXX_FLAGS}") |
| ENDIF() |
| ENDIF() |
| |
| IF(NOT STACKRESULT) |
| MESSAGE(WARNING "Stack Clash security protection is not suported.") |
| ENDIF() |
| |
| function(output_directory TGT DIR) |
| set_target_properties(${TGT} PROPERTIES |
| RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${DIR}") |
| set_target_properties(${TGT} PROPERTIES |
| ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${DIR}") |
| set_target_properties(${TGT} PROPERTIES |
| LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${DIR}") |
| endfunction() |
| |
| include_directories( |
| ${CMAKE_CURRENT_SOURCE_DIR} |
| ${CMAKE_BINARY_DIR} |
| ${GTEST_SRC_DIR}/include |
| main/native/container-executor |
| main/native/container-executor/impl |
| main/native/oom-listener/impl |
| ) |
| # add gtest as system library to suppress gcc warnings |
| include_directories(SYSTEM ${GTEST_SRC_DIR}/include) |
| |
| configure_file(${CMAKE_SOURCE_DIR}/config.h.cmake ${CMAKE_BINARY_DIR}/config.h) |
| |
| add_library(gtest ${GTEST_SRC_DIR}/gtest-all.cc) |
| set_target_properties(gtest PROPERTIES COMPILE_FLAGS "-w") |
| |
| add_library(container |
| main/native/container-executor/impl/util.c |
| main/native/container-executor/impl/configuration.c |
| main/native/container-executor/impl/container-executor.c |
| main/native/container-executor/impl/get_executable.c |
| main/native/container-executor/impl/utils/string-utils.c |
| main/native/container-executor/impl/utils/path-utils.c |
| main/native/container-executor/impl/modules/cgroups/cgroups-operations.c |
| main/native/container-executor/impl/modules/common/module-configs.c |
| main/native/container-executor/impl/modules/gpu/gpu-module.c |
| main/native/container-executor/impl/modules/fpga/fpga-module.c |
| main/native/container-executor/impl/utils/docker-util.c |
| ) |
| |
| add_executable(container-executor |
| main/native/container-executor/impl/main.c |
| ) |
| |
| target_link_libraries(container-executor |
| container |
| ) |
| |
| output_directory(container-executor target/usr/local/bin) |
| |
| # Test cases |
| add_executable(test-container-executor |
| main/native/container-executor/test/test-container-executor.c |
| ) |
| target_link_libraries(test-container-executor |
| container ${EXTRA_LIBS} |
| ) |
| |
| output_directory(test-container-executor target/usr/local/bin) |
| |
| # unit tests for container executor |
| add_executable(cetest |
| main/native/container-executor/impl/get_executable.c |
| main/native/container-executor/impl/util.c |
| main/native/container-executor/test/test_configuration.cc |
| main/native/container-executor/test/test_main.cc |
| main/native/container-executor/test/utils/test-string-utils.cc |
| main/native/container-executor/test/utils/test-path-utils.cc |
| main/native/container-executor/test/modules/cgroups/test-cgroups-module.cc |
| main/native/container-executor/test/modules/gpu/test-gpu-module.cc |
| main/native/container-executor/test/modules/fpga/test-fpga-module.cc |
| main/native/container-executor/test/test_util.cc |
| main/native/container-executor/test/utils/test_docker_util.cc) |
| target_link_libraries(cetest gtest container) |
| output_directory(cetest test) |
| |
| # CGroup OOM listener |
| add_executable(oom-listener |
| main/native/oom-listener/impl/oom_listener.c |
| main/native/oom-listener/impl/oom_listener.h |
| main/native/oom-listener/impl/oom_listener_main.c |
| ) |
| output_directory(oom-listener target/usr/local/bin) |
| |
| # CGroup OOM listener test with GTest |
| add_executable(test-oom-listener |
| main/native/oom-listener/impl/oom_listener.c |
| main/native/oom-listener/impl/oom_listener.h |
| main/native/oom-listener/test/oom_listener_test_main.cc |
| ) |
| target_link_libraries(test-oom-listener gtest rt) |
| output_directory(test-oom-listener test) |