Fix cmake to build OpenCV framework on OSX
[profile/ivi/opencv.git] / modules / world / CMakeLists.txt
1 set(the_description "All the selected OpenCV modules in a single binary")
2 set(OPENCV_MODULE_IS_PART_OF_WORLD FALSE)
3 set(BUILD_opencv_world_INIT OFF)
4
5 if(IOS OR NOT BUILD_SHARED_LIBS)
6   set(OPENCV_MODULE_TYPE STATIC)
7   set(OPENCV_WORLD_FLAGS_PROPERTY STATIC_LIBRARY_FLAGS)
8 else()
9   set(OPENCV_WORLD_FLAGS_PROPERTY LINK_FLAGS)
10 endif()
11
12 ocv_add_module(world opencv_core)
13
14 if(MSVC)
15   foreach(_var CMAKE_EXE_LINKER_FLAGS_RELEASE CMAKE_MODULE_LINKER_FLAGS_RELEASE CMAKE_SHARED_LINKER_FLAGS_RELEASE
16                CMAKE_EXE_LINKER_FLAGS_DEBUG   CMAKE_MODULE_LINKER_FLAGS_DEBUG   CMAKE_SHARED_LINKER_FLAGS_DEBUG)
17     string(REPLACE "/INCREMENTAL:NO" "/INCREMENTAL:YES" ${_var} "${${_var}}")
18   endforeach()
19 endif()
20
21 ocv_glob_module_sources()
22 ocv_module_include_directories()
23 ocv_create_module(SKIP_LINK)
24
25 #TODO: try to use try_compile to find real object file extension/location
26 if(CMAKE_GENERATOR MATCHES "^Visual.*$")
27   set(have_cfg 1)
28   set(objpath0 "<MODULE_NAME>.dir/<CONFIGURATION>/<SRC_NAME_WE>.obj")
29 elseif (CMAKE_GENERATOR MATCHES Xcode)
30   set(have_cfg 1)
31   set(objpath0 "OpenCV.build/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/<MODULE_NAME>.build/Objects-normal/$(CURRENT_ARCH)/<SRC_NAME_WE>.o")
32 else()
33   set(have_cfg 0)
34   set(objpath0 "CMakeFiles/<MODULE_NAME>.dir/<RELATIVE_SRC_NAME>.o")
35   if(MINGW OR MSVC)
36     set(objpath0 "${objpath0}bj")
37   endif()
38 endif()
39
40 set(objlist "")
41 foreach(m ${OPENCV_MODULE_${the_module}_DEPS})
42   # build order dependencies
43   add_dependencies(${the_module} ${m})
44   # link dependencies
45   string(REGEX REPLACE "(general|debug|optimized);opencv_[^;]*(;|$)" "" _link_deps "${${m}_LIB_DEPENDS}")
46   if(_link_deps)
47     target_link_libraries(${the_module} ${_link_deps})
48   endif()
49
50   string(REGEX REPLACE "<MODULE_NAME>" "${m}" objpath1 "${${m}_BINARY_DIR}/${objpath0}")
51   foreach(srcname ${OPENCV_MODULE_${m}_SOURCES})
52     if(srcname MATCHES "\\.(cpp|mm|c|cxx|cc|o|obj)$")
53       if(srcname MATCHES "\\.(o|obj)$")
54         if(IS_ABSOLUTE "${srcname}")
55           set(objpath3 "${srcname}")
56         else()
57           set(objpath3 "${${m}_SOURCE_DIR}/${srcname}")
58         endif()
59       else()
60         if(IS_ABSOLUTE "${srcname}")
61           if(srcname MATCHES "/(qrc|moc)_[^/]*\\.cxx$")
62             # QT generated sources
63             file(RELATIVE_PATH srcname "${${m}_BINARY_DIR}" "${srcname}")
64           else()
65             file(RELATIVE_PATH srcname "${OPENCV_MODULE_${m}_LOCATION}" "${srcname}")
66           endif()
67         endif()
68         string(REPLACE ".." "__" srcname "${srcname}")
69         #NAME_WE intentionally not used since it interprets first period as start of extension (http://cmake.org/Bug/view.php?id=12282)
70         get_filename_component(srcname_we "${srcname}" NAME)
71         string(REGEX REPLACE "\\.[^.]+$" "" srcname_we "${srcname_we}")
72         string(REGEX REPLACE <SRC_NAME_WE> "${srcname_we}" objpath2 "${objpath1}")
73         string(REGEX REPLACE <RELATIVE_SRC_NAME> "${srcname}" objpath3 "${objpath2}")
74       endif()
75       if(CMAKE_GENERATOR MATCHES Makefiles)
76         file(RELATIVE_PATH objpath4 "${CMAKE_CURRENT_BINARY_DIR}" "${objpath3}")
77       else()
78         set(objpath4 ${objpath3})
79       endif()
80       list(APPEND objlist "\"${objpath4}\"")
81     endif()
82   endforeach()
83 endforeach()
84
85
86 macro(ios_include_3party_libs)
87   foreach(l ${ARGN})
88     add_dependencies(${the_module} ${l})
89     string(REGEX REPLACE "<MODULE_NAME>" "${l}" objpath1 "${CMAKE_BINARY_DIR}/3rdparty/${l}/${objpath0}")
90     file(GLOB sources ${CMAKE_SOURCE_DIR}/3rdparty/${l}/*.c)
91     foreach(srcname ${sources})
92       if(IS_ABSOLUTE "${srcname}")
93         file(RELATIVE_PATH srcname "${CMAKE_SOURCE_DIR}/3rdparty/${l}" "${srcname}")
94       endif()
95
96       string(REPLACE ".." "__" srcname "${srcname}")
97       #NAME_WE intentionally not used since it interprets first period as start of extension (http://cmake.org/Bug/view.php?id=12282)
98       get_filename_component(srcname_we "${srcname}" NAME)
99       string(REGEX REPLACE "\\.[^.]+$" "" srcname_we "${srcname_we}")
100       string(REGEX REPLACE <SRC_NAME_WE> "${srcname_we}" objpath2 "${objpath1}")
101       string(REGEX REPLACE <RELATIVE_SRC_NAME> "${srcname}" objpath3 "${objpath2}")
102
103       list(APPEND objlist "\"${objpath3}\"")
104     endforeach() # (srcname ${sources})
105   endforeach()
106   ocv_list_filterout(objlist jmemansi) # <<= dirty fix
107 endmacro()
108
109 if( (IOS OR APPLE) AND WITH_PNG)
110   ios_include_3party_libs(zlib libpng)
111 endif()
112
113 if( (IOS OR APPLE) AND WITH_JPEG)
114   ios_include_3party_libs(libjpeg)
115 endif()
116
117 string(REPLACE ";" " " objlist "${objlist}")
118
119 if(have_cfg)
120   string(REGEX REPLACE "<CONFIGURATION>" "Debug" objlist_dbg "${objlist}")
121   string(REGEX REPLACE "<CONFIGURATION>" "Release" objlist_rls "${objlist}")
122   set_target_properties(${the_module} PROPERTIES
123     ${OPENCV_WORLD_FLAGS_PROPERTY}_DEBUG ${objlist_dbg}
124     ${OPENCV_WORLD_FLAGS_PROPERTY}_RELEASE ${objlist_rls})
125 else()
126   file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/world_objects.list" "${objlist}")
127   execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_BINARY_DIR}/world_objects.list" "${CMAKE_CURRENT_BINARY_DIR}/world_objects.rsp" OUTPUT_QUIET)
128   set_target_properties(${the_module} PROPERTIES
129     ${OPENCV_WORLD_FLAGS_PROPERTY} "@${CMAKE_CURRENT_BINARY_DIR}/world_objects.rsp")
130 endif()
131
132 ocv_add_precompiled_headers(${the_module})