CLAHE Python bindings
[profile/ivi/opencv.git] / 3rdparty / tbb / CMakeLists.txt
1 #Cross compile TBB from source
2 project(tbb)
3
4 # 4.1 update 2 - works fine
5 set(tbb_ver "tbb41_20130116oss")
6 set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb41_20130116oss_src.tgz")
7 set(tbb_md5 "3809790e1001a1b32d59c9fee590ee85")
8 set(tbb_version_file "version_string.ver")
9 ocv_warnings_disable(CMAKE_CXX_FLAGS -Wshadow)
10
11 # 4.1 update 1 - works fine
12 #set(tbb_ver "tbb41_20121003oss")
13 #set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb41_20121003oss_src.tgz")
14 #set(tbb_md5 "2a684fefb855d2d0318d1ef09afa75ff")
15 #set(tbb_version_file "version_string.ver")
16
17 # 4.1 - works fine
18 #set(tbb_ver "tbb41_20120718oss")
19 #set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb41_20120718oss_src.tgz")
20 #set(tbb_md5 "31b9ec300f3d09da2504d5d882788dd4")
21 #set(tbb_version_file "version_string.ver")
22
23 # 4.0 update 5 - works fine
24 #set(tbb_ver "tbb40_20120613oss")
25 #set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb40_20120613oss_src.tgz")
26 #set(tbb_md5 "da01ed74944ec5950cfae3476901a172")
27 #set(tbb_version_file "version_string.ver")
28
29 # 4.0 update 4 - works fine
30 #set(tbb_ver "tbb40_20120408oss")
31 #set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb40_20120408oss_src.tgz")
32 #set(tbb_md5 "734b356da7fe0ed308741f3e6018251e")
33 #set(tbb_version_file "version_string.ver")
34
35 # 4.0 update 3 - build broken
36 #set(tbb_ver "tbb40_20120201oss")
37 #set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb40_20120201oss_src.tgz")
38 #set(tbb_md5 "4669e7d4adee018de7a7b8b972987218")
39 #set(tbb_version_file "version_string.tmp")
40
41 # 4.0 update 2 - works fine
42 #set(tbb_ver "tbb40_20111130oss")
43 #set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb40_20111130oss_src.tgz")
44 #set(tbb_md5 "1e6926b21e865e79772119cd44fc3ad8")
45 #set(tbb_version_file "version_string.tmp")
46 #set(tbb_need_GENERIC_DWORD_LOAD_STORE TRUE)
47
48 # 4.0 update 1 - works fine
49 #set(tbb_ver "tbb40_20111003oss")
50 #set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb40_20111003oss_src.tgz")
51 #set(tbb_md5 "7b5d94eb35a563b29ef402e0fd8f15c9")
52 #set(tbb_version_file "version_string.tmp")
53 #set(tbb_need_GENERIC_DWORD_LOAD_STORE TRUE)
54
55 set(tbb_tarball "${CMAKE_CURRENT_SOURCE_DIR}/${tbb_ver}_src.tgz")
56 set(tbb_src_dir "${CMAKE_CURRENT_BINARY_DIR}/${tbb_ver}")
57
58 macro(getMD5 filename varname)
59   if(CMAKE_VERSION VERSION_GREATER 2.8.6)
60     file(MD5 "${filename}" ${varname})
61   else()
62     execute_process(COMMAND ${CMAKE_COMMAND} -E md5sum "${filename}"
63               RESULT_VARIABLE getMD5_RESULT
64               OUTPUT_VARIABLE getMD5_OUTPUT
65               OUTPUT_STRIP_TRAILING_WHITESPACE)
66     if(getMD5_RESULT EQUAL 0)
67       string(REGEX MATCH "^[a-z0-9]+" ${varname} "${getMD5_OUTPUT}")
68     else()
69       set(${varname} "invalid_md5")
70     endif()
71   endif()
72 endmacro()
73
74 if(EXISTS "${tbb_tarball}")
75   getMD5("${tbb_tarball}" tbb_local_md5)
76   if(NOT tbb_local_md5 STREQUAL tbb_md5)
77     message(WARNING "Local copy of TBB source tarball has invalid MD5 hash: ${tbb_local_md5} (expected: ${tbb_md5})")
78     file(REMOVE "${tbb_tarball}")
79     if(EXISTS "${CMAKE_CURRENT_BINARY_DIR}/${tbb_ver}")
80       file(REMOVE_RECURSE "${CMAKE_CURRENT_BINARY_DIR}/${tbb_ver}")
81     endif()
82   endif()
83 endif()
84
85 if(NOT EXISTS "${tbb_tarball}")
86   message(STATUS "Downloading ${tbb_ver}_src.tgz")
87   file(DOWNLOAD "${tbb_url}" "${tbb_tarball}" TIMEOUT 600 STATUS __statvar)
88   if(NOT __statvar EQUAL 0)
89     message(FATAL_ERROR "Failed to download TBB sources: ${tbb_url}")
90   endif()
91   getMD5("${tbb_tarball}" tbb_local_md5)
92   if(NOT tbb_local_md5 STREQUAL tbb_md5)
93     file(REMOVE "${tbb_tarball}")
94     message(FATAL_ERROR "Downloaded TBB source tarball has invalid MD5 hash: ${tbb_local_md5} (expected: ${tbb_md5})")
95   endif()
96
97   if(EXISTS "${tbb_src_dir}")
98     file(REMOVE_RECURSE "${tbb_src_dir}")
99   endif()
100 endif()
101
102 # untar TBB sources
103 if(NOT EXISTS "${tbb_src_dir}")
104   message(STATUS "Unpacking ${tbb_ver}_src.tgz to ${tbb_src_dir}")
105   execute_process(COMMAND ${CMAKE_COMMAND} -E tar xz "${tbb_tarball}"
106               WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
107               RESULT_VARIABLE tbb_untar_RESULT)
108
109   if(NOT tbb_untar_RESULT EQUAL 0 OR NOT EXISTS "${tbb_src_dir}")
110     message(FATAL_ERROR "Failed to unpack TBB sources")
111   endif()
112 endif()
113
114 set(TBB_INCLUDE_DIRS "${tbb_src_dir}/include" PARENT_SCOPE)
115
116 ocv_include_directories("${tbb_src_dir}/include"
117                         "${tbb_src_dir}/src/"
118                         "${tbb_src_dir}/src/rml/include"
119                         "${CMAKE_CURRENT_SOURCE_DIR}")
120
121 file(GLOB lib_srcs "${tbb_src_dir}/src/tbb/*.cpp")
122 file(GLOB lib_hdrs "${tbb_src_dir}/src/tbb/*.h")
123 list(APPEND lib_srcs "${tbb_src_dir}/src/rml/client/rml_tbb.cpp")
124
125 if (WIN32)
126   add_definitions(-D__TBB_DYNAMIC_LOAD_ENABLED=0
127                 -D__TBB_BUILD=1
128                 -D_UNICODE
129                 -DUNICODE
130                 -DWINAPI_FAMILY=WINAPI_FAMILY_APP
131                 -DDO_ITT_NOTIFY=0
132                ) # defines were copied from windows.cl.inc
133 set(CMAKE_LINKER_FLAGS "${CMAKE_LINKER_FLAGS} /APPCONTAINER")
134 else()
135   add_definitions(-D__TBB_DYNAMIC_LOAD_ENABLED=0         #required
136                   -D__TBB_BUILD=1                        #required
137                   -D__TBB_SURVIVE_THREAD_SWITCH=0        #no cilk support
138                   -DTBB_USE_DEBUG=0                      #just to be sure
139                   -DTBB_NO_LEGACY=1                      #don't need backward compatibility
140                   -DDO_ITT_NOTIFY=0                      #it seems that we don't need these notifications
141                  )
142 endif()
143
144 if (HAVE_LIBPTHREAD)
145   add_definitions(-DUSE_PTHREAD) #required for Unix
146 endif()
147
148 if (CMAKE_COMPILER_IS_GNUCXX)
149   add_definitions(-DTBB_USE_GCC_BUILTINS=1) #required for ARM GCC
150 endif()
151
152 if(ANDROID_COMPILER_IS_CLANG)
153   add_definitions(-D__TBB_GCC_BUILTIN_ATOMICS_PRESENT=1)
154   ocv_warnings_disable(CMAKE_CXX_FLAGS -Wmissing-prototypes)
155 endif()
156
157 if(tbb_need_GENERIC_DWORD_LOAD_STORE)
158   #needed by TBB 4.0 update 1,2; fixed in TBB 4.0 update 3 but it has 2 new problems
159   add_definitions(-D__TBB_USE_GENERIC_DWORD_LOAD_STORE=1)
160   set(tbb_need_GENERIC_DWORD_LOAD_STORE ON PARENT_SCOPE)
161 endif()
162
163 set(TBB_SOURCE_FILES ${lib_srcs} ${lib_hdrs})
164
165 if (ARM AND NOT WIN32)
166   if (NOT ANDROID)
167     set(TBB_SOURCE_FILES ${TBB_SOURCE_FILES} "${CMAKE_CURRENT_SOURCE_DIR}/arm_linux_stub.cpp")
168   endif()
169   set(TBB_SOURCE_FILES ${TBB_SOURCE_FILES} "${CMAKE_CURRENT_SOURCE_DIR}/android_additional.h")
170   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -include \"${CMAKE_CURRENT_SOURCE_DIR}/android_additional.h\"")
171 endif()
172
173 set(TBB_SOURCE_FILES ${TBB_SOURCE_FILES} "${CMAKE_CURRENT_SOURCE_DIR}/${tbb_version_file}")
174
175 add_library(tbb ${TBB_SOURCE_FILES})
176 target_link_libraries(tbb c m dl)
177
178 ocv_warnings_disable(CMAKE_CXX_FLAGS -Wundef -Wmissing-declarations)
179 string(REPLACE "-Werror=non-virtual-dtor" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
180
181 set_target_properties(tbb
182   PROPERTIES OUTPUT_NAME tbb
183   DEBUG_POSTFIX "${OPENCV_DEBUG_POSTFIX}"
184   ARCHIVE_OUTPUT_DIRECTORY ${3P_LIBRARY_OUTPUT_PATH}
185   )
186
187 if(ENABLE_SOLUTION_FOLDERS)
188   set_target_properties(tbb PROPERTIES FOLDER "3rdparty")
189 endif()
190
191 if(NOT BUILD_SHARED_LIBS)
192   install(TARGETS tbb ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT main)
193 endif()
194
195 # get TBB version
196 ocv_parse_header("${tbb_src_dir}/include/tbb/tbb_stddef.h" TBB_VERSION_LINES TBB_VERSION_MAJOR TBB_VERSION_MINOR TBB_INTERFACE_VERSION CACHE)