d354f647cecb44e454ad5e4b10f647be2b91cdc0
[platform/upstream/dldt.git] / inference-engine / samples / CMakeLists.txt
1 # Copyright (C) 2018-2019 Intel Corporation
2 # SPDX-License-Identifier: Apache-2.0
3 #
4
5 cmake_minimum_required (VERSION 2.8.11)
6
7 project(Samples)
8
9 if (CMAKE_BUILD_TYPE STREQUAL "")
10     message(STATUS "CMAKE_BUILD_TYPE not defined, 'Release' will be used")
11     set(CMAKE_BUILD_TYPE "Release")
12 endif()
13
14 if (NOT(BIN_FOLDER))
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
17         set(ARCH intel64)
18     elseif(ARCH STREQUAL "i386")
19         set(ARCH ia32)
20     endif()
21
22     set (BIN_FOLDER ${ARCH})
23 endif()
24
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})
28 else()
29     # in case if samples are built from IE repo
30     set (IE_MAIN_SAMPLES_DIR ${IE_MAIN_SOURCE_DIR})
31 endif()
32
33 if(NOT(UNIX))
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
42 else ()
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)
50 endif()
51
52 if (WIN32)
53     if (NOT "${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
54         message(FATAL_ERROR "Only 64-bit supported on Windows")
55     endif()
56
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")
61
62     if (TREAT_WARNING_AS_ERROR)
63         set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /WX") #treating warnings as errors
64     endif ()
65
66     if (${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
67         set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4251 /wd4275 /wd4267") #disable some warnings
68     endif()
69 else()
70     set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror") #treating warnings as errors
71     if (APPLE)
72         set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=unused-command-line-argument")
73     elseif(UNIX)
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")
77         endif()
78     endif()
79 endif()
80
81 ####################################
82 ## to use C++11
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}")
87 endif()
88 ####################################
89
90 set (GFLAGS_IS_SUBPROJECT TRUE)
91 set (HAVE_SYS_STAT_H 1)
92 set (HAVE_INTTYPES_H 1)
93
94 add_subdirectory(thirdparty/gflags)
95
96 if (${CMAKE_CXX_COMPILER_ID} STREQUAL GNU)
97     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
98 endif()
99
100 add_subdirectory(common/format_reader)
101
102 # samples build can be switched off during whole IE build
103 if (IE_MAIN_SOURCE_DIR AND NOT ENABLE_SAMPLES)
104     return()
105 endif()
106
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")
113             if(is_sample_dir)
114                 # check if specified sample/demo is found.
115                 if (BUILD_SAMPLE_NAME)
116                     list(FIND BUILD_SAMPLE_NAME ${dir} index)
117                 endif()
118                 if (index EQUAL -1)
119                     message(STATUS "${dir} SKIPPED")
120                 else()
121                     # Include subdirectory to the project.
122                     add_subdirectory(${dir})
123                 endif()
124             endif()
125         endif()
126     endforeach()
127 endfunction(add_samples_to_build)
128
129 include(CMakeParseArguments)
130
131 #
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>]
138 #               [EXCLUDE_CPPLINT]
139 #
140 macro(ie_add_sample)
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} )
146
147     # Find OpenCV components if exist
148     if(IE_SAMPLE_OPENCV_DEPENDENCIES)
149         find_package(OpenCV COMPONENTS ${IE_SAMPLE_OPENCV_DEPENDENCIES} QUIET)
150         if(NOT OpenCV_FOUND)
151             message(WARNING "OPENCV is disabled or not found, " ${IE_SAMPLE_NAME} " skipped")
152             return()
153         else()
154             add_definitions(-DUSE_OPENCV)
155         endif()
156     endif()
157
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})
163     endif()
164
165     # Create executable file from sources
166     add_executable(${IE_SAMPLE_NAME} ${IE_SAMPLE_SOURCES} ${IE_SAMPLES_HEADERS})
167
168     if(WIN32)
169         set_target_properties(${IE_SAMPLE_NAME} PROPERTIES COMPILE_PDB_NAME ${IE_SAMPLE_NAME})
170     endif()
171
172     if(IE_SAMPLE_INCLUDE_DIRECTORIES)
173         target_include_directories(${IE_SAMPLE_NAME} PRIVATE ${IE_SAMPLE_INCLUDE_DIRECTORIES})
174     endif()
175     target_include_directories(${IE_SAMPLE_NAME} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../common")
176
177     target_link_libraries(${IE_SAMPLE_NAME} PRIVATE ${OpenCV_LIBRARIES} ${InferenceEngine_LIBRARIES}
178                                                     ${IE_SAMPLE_DEPENDENCIES} IE::ie_cpu_extension gflags)
179
180     if(UNIX)
181         target_link_libraries(${IE_SAMPLE_NAME} PRIVATE pthread)
182     endif()
183
184     # create global target with all samples / demo apps
185     if(NOT TARGET ie_samples)
186         add_custom_target(ie_samples ALL)
187     endif()
188     add_dependencies(ie_samples ${IE_SAMPLE_NAME})
189
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})
192     endif()
193 endmacro()
194
195
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})
201     endif()
202 else()
203     find_package(InferenceEngine 2.0 REQUIRED)
204 endif()
205
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})