1 # Copyright (C) 2018-2019 Intel Corporation
2 # SPDX-License-Identifier: Apache-2.0
5 cmake_minimum_required (VERSION 2.8.11)
9 if (CMAKE_BUILD_TYPE STREQUAL "")
10 message(STATUS "CMAKE_BUILD_TYPE not defined, 'Release' will be used")
11 set(CMAKE_BUILD_TYPE "Release")
15 string(TOLOWER ${CMAKE_SYSTEM_PROCESSOR} ARCH)
16 if(ARCH STREQUAL "x86_64" OR ARCH STREQUAL "amd64") # Windows detects Intel's 64-bit CPU as AMD64
18 elseif(ARCH STREQUAL "i386")
22 set (BIN_FOLDER ${ARCH})
25 if (NOT(IE_MAIN_SOURCE_DIR))
26 # in case if samples are built out of IE repo
27 set (IE_MAIN_SAMPLES_DIR ${CMAKE_CURRENT_BINARY_DIR})
29 # in case if samples are built from IE repo
30 set (IE_MAIN_SAMPLES_DIR ${IE_MAIN_SOURCE_DIR})
34 set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${IE_MAIN_SAMPLES_DIR}/${BIN_FOLDER})
35 set (CMAKE_LIBRARY_PATH ${IE_MAIN_SAMPLES_DIR}/${BIN_FOLDER})
36 set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${IE_MAIN_SAMPLES_DIR}/${BIN_FOLDER})
37 set (CMAKE_COMPILE_PDB_OUTPUT_DIRECTORY ${IE_MAIN_SAMPLES_DIR}/${BIN_FOLDER})
38 set (CMAKE_PDB_OUTPUT_DIRECTORY ${IE_MAIN_SAMPLES_DIR}/${BIN_FOLDER})
39 set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${IE_MAIN_SAMPLES_DIR}/${BIN_FOLDER})
40 set (LIBRARY_OUTPUT_DIRECTORY ${IE_MAIN_SAMPLES_DIR}/${BIN_FOLDER})
41 set (LIBRARY_OUTPUT_PATH ${LIBRARY_OUTPUT_DIRECTORY}) # compatibility issue: linux uses LIBRARY_OUTPUT_PATH, windows uses LIBRARY_OUTPUT_DIRECTORY
43 set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${IE_MAIN_SAMPLES_DIR}/${BIN_FOLDER}/${CMAKE_BUILD_TYPE}/lib)
44 set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${IE_MAIN_SAMPLES_DIR}/${BIN_FOLDER}/${CMAKE_BUILD_TYPE}/lib)
45 set (CMAKE_COMPILE_PDB_OUTPUT_DIRECTORY ${IE_MAIN_SAMPLES_DIR}/${BIN_FOLDER}/${CMAKE_BUILD_TYPE})
46 set (CMAKE_PDB_OUTPUT_DIRECTORY ${IE_MAIN_SAMPLES_DIR}/${BIN_FOLDER}/${CMAKE_BUILD_TYPE})
47 set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${IE_MAIN_SAMPLES_DIR}/${BIN_FOLDER}/${CMAKE_BUILD_TYPE})
48 set (LIBRARY_OUTPUT_DIRECTORY ${IE_MAIN_SAMPLES_DIR}/${BIN_FOLDER}/${CMAKE_BUILD_TYPE}/lib)
49 set (LIBRARY_OUTPUT_PATH ${LIBRARY_OUTPUT_DIRECTORY}/lib)
53 if (NOT "${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
54 message(FATAL_ERROR "Only 64-bit supported on Windows")
57 set_property (DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS _CRT_SECURE_NO_WARNINGS)
58 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_SCL_SECURE_NO_WARNINGS -DNOMINMAX")
59 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc") #no asynchronous structured exception handling
60 set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LARGEADDRESSAWARE")
62 if (TREAT_WARNING_AS_ERROR)
63 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /WX") #treating warnings as errors
66 if (${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
67 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4251 /wd4275 /wd4267") #disable some warnings
70 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror") #treating warnings as errors
72 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=unused-command-line-argument")
74 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wuninitialized -Winit-self")
75 if(NOT ${CMAKE_CXX_COMPILER_ID} STREQUAL Clang)
76 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wmaybe-uninitialized")
81 ####################################
83 set (CMAKE_CXX_STANDARD 11)
84 set (CMAKE_CXX_STANDARD_REQUIRED ON)
85 if (${CMAKE_CXX_COMPILER_ID} STREQUAL GNU)
86 set (CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
88 ####################################
90 set (GFLAGS_IS_SUBPROJECT TRUE)
91 set (HAVE_SYS_STAT_H 1)
92 set (HAVE_INTTYPES_H 1)
94 add_subdirectory(thirdparty/gflags)
96 if (${CMAKE_CXX_COMPILER_ID} STREQUAL GNU)
97 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
100 add_subdirectory(common/format_reader)
102 # samples build can be switched off during whole IE build
103 if (IE_MAIN_SOURCE_DIR AND NOT ENABLE_SAMPLES)
107 function(add_samples_to_build)
108 # check each passed sample subdirectory
109 foreach (dir ${ARGN})
110 if (IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${dir})
111 # check if a subdirectory contains CMakeLists.txt. In this case we can build it.
112 file(GLOB is_sample_dir "${CMAKE_CURRENT_SOURCE_DIR}/${dir}/CMakeLists.txt")
114 # check if specified sample/demo is found.
115 if (BUILD_SAMPLE_NAME)
116 list(FIND BUILD_SAMPLE_NAME ${dir} index)
119 message(STATUS "${dir} SKIPPED")
121 # Include subdirectory to the project.
122 add_subdirectory(${dir})
127 endfunction(add_samples_to_build)
129 include(CMakeParseArguments)
132 # ie_add_sample(NAME <target name>
133 # SOURCES <source files>
134 # [HEADERS <header files>]
135 # [INCLUDE_DIRECTORIES <include dir>]
136 # [DEPENDENCIES <dependencies>]
137 # [OPENCV_DENENDENCIES <opencv modules>]
141 set(options EXCLUDE_CPPLINT)
142 set(oneValueArgs NAME)
143 set(multiValueArgs SOURCES HEADERS DEPENDENCIES OPENCV_DEPENDENCIES INCLUDE_DIRECTORIES)
144 cmake_parse_arguments(IE_SAMPLE "${options}" "${oneValueArgs}"
145 "${multiValueArgs}" ${ARGN} )
147 # Find OpenCV components if exist
148 if(IE_SAMPLE_OPENCV_DEPENDENCIES)
149 find_package(OpenCV COMPONENTS ${IE_SAMPLE_OPENCV_DEPENDENCIES} QUIET)
151 message(WARNING "OPENCV is disabled or not found, " ${IE_SAMPLE_NAME} " skipped")
154 add_definitions(-DUSE_OPENCV)
158 # Create named folders for the sources within the .vcproj
159 # Empty name lists them directly under the .vcproj
160 source_group("src" FILES ${IE_SAMPLES_SOURCES})
161 if(IE_SAMPLES_HEADERS)
162 source_group("include" FILES ${IE_SAMPLES_HEADERS})
165 # Create executable file from sources
166 add_executable(${IE_SAMPLE_NAME} ${IE_SAMPLE_SOURCES} ${IE_SAMPLES_HEADERS})
169 set_target_properties(${IE_SAMPLE_NAME} PROPERTIES COMPILE_PDB_NAME ${IE_SAMPLE_NAME})
172 if(IE_SAMPLE_INCLUDE_DIRECTORIES)
173 target_include_directories(${IE_SAMPLE_NAME} PRIVATE ${IE_SAMPLE_INCLUDE_DIRECTORIES})
175 target_include_directories(${IE_SAMPLE_NAME} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../common")
177 target_link_libraries(${IE_SAMPLE_NAME} PRIVATE ${OpenCV_LIBRARIES} ${InferenceEngine_LIBRARIES}
178 ${IE_SAMPLE_DEPENDENCIES} IE::ie_cpu_extension gflags)
181 target_link_libraries(${IE_SAMPLE_NAME} PRIVATE pthread)
184 # create global target with all samples / demo apps
185 if(NOT TARGET ie_samples)
186 add_custom_target(ie_samples ALL)
188 add_dependencies(ie_samples ${IE_SAMPLE_NAME})
190 if(COMMAND add_cpplint_target AND NOT IE_SAMPLE_EXCLUDE_CPPLINT)
191 add_cpplint_target(${IE_SAMPLE_NAME}_cpplint FOR_TARGETS ${IE_SAMPLE_NAME})
196 # use this flag if you need to throw custom message in case if the IE package is not found.
197 if (IE_NOT_FOUND_MESSAGE)
198 find_package(InferenceEngine 2.0 QUIET)
199 if (NOT(InferenceEngine_FOUND))
200 message(FATAL_ERROR ${IE_NOT_FOUND_MESSAGE})
203 find_package(InferenceEngine 2.0 REQUIRED)
206 # collect all samples subdirectories
207 file(GLOB samples_dirs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *)
208 # skip building of unnecessary subdirectories
209 list(REMOVE_ITEM samples_dirs common thirdparty)
210 add_samples_to_build(${samples_dirs})