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