Make openoffice.org plugin compile
[kworship.git] / cmake / modules / FindUNO.cmake
blob37eca54e28bf41a6730ada31d887e7795a9fd597
1 # need to find out:
2 # OO_SDK_HOME (e.g. /usr/lib64/openoffice.org/sdk)
3 # oo.org program dir
5 # UNO_APPENDS(<output> {<suffix>} PATHS {<prefix>})
6 # Writes all combinations of <prefix>/<suffix> to <output>
7 MACRO (UNO_APPEND_PATHS output)
8   SET(UNO_APPEND_PATHS_SUFFIXES "")
9   SET(UNO_APPEND_PATHS_RESULTS "")
10   SET(UNO_APPEND_PATHS_STEP 0)
11   FOREACH (UNO_APPEND_PATHS_ARG ${ARGN})
12     IF (UNO_APPEND_PATHS_STEP)
13       # add to results this prefix with each suffix appended
14       FOREACH (UNO_APPEND_PATHS_SUFFIX ${UNO_APPEND_PATHS_SUFFIXES})
15         SET(UNO_APPEND_PATHS_RESULTS ${UNO_APPEND_PATHS_RESULTS} "${UNO_APPEND_PATHS_ARG}/${UNO_APPEND_PATHS_SUFFIX}")
16       ENDFOREACH (UNO_APPEND_PATHS_SUFFIX)
17     ELSEIF (UNO_APPEND_PATHS_ARG STREQUAL "PATHS")
18       # If we have reached paths, switch processing step
19       SET(UNO_APPEND_PATHS_STEP 1)
20     ELSE (UNO_APPEND_PATHS_STEP)
21       # Just suffixes, gather them together
22       SET(UNO_APPEND_PATHS_SUFFIXES ${UNO_APPEND_PATHS_SUFFIXES} ${UNO_APPEND_PATHS_ARG})
23     ENDIF (UNO_APPEND_PATHS_STEP)
24   ENDFOREACH (UNO_APPEND_PATHS_ARG)
25   SET(${output} ${UNO_APPEND_PATHS_RESULTS})
26 ENDMACRO (UNO_APPEND_PATHS)
28 # Find OO location
29 SET(UNO_OO_HOME_LIBS "/usr/lib64" "/usr/lib" "/opt")
30 UNO_APPEND_PATHS(UNO_OO_HOMES "openoffice.org3" "openoffice.org" PATHS ${UNO_OO_HOME_LIBS})
31 FIND_PATH(UNO_OO_HOME "program/versionrc" PATHS ${UNO_OO_HOMES})
33 # Find OO SDK location
34 UNO_APPEND_PATHS(UNO_OO_SDK_HOMES "basis-link/sdk" "sdk" PATHS ${UNO_OO_HOME})
35 FIND_PATH(UNO_OO_SDK_HOME "include/sal/types.h" PATHS ${UNO_OO_SDK_HOMES})
37 SET(UNO_OO_SDK_BINS "${UNO_OO_SDK_HOME}/linux/bin" "${UNO_OO_HOME}/basis-link/ure-link/bin" "${UNO_OO_SDK_HOME}/bin")
38 SET(UNO_IDL_PATH "${UNO_OO_SDK_HOME}/idl")
39 SET(UNO_INCLUDES "${UNO_OO_SDK_HOME}/include")
40 SET(UNO_OO_PROGRAM "${UNO_OO_HOME}/program")
41 SET(UNO_OO_PROGRAMS "${UNO_OO_HOME}/basis-link/program" "${UNO_OO_HOME}/program")
43 # Find registry databases
44 SET(UNO_OO_RDBS )
45 # offapi (OO.org 3) has the OpenOffice.org API
46 FIND_FILE(UNO_OO_OFFAPI_RDB "offapi.rdb" PATHS ${UNO_OO_PROGRAMS})
47 IF(UNO_OO_OFFAPI_RDB)
48   SET(UNO_OO_RDBS ${UNO_OO_RDBS} ${UNO_OO_OFFAPI_RDB})
49 ENDIF(UNO_OO_OFFAPI_RDB)
50 # types has UNO types and (OO.org 2) OpenOffice.org API
51 FIND_FILE(UNO_OO_TYPES_RDB "types.rdb" PATHS ${UNO_OO_PROGRAMS} "${UNO_OO_HOME}/basis-link/ure-link/share/misc")
52 IF(UNO_OO_TYPES_RDB)
53   SET(UNO_OO_RDBS ${UNO_OO_RDBS} ${UNO_OO_TYPES_RDB})
54 ENDIF(UNO_OO_TYPES_RDB)
56 # Programs
57 FIND_PROGRAM(UNO_IDLC      "idlc"      PATHS ${UNO_OO_SDK_BINS})
58 FIND_PROGRAM(UNO_REGMERGE  "regmerge"  PATHS ${UNO_OO_SDK_BINS})
59 FIND_PROGRAM(UNO_CPPUMAKER "cppumaker" PATHS ${UNO_OO_SDK_BINS})
60 FIND_PROGRAM(UNO_REGCOMP   "regcomp"   PATHS ${UNO_OO_SDK_BINS})
62 # OS dependent preprocessor definitions
63 IF (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
64   SET(UNO_CPPU_ENV gcc3)
65   SET(UNO_SHLIB_EXT so)
66   ADD_DEFINITIONS(-DUNX -DGCC -DLINUX)
67   SET(UNO_TOOL_ENV env LD_LIBRARY_PATH=${UNO_OO_SDK_HOME}/linux/lib:${UNO_OO_HOME}/basis-link/ure-link/lib)
68 ELSE (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
69   MESSAGE("warning: unrecognised system ${CMAKE_SYSTEM_NAME} - you may need to add UNO preprocessor definitions to ${CMAKE_CURRENT_LIST_FILE}")
70 ENDIF (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
72 # Libraries
73 SET(UNO_LIB_PATHS ${UNO_OO_PROGRAMS} "${UNO_OO_HOME}/basis-link/ure-link/lib")
74 MACRO(FIND_UNO_LIB output name)
75   FIND_LIBRARY(${output} NAMES ${name} PATHS ${UNO_LIB_PATHS})
76   IF(NOT ${output})
77     FIND_FILE(${output} NAMES lib${name}.so.3 PATHS ${UNO_LIB_PATHS})
78   ENDIF(NOT ${output})
79 ENDMACRO(FIND_UNO_LIB)
81 FIND_UNO_LIB(UNO_SAL_LIB        uno_sal) 
82 FIND_UNO_LIB(UNO_CPPU_LIB       uno_cppu) 
83 FIND_UNO_LIB(UNO_CPPUHELPER_LIB uno_cppuhelper${UNO_CPPU_ENV}) 
84 FIND_UNO_LIB(UNO_SALHELPER_LIB  uno_salhelper${UNO_CPPU_ENV}) 
85 FIND_UNO_LIB(UNO_REG_LIB        reg) 
86 FIND_UNO_LIB(UNO_STORE_LIB      store) 
88 # We need these programs to continue
89 IF (    UNO_OO_HOME
90     AND UNO_OO_SDK_HOME
91     AND UNO_OO_TYPES_RDB
92     AND UNO_IDLC
93     AND UNO_REGMERGE
94     AND UNO_REGCOMP
95     AND UNO_CPPUMAKER
96     AND UNO_CPPUHELPER_LIB
97     AND UNO_CPPU_LIB
98     AND UNO_SALHELPER_LIB
99     AND UNO_SAL_LIB
100     )
101   # SUCCESS
102   SET(UNO_FOUND TRUE)
104   SET(UNO_LIBS
105       ${UNO_CPPUHELPER_LIB}
106       ${UNO_CPPU_LIB}
107       ${UNO_SALHELPER_LIB}
108       ${UNO_SAL_LIB}
109   )
111   ADD_DEFINITIONS(-DCPPU_ENV=${UNO_CPPU_ENV})
113   FIND_PATH(UNO_INCLUDE_DIR uno.h /usr/include/uno /usr/local/include/uno)
115   # Macros
117   # UNO_ADD_TYPES(sourcevar {types} )
118   MACRO (UNO_ADD_TYPES sourcevar)
119     SET(UNO_COMPONENT_INC "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/uno_include")
120     SET(UNO_RDB "${CMAKE_CURRENT_BINARY_DIR}/types.rdb")
121     # Add include directory
122     INCLUDE_DIRECTORIES(${UNO_COMPONENT_INC})
124     # rdb -> [cppumaker] -> hpp
125     SET(UNO_HPPFILES )
126     SET(UNO_URDFILES )
127     SET(UNO_TYPELIST )
128     # prefix each type with -T
129     FOREACH(type ${ARGN})
130       SET(UNO_TYPELIST ${UNO_TYPELIST} -T${type})
131       STRING(REPLACE "." "/" UNO_HPPFILE "${type}")
132       SET(UNO_IDLFILE "${UNO_IDL_PATH}/${UNO_HPPFILE}.idl")
133       SET(UNO_URDFILE "${UNO_COMPONENT_INC}/${UNO_HPPFILE}.urd")
134       GET_FILENAME_COMPONENT(UNO_URDDIR "${UNO_COMPONENT_INC}/${UNO_HPPFILE}.urd" PATH)
135       SET(UNO_HPPFILE "${UNO_COMPONENT_INC}/${UNO_HPPFILE}.hpp")
136       SET(UNO_URDFILES ${UNO_URDFILES} ${UNO_URDFILE})
137       SET(UNO_HPPFILES ${UNO_HPPFILES} ${UNO_HPPFILE})
138       # idl file is compiled into urd file
139       #ADD_CUSTOM_COMMAND(
140       #  OUTPUT ${UNO_URDFILE}
141       #  COMMAND ${UNO_TOOL_ENV} ${UNO_IDLC} -C -I${UNO_IDL_PATH} ${UNO_IDLFILE} -O${UNO_URDDIR}
142       #  MAIN_DEPENDENCY ${UNO_IDLFILE}
143       #)
144     ENDFOREACH(type)
146     # Combined into a single command because regcomp alters the rdb
147     ADD_CUSTOM_COMMAND(
148       OUTPUT ${UNO_RDB} ${UNO_HPPFILES}
149       COMMAND ${UNO_TOOL_ENV} ${UNO_REGMERGE} ${UNO_RDB} / ${UNO_OO_RDBS} #${UNO_URDFILES}
150       COMMAND ${UNO_TOOL_ENV} ${UNO_CPPUMAKER} -Gc -BUCR -O${UNO_COMPONENT_INC} ${UNO_TYPELIST} ${UNO_RDB}
151       COMMAND ${UNO_TOOL_ENV} ${UNO_REGCOMP} -register -r ${UNO_RDB} -c connector.uno.${UNO_SHLIB_EXT}
152       COMMAND ${UNO_TOOL_ENV} ${UNO_REGCOMP} -register -r ${UNO_RDB} -c remotebridge.uno.${UNO_SHLIB_EXT}
153       COMMAND ${UNO_TOOL_ENV} ${UNO_REGCOMP} -register -r ${UNO_RDB} -c bridgefac.uno.${UNO_SHLIB_EXT}
154       COMMAND ${UNO_TOOL_ENV} ${UNO_REGCOMP} -register -r ${UNO_RDB} -c uuresolver.uno.${UNO_SHLIB_EXT}
155       DEPENDS ${UNO_OO_RDBS}
156     )
158     # Make each source file depend on the header files
159     SET_SOURCE_FILES_PROPERTIES(${${sourcevar}} PROPERTIES OBJECT_DEPENDS "${UNO_HPPFILES}")
160   ENDMACRO (UNO_ADD_TYPES)
162 ENDIF (UNO_OO_HOME     AND UNO_OO_SDK_HOME AND UNO_OO_TYPES_RDB
163        AND UNO_IDLC    AND UNO_REGMERGE
164        AND UNO_REGCOMP AND UNO_CPPUMAKER
165        AND UNO_CPPUHELPER_LIB AND UNO_CPPU_LIB
166        AND UNO_SALHELPER_LIB  AND UNO_SAL_LIB
167     )
169 IF (UNO_FOUND)
170   IF (NOT UNO_FIND_QUIETLY)
171     MESSAGE(STATUS "Found UNO: ${UNO_OO_SDK_HOME}")
172   ENDIF (NOT UNO_FIND_QUIETLY)
173 ELSE (UNO_FOUND)
174   IF (UNO_FIND_REQUIRED)
175     MESSAGE(FATAL_ERROR "Could not find UNO")
176   ENDIF (UNO_FIND_REQUIRED)
177 ENDIF (UNO_FOUND)