Merge pull request #1263 from abidrahmank:pyCLAHE_24
[profile/ivi/opencv.git] / 3rdparty / tbb / CMakeLists.txt
1 #Cross compile TBB from source
2 project(tbb)
3
4 if (WIN32 AND NOT ARM)
5   message(FATAL_ERROR "BUILD_TBB option supports Windows on ARM only!\nUse regular official TBB build instead of the BUILD_TBB option!")
6 endif()
7
8 if (WIN32 AND ARM)
9   # 4.1 update 4 - The first release that supports Windows RT. Hangs on some Android devices
10   set(tbb_ver "tbb41_20130613oss")
11   set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb41_20130613oss_src.tgz")
12   set(tbb_md5 "108c8c1e481b0aaea61878289eb28b6a")
13   set(tbb_version_file "version_string.ver")
14   ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4702)
15 else()
16   # 4.1 update 2 - works fine
17   set(tbb_ver "tbb41_20130116oss")
18   set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb41_20130116oss_src.tgz")
19   set(tbb_md5 "3809790e1001a1b32d59c9fee590ee85")
20   set(tbb_version_file "version_string.ver")
21   ocv_warnings_disable(CMAKE_CXX_FLAGS -Wshadow)
22 endif()
23
24 # 4.1 update 3 dev - Hangs on some Android devices
25 #set(tbb_ver "tbb41_20130401oss")
26 #set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb41_20130401oss_src.tgz")
27 #set(tbb_md5 "f2f591a0d2ca8f801e221ce7d9ea84bb")
28 #set(tbb_version_file "version_string.ver")
29 #ocv_warnings_disable(CMAKE_CXX_FLAGS -Wshadow)
30
31 # 4.1 update 2 - works fine
32 #set(tbb_ver "tbb41_20130116oss")
33 #set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb41_20130116oss_src.tgz")
34 #set(tbb_md5 "3809790e1001a1b32d59c9fee590ee85")
35 #set(tbb_version_file "version_string.ver")
36 #ocv_warnings_disable(CMAKE_CXX_FLAGS -Wshadow)
37
38 # 4.1 update 1 - works fine
39 #set(tbb_ver "tbb41_20121003oss")
40 #set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb41_20121003oss_src.tgz")
41 #set(tbb_md5 "2a684fefb855d2d0318d1ef09afa75ff")
42 #set(tbb_version_file "version_string.ver")
43
44 # 4.1 - works fine
45 #set(tbb_ver "tbb41_20120718oss")
46 #set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb41_20120718oss_src.tgz")
47 #set(tbb_md5 "31b9ec300f3d09da2504d5d882788dd4")
48 #set(tbb_version_file "version_string.ver")
49
50 # 4.0 update 5 - works fine
51 #set(tbb_ver "tbb40_20120613oss")
52 #set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb40_20120613oss_src.tgz")
53 #set(tbb_md5 "da01ed74944ec5950cfae3476901a172")
54 #set(tbb_version_file "version_string.ver")
55
56 # 4.0 update 4 - works fine
57 #set(tbb_ver "tbb40_20120408oss")
58 #set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb40_20120408oss_src.tgz")
59 #set(tbb_md5 "734b356da7fe0ed308741f3e6018251e")
60 #set(tbb_version_file "version_string.ver")
61
62 # 4.0 update 3 - build broken
63 #set(tbb_ver "tbb40_20120201oss")
64 #set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb40_20120201oss_src.tgz")
65 #set(tbb_md5 "4669e7d4adee018de7a7b8b972987218")
66 #set(tbb_version_file "version_string.tmp")
67
68 # 4.0 update 2 - works fine
69 #set(tbb_ver "tbb40_20111130oss")
70 #set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb40_20111130oss_src.tgz")
71 #set(tbb_md5 "1e6926b21e865e79772119cd44fc3ad8")
72 #set(tbb_version_file "version_string.tmp")
73 #set(tbb_need_GENERIC_DWORD_LOAD_STORE TRUE)
74
75 # 4.0 update 1 - works fine
76 #set(tbb_ver "tbb40_20111003oss")
77 #set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb40_20111003oss_src.tgz")
78 #set(tbb_md5 "7b5d94eb35a563b29ef402e0fd8f15c9")
79 #set(tbb_version_file "version_string.tmp")
80 #set(tbb_need_GENERIC_DWORD_LOAD_STORE TRUE)
81
82 set(tbb_tarball "${CMAKE_CURRENT_SOURCE_DIR}/${tbb_ver}_src.tgz")
83 set(tbb_src_dir "${CMAKE_CURRENT_BINARY_DIR}/${tbb_ver}")
84
85 macro(getMD5 filename varname)
86   if(CMAKE_VERSION VERSION_GREATER 2.8.6)
87     file(MD5 "${filename}" ${varname})
88   else()
89     execute_process(COMMAND ${CMAKE_COMMAND} -E md5sum "${filename}"
90               RESULT_VARIABLE getMD5_RESULT
91               OUTPUT_VARIABLE getMD5_OUTPUT
92               OUTPUT_STRIP_TRAILING_WHITESPACE)
93     if(getMD5_RESULT EQUAL 0)
94       string(REGEX MATCH "^[a-z0-9]+" ${varname} "${getMD5_OUTPUT}")
95     else()
96       set(${varname} "invalid_md5")
97     endif()
98   endif()
99 endmacro()
100
101 if(EXISTS "${tbb_tarball}")
102   getMD5("${tbb_tarball}" tbb_local_md5)
103   if(NOT tbb_local_md5 STREQUAL tbb_md5)
104     message(WARNING "Local copy of TBB source tarball has invalid MD5 hash: ${tbb_local_md5} (expected: ${tbb_md5})")
105     file(REMOVE "${tbb_tarball}")
106     if(EXISTS "${CMAKE_CURRENT_BINARY_DIR}/${tbb_ver}")
107       file(REMOVE_RECURSE "${CMAKE_CURRENT_BINARY_DIR}/${tbb_ver}")
108     endif()
109   endif()
110 endif()
111
112 if(NOT EXISTS "${tbb_tarball}")
113   message(STATUS "Downloading ${tbb_ver}_src.tgz")
114   file(DOWNLOAD "${tbb_url}" "${tbb_tarball}" TIMEOUT 600 STATUS __statvar)
115   if(NOT __statvar EQUAL 0)
116     message(FATAL_ERROR "Failed to download TBB sources: ${tbb_url}")
117   endif()
118   getMD5("${tbb_tarball}" tbb_local_md5)
119   if(NOT tbb_local_md5 STREQUAL tbb_md5)
120     file(REMOVE "${tbb_tarball}")
121     message(FATAL_ERROR "Downloaded TBB source tarball has invalid MD5 hash: ${tbb_local_md5} (expected: ${tbb_md5})")
122   endif()
123
124   if(EXISTS "${tbb_src_dir}")
125     file(REMOVE_RECURSE "${tbb_src_dir}")
126   endif()
127 endif()
128
129 # untar TBB sources
130 if(NOT EXISTS "${tbb_src_dir}")
131   message(STATUS "Unpacking ${tbb_ver}_src.tgz to ${tbb_src_dir}")
132   execute_process(COMMAND ${CMAKE_COMMAND} -E tar xz "${tbb_tarball}"
133               WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
134               RESULT_VARIABLE tbb_untar_RESULT)
135
136   if(NOT tbb_untar_RESULT EQUAL 0 OR NOT EXISTS "${tbb_src_dir}")
137     message(FATAL_ERROR "Failed to unpack TBB sources from ${tbb_tarball} to ${tbb_src_dir} with error ${tbb_untar_RESULT}")
138   endif()
139 endif()
140
141 set(TBB_INCLUDE_DIRS "${tbb_src_dir}/include" PARENT_SCOPE)
142
143 ocv_include_directories("${tbb_src_dir}/include"
144                         "${tbb_src_dir}/src/"
145                         "${tbb_src_dir}/src/rml/include"
146                         "${CMAKE_CURRENT_SOURCE_DIR}")
147
148 file(GLOB lib_srcs "${tbb_src_dir}/src/tbb/*.cpp")
149 file(GLOB lib_hdrs "${tbb_src_dir}/src/tbb/*.h")
150 list(APPEND lib_srcs "${tbb_src_dir}/src/rml/client/rml_tbb.cpp")
151
152 if (WIN32)
153   add_definitions(/D__TBB_DYNAMIC_LOAD_ENABLED=0
154                   /D__TBB_BUILD=1
155                   /DTBB_NO_LEGACY=1
156                   /D_UNICODE
157                   /DUNICODE
158                   /DWINAPI_FAMILY=WINAPI_FAMILY_APP
159                   /DDO_ITT_NOTIFY=0
160                   /DUSE_WINTHREAD
161                ) # defines were copied from windows.cl.inc
162
163   if (ARM)
164     add_definitions(/D_WIN32_WINNT=0x0602
165                     /D__TBB_WIN32_USE_CL_BUILTINS
166                    )
167   endif()
168
169 set(CMAKE_LINKER_FLAGS "${CMAKE_LINKER_FLAGS} /APPCONTAINER")
170 else()
171   add_definitions(-D__TBB_DYNAMIC_LOAD_ENABLED=0         #required
172                   -D__TBB_BUILD=1                        #required
173                   -D__TBB_SURVIVE_THREAD_SWITCH=0        #no cilk support
174                   -DTBB_USE_DEBUG=0                      #just to be sure
175                   -DTBB_NO_LEGACY=1                      #don't need backward compatibility
176                   -DDO_ITT_NOTIFY=0                      #it seems that we don't need these notifications
177                  )
178 endif()
179
180 if (HAVE_LIBPTHREAD)
181   add_definitions(-DUSE_PTHREAD) #required for Unix
182 endif()
183
184 if (CMAKE_COMPILER_IS_GNUCXX)
185   add_definitions(-DTBB_USE_GCC_BUILTINS=1) #required for ARM GCC
186 endif()
187
188 if(ANDROID_COMPILER_IS_CLANG)
189   add_definitions(-D__TBB_GCC_BUILTIN_ATOMICS_PRESENT=1)
190   ocv_warnings_disable(CMAKE_CXX_FLAGS -Wmissing-prototypes)
191 endif()
192
193 if(tbb_need_GENERIC_DWORD_LOAD_STORE)
194   #needed by TBB 4.0 update 1,2; fixed in TBB 4.0 update 3 but it has 2 new problems
195   add_definitions(-D__TBB_USE_GENERIC_DWORD_LOAD_STORE=1)
196   set(tbb_need_GENERIC_DWORD_LOAD_STORE ON PARENT_SCOPE)
197 endif()
198
199 set(TBB_SOURCE_FILES ${lib_srcs} ${lib_hdrs})
200
201 if (ARM AND NOT WIN32)
202   if (NOT ANDROID)
203     set(TBB_SOURCE_FILES ${TBB_SOURCE_FILES} "${CMAKE_CURRENT_SOURCE_DIR}/arm_linux_stub.cpp")
204   endif()
205   set(TBB_SOURCE_FILES ${TBB_SOURCE_FILES} "${CMAKE_CURRENT_SOURCE_DIR}/android_additional.h")
206   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -include \"${CMAKE_CURRENT_SOURCE_DIR}/android_additional.h\"")
207 endif()
208
209 set(TBB_SOURCE_FILES ${TBB_SOURCE_FILES} "${CMAKE_CURRENT_SOURCE_DIR}/${tbb_version_file}")
210
211 add_library(tbb ${TBB_SOURCE_FILES})
212
213 if (WIN32)
214   if (ARM)
215     set(platform_macro /D_M_ARM=1)
216   endif()
217
218   add_custom_command(TARGET tbb
219                      PRE_BUILD
220                      COMMAND ${CMAKE_C_COMPILER} /nologo /TC /EP ${tbb_src_dir}\\src\\tbb\\win32-tbb-export.def /DTBB_NO_LEGACY=1 /D_CRT_SECURE_NO_DEPRECATE /D__TBB_BUILD=1 ${platform_macro} /I${tbb_src_dir}\\src /I${tbb_src_dir}\\include > "${tbb_src_dir}\\src\\tbb\\tbb.def"
221                      WORKING_DIRECTORY ${tbb_src_dir}\\src\\tbb
222                      COMMENT "Generating tbb.def file" VERBATIM
223                     )
224
225   set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DEF:${tbb_src_dir}/src/tbb/tbb.def /DLL /MAP /fixed:no /INCREMENTAL:NO")
226 else()
227   target_link_libraries(tbb c m dl)
228 endif()
229
230 ocv_warnings_disable(CMAKE_CXX_FLAGS -Wundef -Wmissing-declarations)
231 string(REPLACE "-Werror=non-virtual-dtor" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
232
233 if (WIN32)
234   set(tbb_debug_postfix "_debug") # to fit pragmas in _windef.h inside TBB
235 else()
236   set(tbb_debug_postfix ${OPENCV_DEBUG_POSTFIX})
237 endif()
238
239 set_target_properties(tbb
240   PROPERTIES OUTPUT_NAME tbb
241   DEBUG_POSTFIX "${tbb_debug_postfix}"
242   ARCHIVE_OUTPUT_DIRECTORY ${3P_LIBRARY_OUTPUT_PATH}
243   RUNTIME_OUTPUT_DIRECTORY ${EXECUTABLE_OUTPUT_PATH}
244   )
245
246 if(ENABLE_SOLUTION_FOLDERS)
247   set_target_properties(tbb PROPERTIES FOLDER "3rdparty")
248 endif()
249
250 if(NOT BUILD_SHARED_LIBS)
251   install(TARGETS tbb ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT main)
252 endif()
253
254 # get TBB version
255 ocv_parse_header("${tbb_src_dir}/include/tbb/tbb_stddef.h" TBB_VERSION_LINES TBB_VERSION_MAJOR TBB_VERSION_MINOR TBB_INTERFACE_VERSION CACHE)