Russian Qt Forum
Ноябрь 24, 2024, 21:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: CMake 2.6-patch4  (Прочитано 18169 раз)
asvil
Гость
« : Апрель 15, 2010, 14:16 »

Заявленная переменная QT_TRANSLATIONS_DIR пуста после вызова find_package(Qt4 REQUIRED). Для исправления идем в исходники findQt4.cmake и копируем нахождение всяких директорий. Оно кстати делается с помощью вызова qmake -query.
Код:
# additional qt functions
# MINI HACK
# find qt translations directory
if (QT_LIBRARY_DIR AND NOT QT_TRANSLATIONS_DIR)
exec_program(${QT_QMAKE_EXECUTABLE} ARGS "-query QT_INSTALL_TRANSLATIONS"
OUTPUT_VARIABLE qt_translations_dir)
file(TO_CMAKE_PATH "${qt_translations_dir}" qt_translations_dir)
set(QT_TRANSLATIONS_DIR ${qt_translations_dir} CACHE PATH "The location of qt translations")
endif (QT_LIBRARY_DIR AND NOT QT_TRANSLATIONS_DIR)

А также cmake макрос для создания и компиляции файлов переводов (*.ts). Найден с помощью гугла в каком-то коммите. Немного мной доработан.
lupdate вызывается рекурсивно для директорий и поддиректорий
Код:
# MINI HACK
# create function to wrap qt *.ts files
# qt4_wrap_ts(outfiles infiles ...)
# outfiles receives .qm generated files from
# .ts files in arguments
# a target lupdate is created for you
# update/generate your translations files
# example: QT4_WRAP_TS(foo_QM ${foo_TS})
macro (QT4_WRAP_TS outfiles)
# a target to manually run lupdate
add_custom_target(lupdate
  COMMAND ${QT_LUPDATE_EXECUTABLE}
          ${CMAKE_CURRENT_SOURCE_DIR}
          -recursive
          -extensions ui,c,c++,cc,cpp,cxx,ch,h,h++,hh,hpp,hxx,js,qs
          -ts ${ARGN}
  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
  )

add_custom_command (OUTPUT ${ARGN}
  COMMAND ${QT_LUPDATE_EXECUTABLE}
          ${CMAKE_CURRENT_SOURCE_DIR}
          -recursive
          -extensions ui,c,c++,cc,cpp,cxx,ch,h,h++,hh,hpp,hxx,js,qs
          -ts ${ARGN}
  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
  )

foreach (it ${ARGN})
  get_filename_component(outfile ${it} NAME_WE)
get_filename_component(outpath ${it} PATH)

  set(outfile ${outpath}/${outfile}.qm)
  add_custom_command(OUTPUT ${outfile}
    COMMAND ${QT_LRELEASE_EXECUTABLE}
    ARGS ${it} -qm ${outfile}
    DEPENDS ${it}
    )
  set(${outfiles} ${${outfiles}} ${outfile})
endforeach (it)
endmacro (QT4_WRAP_TS)
Мною используется так:
Код:
 # just insert the languages you want to support in this list
  # add your language
  set(LANGUAGES ru be)

  set(TS_FILES)
  foreach(LANGUAGE ${LANGUAGES})
    set(TS_FILES ${TS_FILES} ${TRANSLATIONS_PATH}/${PROJECT}_${LANGUAGE}.ts)
  endforeach(LANGUAGE)

 # create|update language *.ts and create compiled language files *.qm
  qt4_wrap_ts(QM_FILES ${TS_FILES})

# COMPILATION
  add_library(${PROJECT} SHARED ${SOURCES} ${HEADERS} ${UI_HEADERS} ${MOC_SOURCES} ${QRC_SOURCES} ${QM_FILES})


Предлагаю в эту ветку рассказывать об использовании CMake в QT проектах.
Записан
Ytz
Гость
« Ответ #1 : Апрель 19, 2010, 21:30 »

О своем опыте использования Qt и CMake я написал статью в своем блоге http://www.devexp.ru/2010/01/cmake-i-qt/. Кстати по CMake там же я написал еще несколько статей http://www.devexp.ru/tag/cmake/. Буду рад если информация окажется полезной.
Записан
ритт
Гость
« Ответ #2 : Май 01, 2010, 19:35 »

