1# SPDX-FileCopyrightText: 2006-2010 Alexander Neundorf <neundorf@kde.org>
2# SPDX-License-Identifier: BSD-3-Clause
3
4include(FeatureSummary)
5if( COMMAND set_package_properties )
6  macro( marble_set_package_properties )
7  set_package_properties( ${ARGN} )
8  endmacro()
9else()
10  macro( marble_set_package_properties )
11  # Just ignore it
12  endmacro()
13endif()
14
15if ( COMMAND feature_summary )
16  macro( marble_feature_summary )
17  feature_summary( ${ARGN} )
18  endmacro()
19else()
20  macro( marble_feature_summary )
21  # Just ignore it
22  endmacro()
23endif()
24
25macro(qt_add_resources)
26  qt5_add_resources(${ARGN})
27endmacro()
28
29macro(qt_wrap_ui)
30  qt5_wrap_ui(${ARGN})
31endmacro()
32
33macro(qt_generate_moc)
34  qt5_generate_moc(${ARGN})
35endmacro()
36
37# the place to put in common cmake macros
38# this is needed to minimize the amount of errors to do
39macro( marble_add_plugin _target_name )
40set( _src ${ARGN} )
41if (STATIC_BUILD)
42    add_library(${_target_name} ${_src})
43    target_compile_definitions(${_target_name} PRIVATE -DQT_STATICPLUGIN)
44else()
45    add_library(${_target_name} MODULE ${_src})
46endif()
47target_link_libraries( ${_target_name} ${${_target_name}_LIBS}
48                                       marblewidget )
49install( TARGETS ${_target_name} DESTINATION ${MARBLE_PLUGIN_INSTALL_PATH} )
50
51endmacro( marble_add_plugin _target_name )
52
53# these plugins are slightly different
54
55macro( marble_add_designer_plugin _target_name )
56set( _src ${ARGN} )
57
58qt_add_resources( _src ../../../apps/marble-ui/marble.qrc )
59
60add_library( ${_target_name} MODULE ${_src} )
61target_link_libraries( ${_target_name} ${${_target_name}_LIBS}
62                                       marblewidget )
63install( TARGETS ${_target_name} DESTINATION ${QT_PLUGINS_DIR}/designer )
64
65endmacro( marble_add_designer_plugin _target_name )
66
67if( WIN32 )
68    set( DATA_PATH ${CMAKE_INSTALL_PREFIX}/${MARBLE_DATA_PATH} )
69    set( PLUGIN_PATH ${CMAKE_INSTALL_PREFIX}/${MARBLE_PLUGIN_PATH} )
70else( WIN32 )
71    set( DATA_PATH ${MARBLE_DATA_PATH} )
72    set( PLUGIN_PATH ${MARBLE_PLUGIN_PATH} )
73endif( WIN32 )
74
75macro( marble_add_test TEST_NAME )
76    if( BUILD_MARBLE_TESTS )
77        set( ${TEST_NAME}_SRCS ${TEST_NAME}.cpp ${ARGN} )
78        qt_generate_moc( ${TEST_NAME}.cpp ${CMAKE_CURRENT_BINARY_DIR}/${TEST_NAME}.moc )
79        include_directories( ${CMAKE_CURRENT_BINARY_DIR} )
80        set( ${TEST_NAME}_SRCS ${CMAKE_CURRENT_BINARY_DIR}/${TEST_NAME}.moc ${${TEST_NAME}_SRCS} )
81
82        add_executable( ${TEST_NAME} ${${TEST_NAME}_SRCS} )
83        target_link_libraries(${TEST_NAME}
84            marblewidget
85            Qt5::Test
86        )
87
88        set_target_properties( ${TEST_NAME} PROPERTIES
89                               COMPILE_FLAGS "-DDATA_PATH=\"\\\"${DATA_PATH}\\\"\" -DPLUGIN_PATH=\"\\\"${PLUGIN_PATH}\\\"\"" )
90        add_test( ${TEST_NAME} ${TEST_NAME} )
91    endif( BUILD_MARBLE_TESTS )
92endmacro( marble_add_test TEST_NAME )
93
94macro( marble_add_project_resources resources )
95  add_custom_target( ${PROJECT_NAME}_Resources ALL SOURCES ${ARGN} )
96endmacro()
97
98# - MACRO_OPTIONAL_FIND_PACKAGE() combines FIND_PACKAGE() with an OPTION()
99# MACRO_OPTIONAL_FIND_PACKAGE( <name> [QUIT] )
100# This macro is a combination of OPTION() and FIND_PACKAGE(), it
101# works like FIND_PACKAGE(), but additionally it automatically creates
102# an option name WITH_<name>, which can be disabled via the cmake GUI.
103# or via -DWITH_<name>=OFF
104# The standard <name>_FOUND variables can be used in the same way
105# as when using the normal FIND_PACKAGE()
106
107# This is just a helper macro to set a bunch of variables empty.
108# We don't know whether the package uses UPPERCASENAME or CamelCaseName, so we try both:
109
110if(NOT COMMAND _MOFP_SET_EMPTY_IF_DEFINED)
111macro(_MOFP_SET_EMPTY_IF_DEFINED _name _var)
112   if(DEFINED ${_name}_${_var})
113      set(${_name}_${_var} "")
114   endif(DEFINED ${_name}_${_var})
115
116   string(TOUPPER ${_name} _nameUpper)
117   if(DEFINED ${_nameUpper}_${_var})
118      set(${_nameUpper}_${_var}  "")
119   endif(DEFINED ${_nameUpper}_${_var})
120endmacro(_MOFP_SET_EMPTY_IF_DEFINED _package _var)
121endif()
122
123if(NOT COMMAND MACRO_OPTIONAL_FIND_PACKAGE)
124macro (MACRO_OPTIONAL_FIND_PACKAGE _name )
125   option(WITH_${_name} "Search for ${_name} package" ON)
126   if (WITH_${_name})
127      find_package(${_name} ${ARGN})
128   else (WITH_${_name})
129      string(TOUPPER ${_name} _nameUpper)
130      set(${_name}_FOUND FALSE)
131      set(${_nameUpper}_FOUND FALSE)
132
133      _mofp_set_empty_if_defined(${_name} INCLUDE_DIRS)
134      _mofp_set_empty_if_defined(${_name} INCLUDE_DIR)
135      _mofp_set_empty_if_defined(${_name} INCLUDES)
136      _mofp_set_empty_if_defined(${_name} LIBRARY)
137      _mofp_set_empty_if_defined(${_name} LIBRARIES)
138      _mofp_set_empty_if_defined(${_name} LIBS)
139      _mofp_set_empty_if_defined(${_name} FLAGS)
140      _mofp_set_empty_if_defined(${_name} DEFINITIONS)
141   endif (WITH_${_name})
142endmacro (MACRO_OPTIONAL_FIND_PACKAGE)
143endif()
144
145# older cmake version don't have the add_feature_info macro.
146# It's just informative, so we add our own that does
147# nothing in that case
148if(NOT COMMAND ADD_FEATURE_INFO)
149macro(ADD_FEATURE_INFO)
150  # just ignore it
151endmacro()
152endif()
153
154
155# Find Qt translation tools
156find_package(Qt5LinguistTools CONFIG)
157
158if(NOT Qt5LinguistTools_FOUND)
159
160# dummy implementation
161function(marble_install_po_files_as_qm podir)
162    set(options)
163    set(oneValueArgs TARGET)
164    set(multiValueArgs)
165    cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
166
167    if(ARGS_TARGET)
168        if(NOT TARGET ${ARGS_TARGET})
169            add_custom_target(${ARGS_TARGET})
170        endif()
171    endif()
172    if (NOT IS_ABSOLUTE "${podir}")
173        set(podir "${CMAKE_CURRENT_SOURCE_DIR}/${podir}")
174    endif()
175    if (IS_DIRECTORY "${podir}")
176        message(STATUS "Will do nothing for po files in \"${podir}\", tools missing")
177    endif()
178endfunction()
179
180else()
181
182if(TARGET Qt5::lconvert)
183    set(lconvert_executable Qt5::lconvert)
184else()
185    # Qt < 5.3.1 does not define Qt5::lconvert
186    get_target_property(lrelease_location Qt5::lrelease LOCATION)
187    get_filename_component(lrelease_path ${lrelease_location} PATH)
188    find_program(lconvert_executable
189        NAMES lconvert-qt5 lconvert
190        PATHS ${lrelease_path}
191        NO_DEFAULT_PATH
192    )
193endif()
194
195function(marble_process_po_files_as_qm lang po_file)
196    set(options)
197    set(oneValueArgs TARGET)
198    set(multiValueArgs)
199    cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
200
201    # Create commands to turn po files into qm files
202    get_filename_component(po_file ${po_file} ABSOLUTE)
203    get_filename_component(filename_base ${po_file} NAME_WE)
204
205    # Include ${lang} in build dir because we might be called multiple times
206    # with the same ${filename_base}
207    set(build_dir ${CMAKE_CURRENT_BINARY_DIR}/locale/${lang})
208    set(ts_file ${build_dir}/${filename_base}.ts)
209    set(qm_file ${build_dir}/${filename_base}.qm)
210    if(ANDROID)
211        set(qm_install_dir "${locale_dir}/${lang}")
212    else()
213        set(qm_install_dir "${locale_dir}/${lang}/LC_MESSAGES")
214    endif()
215
216    file(MAKE_DIRECTORY ${build_dir})
217
218    # lconvert from .po to .ts, then lrelease from .ts to .qm.
219    add_custom_command(OUTPUT ${qm_file}
220        COMMAND ${lconvert_executable}
221            ARGS -i ${po_file} -o ${ts_file} -target-language ${lang}
222        COMMAND Qt5::lrelease
223            ARGS -removeidentical -nounfinished -silent ${ts_file} -qm ${qm_file}
224        DEPENDS ${po_file}
225    )
226    install(
227        FILES ${qm_file}
228        DESTINATION ${qm_install_dir}
229        OPTIONAL # if not build, ignore it
230    )
231
232    if(ARGS_TARGET)
233        set(target_name_prefix ${ARGS_TARGET})
234    else()
235        set(target_name_prefix translation)
236    endif()
237    string(REPLACE "@" "AT" _lang ${lang})
238    set(target_name ${target_name_prefix}_${_lang}_${filename_base})
239
240    if(ARGS_TARGET)
241        add_custom_target(${target_name} DEPENDS ${qm_file})
242        add_dependencies(${ARGS_TARGET} ${target_name})
243    else()
244        add_custom_target(${target_name} ALL DEPENDS ${qm_file})
245    endif()
246endfunction()
247
248
249function(marble_install_po_files_as_qm podir)
250    set(options)
251    set(oneValueArgs TARGET)
252    set(multiValueArgs)
253    cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
254
255    if(ARGS_TARGET)
256        if(NOT TARGET ${ARGS_TARGET})
257            add_custom_target(${ARGS_TARGET})
258        endif()
259
260        set(target_arg TARGET ${ARGS_TARGET})
261    else()
262        set(target_arg)
263    endif()
264
265    file(GLOB po_files "${podir}/*/*.po")
266    foreach(po_file ${po_files})
267        get_filename_component(po_dir ${po_file} DIRECTORY)
268        get_filename_component(lang ${po_dir} NAME)
269        marble_process_po_files_as_qm(${lang} ${po_file} ${target_arg})
270    endforeach()
271endfunction()
272
273endif()
274