1# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
2# file Copyright.txt or https://cmake.org/licensing for details.
3
4#
5
6# See FindKDE3.cmake for documentation.
7#
8# this file contains the following macros:
9# KDE3_ADD_DCOP_SKELS
10# KDE3_ADD_DCOP_STUBS
11# KDE3_ADD_MOC_FILES
12# KDE3_ADD_UI_FILES
13# KDE3_ADD_KCFG_FILES
14# KDE3_AUTOMOC
15# KDE3_INSTALL_LIBTOOL_FILE
16# KDE3_CREATE_FINAL_FILE
17# KDE3_ADD_KPART
18# KDE3_ADD_KDEINIT_EXECUTABLE
19# KDE3_ADD_EXECUTABLE
20
21
22#[email protected]
23
24include(AddFileDependencies)
25
26#create the kidl and skeletion file for dcop stuff
27#usage: KDE_ADD_COP_SKELS(foo_SRCS ${dcop_headers})
28macro(KDE3_ADD_DCOP_SKELS _sources)
29  foreach (_current_FILE ${ARGN})
30
31    get_filename_component(_tmp_FILE ${_current_FILE} ABSOLUTE)
32    get_filename_component(_basename ${_tmp_FILE} NAME_WE)
33
34    set(_skel ${CMAKE_CURRENT_BINARY_DIR}/${_basename}_skel.cpp)
35    set(_kidl ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.kidl)
36
37    if (NOT HAVE_${_basename}_KIDL_RULE)
38      set(HAVE_${_basename}_KIDL_RULE ON)
39
40      add_custom_command(OUTPUT ${_kidl}
41        COMMAND ${KDE3_DCOPIDL_EXECUTABLE}
42        ARGS ${_tmp_FILE} > ${_kidl}
43        DEPENDS ${_tmp_FILE}
44      )
45
46    endif ()
47
48    if (NOT HAVE_${_basename}_SKEL_RULE)
49      set(HAVE_${_basename}_SKEL_RULE ON)
50
51      add_custom_command(OUTPUT ${_skel}
52        COMMAND ${KDE3_DCOPIDL2CPP_EXECUTABLE}
53        ARGS --c++-suffix cpp --no-signals --no-stub ${_kidl}
54        DEPENDS ${_kidl}
55      )
56
57    endif ()
58
59    set(${_sources} ${${_sources}} ${_skel})
60
61  endforeach ()
62
63endmacro()
64
65
66macro(KDE3_ADD_DCOP_STUBS _sources)
67  foreach (_current_FILE ${ARGN})
68
69    get_filename_component(_tmp_FILE ${_current_FILE} ABSOLUTE)
70
71    get_filename_component(_basename ${_tmp_FILE} NAME_WE)
72
73    set(_stub_CPP ${CMAKE_CURRENT_BINARY_DIR}/${_basename}_stub.cpp)
74    set(_kidl ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.kidl)
75
76    if (NOT HAVE_${_basename}_KIDL_RULE)
77      set(HAVE_${_basename}_KIDL_RULE ON)
78
79
80      add_custom_command(OUTPUT ${_kidl}
81        COMMAND ${KDE3_DCOPIDL_EXECUTABLE}
82        ARGS ${_tmp_FILE} > ${_kidl}
83        DEPENDS ${_tmp_FILE}
84      )
85
86    endif ()
87
88
89    if (NOT HAVE_${_basename}_STUB_RULE)
90      set(HAVE_${_basename}_STUB_RULE ON)
91
92      add_custom_command(OUTPUT ${_stub_CPP}
93        COMMAND ${KDE3_DCOPIDL2CPP_EXECUTABLE}
94        ARGS --c++-suffix cpp --no-signals --no-skel ${_kidl}
95        DEPENDS ${_kidl}
96      )
97
98    endif ()
99
100    set(${_sources} ${${_sources}} ${_stub_CPP})
101
102  endforeach ()
103
104endmacro()
105
106
107macro(KDE3_ADD_KCFG_FILES _sources)
108  foreach (_current_FILE ${ARGN})
109
110    get_filename_component(_tmp_FILE ${_current_FILE} ABSOLUTE)
111
112    get_filename_component(_basename ${_tmp_FILE} NAME_WE)
113
114    file(READ ${_tmp_FILE} _contents)
115    string(REGEX REPLACE "^(.*\n)?File=([^\n]+)\n.*$" "\\2"  _kcfg_FILE "${_contents}")
116
117    set(_src_FILE    ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.cpp)
118    set(_header_FILE ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.h)
119
120    add_custom_command(OUTPUT ${_src_FILE}
121      COMMAND ${KDE3_KCFGC_EXECUTABLE}
122      ARGS ${CMAKE_CURRENT_SOURCE_DIR}/${_kcfg_FILE} ${_tmp_FILE}
123      DEPENDS ${_tmp_FILE} ${CMAKE_CURRENT_SOURCE_DIR}/${_kcfg_FILE}
124    )
125
126    set(${_sources} ${${_sources}} ${_src_FILE})
127
128  endforeach ()
129
130endmacro()
131
132
133#create the moc files and add them to the list of sources
134#usage: KDE_ADD_MOC_FILES(foo_SRCS ${moc_headers})
135macro(KDE3_ADD_MOC_FILES _sources)
136  foreach (_current_FILE ${ARGN})
137
138    get_filename_component(_tmp_FILE ${_current_FILE} ABSOLUTE)
139
140    get_filename_component(_basename ${_tmp_FILE} NAME_WE)
141    set(_moc ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.moc.cpp)
142
143    add_custom_command(OUTPUT ${_moc}
144      COMMAND ${QT_MOC_EXECUTABLE}
145      ARGS ${_tmp_FILE} -o ${_moc}
146      DEPENDS ${_tmp_FILE}
147    )
148
149    set(${_sources} ${${_sources}} ${_moc})
150
151  endforeach ()
152endmacro()
153
154
155get_filename_component( KDE3_MODULE_DIR  ${CMAKE_CURRENT_LIST_FILE} PATH)
156
157#create the implementation files from the ui files and add them to the list of sources
158#usage: KDE_ADD_UI_FILES(foo_SRCS ${ui_files})
159macro(KDE3_ADD_UI_FILES _sources )
160  foreach (_current_FILE ${ARGN})
161
162    get_filename_component(_tmp_FILE ${_current_FILE} ABSOLUTE)
163
164    get_filename_component(_basename ${_tmp_FILE} NAME_WE)
165    set(_header ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.h)
166    set(_src ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.cpp)
167    set(_moc ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.moc.cpp)
168
169    add_custom_command(OUTPUT ${_header}
170      COMMAND ${QT_UIC_EXECUTABLE}
171      ARGS  -L ${KDE3_LIB_DIR}/kde3/plugins/designer -nounload -o ${_header} ${CMAKE_CURRENT_SOURCE_DIR}/${_current_FILE}
172      DEPENDS ${_tmp_FILE}
173    )
174
175    add_custom_command(OUTPUT ${_src}
176      COMMAND ${CMAKE_COMMAND}
177      ARGS
178        -DKDE_UIC_PLUGIN_DIR:FILEPATH=${KDE3_LIB_DIR}/kde3/plugins/designer
179        -DKDE_UIC_EXECUTABLE:FILEPATH=${QT_UIC_EXECUTABLE}
180        -DKDE_UIC_FILE:FILEPATH=${_tmp_FILE}
181        -DKDE_UIC_CPP_FILE:FILEPATH=${_src}
182        -DKDE_UIC_H_FILE:FILEPATH=${_header}
183        -P ${KDE3_MODULE_DIR}/kde3uic.cmake
184      DEPENDS ${_header}
185    )
186
187    add_custom_command(OUTPUT ${_moc}
188      COMMAND ${QT_MOC_EXECUTABLE}
189      ARGS ${_header} -o ${_moc}
190      DEPENDS ${_header}
191    )
192
193    set(${_sources} ${${_sources}} ${_src} ${_moc} )
194
195  endforeach ()
196endmacro()
197
198
199macro(KDE3_AUTOMOC)
200  set(_matching_FILES )
201  foreach (_current_FILE ${ARGN})
202
203    get_filename_component(_abs_FILE ${_current_FILE} ABSOLUTE)
204
205    # if "SKIP_AUTOMOC" is set to true, we will not handle this file here.
206    # here. this is required to make bouic work correctly:
207    # we need to add generated .cpp files to the sources (to compile them),
208    # but we cannot let automoc handle them, as the .cpp files don't exist yet when
209    # cmake is run for the very first time on them -> however the .cpp files might
210    # exist at a later run. at that time we need to skip them, so that we don't add two
211    # different rules for the same moc file
212    get_source_file_property(_skip ${_abs_FILE} SKIP_AUTOMOC)
213
214    if (EXISTS ${_abs_FILE} AND NOT _skip)
215
216      file(STRINGS ${_abs_FILE} _match REGEX "#include +[^ ]+\\.moc[\">]")
217
218      get_filename_component(_abs_PATH ${_abs_FILE} PATH)
219
220      foreach (_current_MOC_INC IN LISTS _match)
221        string(REGEX MATCH "[^ <\"]+\\.moc" _current_MOC "${_current_MOC_INC}")
222
223        get_filename_component(_basename ${_current_MOC} NAME_WE)
224#       set(_header ${CMAKE_CURRENT_SOURCE_DIR}/${_basename}.h)
225        set(_header ${_abs_PATH}/${_basename}.h)
226        set(_moc    ${CMAKE_CURRENT_BINARY_DIR}/${_current_MOC})
227
228        add_custom_command(OUTPUT ${_moc}
229          COMMAND ${QT_MOC_EXECUTABLE}
230          ARGS ${_header} -o ${_moc}
231          DEPENDS ${_header}
232        )
233
234        ADD_FILE_DEPENDENCIES(${_abs_FILE} ${_moc})
235
236      endforeach ()
237      unset(_match)
238      unset(_header)
239      unset(_moc)
240    endif ()
241  endforeach ()
242endmacro()
243
244# only used internally by KDE3_INSTALL_ICONS
245macro (_KDE3_ADD_ICON_INSTALL_RULE _install_SCRIPT _install_PATH _group _orig_NAME _install_NAME)
246
247  # if the string doesn't match the pattern, the result is the full string, so all three have the same content
248  if (NOT ${_group} STREQUAL ${_install_NAME} )
249    set(_icon_GROUP "actions")
250
251    if (${_group} STREQUAL "mime")
252      set(_icon_GROUP  "mimetypes")
253    endif ()
254
255    if (${_group} STREQUAL "filesys")
256      set(_icon_GROUP  "filesystems")
257    endif ()
258
259    if (${_group} STREQUAL "device")
260      set(_icon_GROUP  "devices")
261    endif ()
262
263    if (${_group} STREQUAL "app")
264      set(_icon_GROUP  "apps")
265    endif ()
266
267    if (${_group} STREQUAL "action")
268      set(_icon_GROUP  "actions")
269    endif ()
270
271    # message(STATUS "icon: ${_current_ICON} size: ${_size} group: ${_group} name: ${_name}" )
272    install(FILES ${_orig_NAME} DESTINATION ${_install_PATH}/${_icon_GROUP}/ RENAME ${_install_NAME} )
273  endif ()
274
275endmacro ()
276
277
278macro (KDE3_INSTALL_ICONS _theme )
279  set(_defaultpath "${CMAKE_INSTALL_PREFIX}/share/icons")
280  # first the png icons
281  file(GLOB _icons *.png)
282  foreach (_current_ICON ${_icons} )
283    string(REGEX REPLACE "^.*/[a-zA-Z]+([0-9]+)\\-([a-z]+)\\-(.+\\.png)$" "\\1" _size  "${_current_ICON}")
284    string(REGEX REPLACE "^.*/[a-zA-Z]+([0-9]+)\\-([a-z]+)\\-(.+\\.png)$" "\\2" _group "${_current_ICON}")
285    string(REGEX REPLACE "^.*/[a-zA-Z]+([0-9]+)\\-([a-z]+)\\-(.+\\.png)$" "\\3" _name  "${_current_ICON}")
286    _KDE3_ADD_ICON_INSTALL_RULE(${CMAKE_CURRENT_BINARY_DIR}/install_icons.cmake
287                                ${_defaultpath}/${_theme}/${_size}x${_size}
288                                ${_group} ${_current_ICON} ${_name})
289  endforeach ()
290
291  # and now the svg icons
292  file(GLOB _icons *.svgz)
293  foreach (_current_ICON ${_icons} )
294    string(REGEX REPLACE "^.*/crsc\\-([a-z]+)\\-(.+\\.svgz)$" "\\1" _group "${_current_ICON}")
295    string(REGEX REPLACE "^.*/crsc\\-([a-z]+)\\-(.+\\.svgz)$" "\\2" _name "${_current_ICON}")
296    _KDE3_ADD_ICON_INSTALL_RULE(${CMAKE_CURRENT_BINARY_DIR}/install_icons.cmake
297                                ${_defaultpath}/${_theme}/scalable
298                                ${_group} ${_current_ICON} ${_name})
299  endforeach ()
300
301endmacro ()
302
303macro(KDE3_INSTALL_LIBTOOL_FILE _target)
304  get_target_property(_target_location ${_target} LOCATION)
305
306  get_filename_component(_laname ${_target_location} NAME_WE)
307  get_filename_component(_soname ${_target_location} NAME)
308  set(_laname ${CMAKE_CURRENT_BINARY_DIR}/${_laname}.la)
309
310  file(WRITE ${_laname} "# ${_laname} - a libtool library file, generated by cmake \n")
311  file(APPEND ${_laname} "# The name that we can dlopen(3).\n")
312  file(APPEND ${_laname} "dlname='${_soname}'\n")
313  file(APPEND ${_laname} "# Names of this library\n")
314  if(CYGWIN)
315    file(APPEND ${_laname} "library_names='${_soname}'\n")
316  else()
317    file(APPEND ${_laname} "library_names='${_soname} ${_soname} ${_soname}'\n")
318  endif()
319  file(APPEND ${_laname} "# The name of the static archive\n")
320  file(APPEND ${_laname} "old_library=''\n")
321  file(APPEND ${_laname} "# Libraries that this one depends upon.\n")
322  file(APPEND ${_laname} "dependency_libs=''\n")
323#   file(APPEND ${_laname} "dependency_libs='${${_target}_LIB_DEPENDS}'\n")
324  file(APPEND ${_laname} "# Version information.\ncurrent=0\nage=0\nrevision=0\n")
325  file(APPEND ${_laname} "# Is this an already installed library?\ninstalled=yes\n")
326  file(APPEND ${_laname} "# Should we warn about portability when linking against -modules?\nshouldnotlink=yes\n")
327  file(APPEND ${_laname} "# Files to dlopen/dlpreopen\ndlopen=''\ndlpreopen=''\n")
328  file(APPEND ${_laname} "# Directory that this library needs to be installed in:\n")
329  file(APPEND ${_laname} "libdir='${CMAKE_INSTALL_PREFIX}/lib/kde3'\n")
330
331  install_files(${KDE3_LIBTOOL_DIR} FILES ${_laname})
332endmacro()
333
334
335macro(KDE3_CREATE_FINAL_FILE _filename)
336  file(WRITE ${_filename} "//autogenerated file\n")
337  foreach (_current_FILE ${ARGN})
338    file(APPEND ${_filename} "#include \"${_current_FILE}\"\n")
339  endforeach ()
340
341endmacro()
342
343
344# option(KDE3_ENABLE_FINAL "Enable final all-in-one compilation")
345option(KDE3_BUILD_TESTS  "Build the tests")
346
347
348macro(KDE3_ADD_KPART _target_NAME _with_PREFIX)
349#is the first argument is "WITH_PREFIX" then keep the standard "lib" prefix, otherwise SET the prefix empty
350  if (${_with_PREFIX} STREQUAL "WITH_PREFIX")
351    set(_first_SRC)
352  else ()
353    set(_first_SRC ${_with_PREFIX})
354  endif ()
355
356#    if (KDE3_ENABLE_FINAL)
357#       KDE3_CREATE_FINAL_FILE(${_target_NAME}_final.cpp ${_first_SRC} ${ARGN})
358#       add_library(${_target_NAME} MODULE  ${_target_NAME}_final.cpp)
359#    else ()
360  add_library(${_target_NAME} MODULE ${_first_SRC} ${ARGN})
361#    endif ()
362
363  if(_first_SRC)
364    set_target_properties(${_target_NAME} PROPERTIES PREFIX "")
365  endif()
366
367  KDE3_INSTALL_LIBTOOL_FILE(${_target_NAME})
368
369endmacro()
370
371
372macro(KDE3_ADD_KDEINIT_EXECUTABLE _target_NAME )
373
374#    if (KDE3_ENABLE_FINAL)
375#       KDE3_CREATE_FINAL_FILE(${_target_NAME}_final.cpp ${ARGN})
376#       add_library(kdeinit_${_target_NAME} SHARED  ${_target_NAME}_final.cpp)
377#    else ()
378  add_library(kdeinit_${_target_NAME} SHARED ${ARGN} )
379#    endif ()
380
381  configure_file(${KDE3_MODULE_DIR}/kde3init_dummy.cpp.in ${CMAKE_CURRENT_BINARY_DIR}/${_target_NAME}_dummy.cpp)
382
383  add_executable( ${_target_NAME} ${CMAKE_CURRENT_BINARY_DIR}/${_target_NAME}_dummy.cpp )
384  target_link_libraries( ${_target_NAME} kdeinit_${_target_NAME} )
385
386endmacro()
387
388
389macro(KDE3_ADD_EXECUTABLE _target_NAME )
390
391#    if (KDE3_ENABLE_FINAL)
392#       KDE3_CREATE_FINAL_FILE(${_target_NAME}_final.cpp ${ARGN})
393#       add_executable(${_target_NAME} ${_target_NAME}_final.cpp)
394#    else ()
395  add_executable(${_target_NAME} ${ARGN} )
396#    endif ()
397
398endmacro()
399
400
401