ох, глупый smf не поддерживает тэги(( не закреплять же полезные посты
хочу раздел "полезности"
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Май 01, 2010, 19:44 »

>>ох, глупый smf не поддерживает тэги
может какой-нибудь плагин надо доставить?
Записан

Юра.
asvil
Гость
« Ответ #4 : Июль 01, 2010, 19:08 »

Продолжаем тему. С изобретением иконок в дизайне их начали засовывать в самые труднодоступные места. Засунем и мы иконку в исполняемый в win среде файл, чтобы любой "проводник" показывал нам не синюю рамку с тремя пуговицами.
В каталоге с исходным кодом проекта создаем ветку директорий share/images/application. В полученной ветке создаем будущую иконку (пример, logo.ico) и файл win-ресурсов (пример, logo.rc).
Файл win-ресурсов выглядит так:
Код:
IDI_ICON1 ICON DISCARDABLE "logo.ico"

Для cmake >= 2.8.4
Код:
if(MINGW AND WIN32)
# Путь к файлу win-ресурсов
  SET(WIN_RESOURCES "${CMAKE_SOURCE_DIR}/share/images/application/logo.rc")
endif(MINGW AND WIN32)
add_executable(${PROJECT_NAME} WIN32
  ${WIN_RESOURCES})

Для cmake < 2.8.4
В cmake проекте:
Код:
#create app icon
# Путь к объектному файлу иконки
set(WIN_RESOURCES)
# Если в win среде компилируем с помощью MINGW
if(MINGW AND WIN32)
# resource compilation for mingw
# Добавляем команду компиляции
  ADD_CUSTOM_COMMAND(OUTPUT
# Получаемый объектный файл win-ресурсов
${CMAKE_CURRENT_BINARY_DIR}/logo_rc.o
# Компилятор ресурсов
  COMMAND windres.exe
# Место, где лежит иконка
-I"${CMAKE_SOURCE_DIR}/share/images/application/"
# Файл win-ресурсов
    -i "${CMAKE_SOURCE_DIR}/share/images/application/logo.rc"
# Получаемый объектный файл win-ресурсов
    -o ${CMAKE_CURRENT_BINARY_DIR}/logo_rc.o)
# Путь к объектному файлу win-ресурсов
  SET(WIN_RESOURCES ${CMAKE_CURRENT_BINARY_DIR}/logo_rc.o)
# Если не используем MINGW
elseif((NOT MINGW) AND WIN32)
  SET(WIN_RESOURCES"${CMAKE_SOURCE_DIR}/share/images/application/logo.rc")
endif(MINGW AND WIN32)

#Компилируем вместе с иконкой
add_executable(${PROJECT_NAME} WIN32
  ${SOURCES}
  ${Q_SOURCES}
  ${MOC_SOURCES}
  ${QRC_SOURCES}
  ${HEADERS}
  ${Q_HEADERS}
  ${P_HEADERS}
  ${UI_HEADERS}
  ${QS_SOURCES}
  ${WIN_RESOURCES})

Исходная информация была взята здесь: http://www.thelins.se/johan/2006/10/cmake-qt-421-and-application-icons.html



« Последнее редактирование: Апрель 28, 2011, 09:25 от Филоненко Михаил » Записан
asvil
Гость
« Ответ #5 : Июль 23, 2010, 00:09 »

И вновь я здесь. Как сымитировать *.pri файлы используя cmake? На этом форуме я уже отвечал, что никак. Так вот я соврал. Копируем способ отсюда. Это 'subdir.cmake' файл который храниться в поддиректории, он добавляет в проект 4 файла:
Код:
get_filename_component(THIS_PATH ${CMAKE_CURRENT_LIST_FILE} PATH)
include_directories(${THIS_PATH})
# QObject-based
list(APPEND Q_HEADERS ${THIS_PATH}/someqobjectfile.h)
# QObject-based implementation and nonQObject-based implementation
list(APPEND SOURCES ${THIS_PATH}/someqobjectfile.cpp)
# NonQObject-based or moc included in implementation file
list(APPEND HEADERS ${THIS_PATH}/somenonqobjectfile.h)
# QObject-based with moc including
list(APPEND Q_SOURCES ${THIS_PATH}/somefileincludingmoc.cpp)
# Resources
list(APPEND Q_RESOURCES ${THIS_PATH}/someresources.qrc)
# Ui Forms
list(APPEND Q_FORMS ${THIS_PATH}/someform.ui)

А это общий CMakeLists.txt
Код:
include("subddir/subdir.cmake")

qt4_wrap_cpp(MOC_SOURCES ${Q_HEADERS})
qt4_automoc(${Q_SOURCES})
qt4_wrap_ui(UI_HEADERS ${Q_FORMS})
qt4_add_resources(QRC_SOURCES ${Q_RESOURCES})
« Последнее редактирование: Июль 23, 2010, 09:26 от Филоненко Михаил » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #6 : Июль 23, 2010, 03:24 »

Филоненко Михаил, тыб привёл пример pro/pri-файлов, которые соответствуют этим CMake'овским
Записан

Юра.
asvil
Гость
« Ответ #7 : Июль 23, 2010, 09:23 »

Да. Пример *.pri файла, который имитировался:
Код:
INCLUDEPATH += $${PWD}
HEADERS += $${PWD}/someqobjectfile.h \
  $${PWD}/somenonqobjectfile.h

SOURCES += $${PWD}/someqobjectfile.cpp \
  $${PWD}/somefileincludingmoc.cpp
Записан
asvil
Гость
« Ответ #8 : Август 18, 2010, 22:35 »

Да и вообще надо все 3rdparty sources помещать в отдельную папку и компилировать/подключать как статическую библиотеку. Например делаем такую иерархию директорий:
Код:
project/
  src/
    3rdparty/
      qttoolbardialog/
         CMakeLists.txt
    kernel/
    main/
    models/
    views/
  CMakeLists.txt
И теперь в корневом CMakeLists.txt делаем
Код:
add_subdirectory(src/3rdparty/qttoolbardialog)
include_directories(src/3rdparty/qttoolbardialog)
.....................
target_link_libraries(.....     qttoolbardialog)
А в файле src/3rdparty...CMakeLists.txt пишем:
Код:
project(qttoolbardialog)

set(SOURCES ....)
set(HEADERS .....)

add_library(${PROJECT_NAME} STATIC ${SOURCES} ${HEADERS})

Цель qttoolbardialog экспортируется из вложенного CMake файла во внешний проект и прекрасно к нему подключается.

« Последнее редактирование: Август 18, 2010, 23:42 от Филоненко Михаил » Записан
asvil
Гость
« Ответ #9 : Август 18, 2010, 23:42 »

Но и это еще не все.
Пресловутый qttoolbardialog, да и вообще некоторые проекты из Trolltech лаборатории грешат определениями Q_OBJECT классов в файлах реализаций (*.cpp). Так вот способ оборачивания таких Q_OBJECT:
*добавить к проекту описанному в предыдущем сообщении*
Код:
# генерируем moc
qt4_generate_moc(qttoolbardialog.cpp ${CMAKE_CURRENT_BINARY_DIR}/qttoolbardiralog.moc)
# исходный файл зависит от сгенерированного моком файла.
set_source_files_properties(qttoolbardialog.cpp OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/qttoolbardiralog.moc)
..................
# сгенерированный моком добавлять не нужно, так как он подключается через #include "qttoolbardialog.moc"
add_executable(${PROJECT_NAME} qttoolbardialog.cpp ............)
Записан
asvil
Гость
« Ответ #10 : Август 19, 2010, 23:34 »

Продолжаем начатую тему:
как сделать add_subdirectory для всех поддиректорий 3rdparty?
Код:
# all 3rd party subdirectories ---------------------------------------------------------
file(GLOB 3RDPARTY_DIRS "3rdparty/*")
foreach(3RDPARTY_DIR ${3RDPARTY_DIRS})
if (IS_DIRECTORY ${3RDPARTY_DIR})
message("${3RDPARTY_DIR}")
add_subdirectory(${3RDPARTY_DIR})
endif(IS_DIRECTORY ${3RDPARTY_DIR})
endforeach(3RDPARTY_DIR)
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #11 : Август 20, 2010, 08:30 »

блин, тема полезная, может ее прикрепить? на вашем месте я бы вообще встроил эти "вкусности" в сам симейк и отослал его разрабам:)
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #12 : Август 21, 2010, 18:25 »

а внесу-ка я свою лепту... Как создать тест, используя QtTest (на примере теста из доки - testqstring)
Код:
cmake_minimum_required( VERSION 2.6 )

find_package( Qt4 REQUIRED )

set (QT_USE_QTTEST TRUE)
include( ${QT_USE_FILE} )

qt4_generate_moc( testqstring.cpp  ${CMAKE_CURRENT_BINARY_DIR}/testqstring.moc )
set_source_files_properties( testqstring.cpp OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/testqstring.moc )

set(CMAKE_INCLUDE_CURRENT_DIR TRUE)

add_executable( QtTest testqstring.cpp )
target_link_libraries( QtTest ${QT_LIBRARIES} )
Без этой темы я бы не разобрался ни за что) Сложность в том, что в проекте лишь 1 файл - testqstring.cpp, а qt4_wrap_cpp генерирует неверный файл (moc_testqstring.cxx), а qt4_automoc требует наличия хедера (testqstring.h)
Записан
asvil
Гость
« Ответ #13 : Август 22, 2010, 10:55 »

Подхватываю.
Добавляем автоматическое прохождение тестов после сборки пакета приложения.
Код:
enable_testing()
add_test(NAME testqstring
             COMMAND QtTest)

P.S. Поторопился.
« Последнее редактирование: Август 22, 2010, 12:30 от Филоненко Михаил » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #14 : Август 22, 2010, 11:28 »

да, до этого я добрался уже после написания поста и просмотра нного количества серий фильма:) Хотя это-то как раз есть в доках и проблем не возникло
только не
Код:
set(ENABLE_TESTING True)
а
Код:
enable_testing()
Ваш вариант что-то не срабатывает (цель test в мейкфайле не появляется)
у меня пока остался только 1 вопрос - как по умолчанию включить --verbose мод или --output-on-failure ?
« Последнее редактирование: Август 22, 2010, 12:11 от Авварон » Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.117 секунд. Запросов: 23.