Russian Qt Forum

Qt => Общие вопросы => Тема начата: asvil от Апрель 15, 2010, 14:16



Название: CMake 2.6-patch4
Отправлено: 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 проектах.


Название: Re: CMake 2.6-patch4
Отправлено: Ytz от Апрель 19, 2010, 21:30
О своем опыте использования Qt и CMake я написал статью в своем блоге http://www.devexp.ru/2010/01/cmake-i-qt/ (http://www.devexp.ru/2010/01/cmake-i-qt/). Кстати по CMake там же я написал еще несколько статей http://www.devexp.ru/tag/cmake/ (http://www.devexp.ru/tag/cmake/). Буду рад если информация окажется полезной.


Название: Re: CMake 2.6-patch4
Отправлено: ритт от Май 01, 2010, 19:35
ох, глупый smf не поддерживает тэги(( не закреплять же полезные посты
хочу раздел "полезности"


Название: Re: CMake 2.6-patch4
Отправлено: lit-uriy от Май 01, 2010, 19:44
>>ох, глупый smf не поддерживает тэги
может какой-нибудь плагин надо доставить?


Название: Re: CMake 2.6-patch4
Отправлено: asvil от Июль 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 (http://www.thelins.se/johan/2006/10/cmake-qt-421-and-application-icons.html)





Название: Re: CMake 2.6-patch4
Отправлено: asvil от Июль 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})


Название: Re: CMake 2.6-patch4
Отправлено: lit-uriy от Июль 23, 2010, 03:24
Филоненко Михаил, тыб привёл пример pro/pri-файлов, которые соответствуют этим CMake'овским


Название: Re: CMake 2.6-patch4
Отправлено: asvil от Июль 23, 2010, 09:23
Да. Пример *.pri файла, который имитировался:
Код:
INCLUDEPATH += $${PWD}
HEADERS += $${PWD}/someqobjectfile.h \
  $${PWD}/somenonqobjectfile.h

SOURCES += $${PWD}/someqobjectfile.cpp \
  $${PWD}/somefileincludingmoc.cpp


Название: Re: CMake 2.6-patch4
Отправлено: asvil от Август 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 файла во внешний проект и прекрасно к нему подключается.



Название: Re: CMake 2.6-patch4
Отправлено: asvil от Август 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 ............)


Название: Re: CMake 2.6-patch4
Отправлено: asvil от Август 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)


Название: Re: CMake 2.6-patch4
Отправлено: Авварон от Август 20, 2010, 08:30
блин, тема полезная, может ее прикрепить? на вашем месте я бы вообще встроил эти "вкусности" в сам симейк и отослал его разрабам:)


Название: Re: CMake 2.6-patch4
Отправлено: Авварон от Август 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)


Название: Re: CMake 2.6-patch4
Отправлено: asvil от Август 22, 2010, 10:55
Подхватываю.
Добавляем автоматическое прохождение тестов после сборки пакета приложения.
Код:
enable_testing()
add_test(NAME testqstring
             COMMAND QtTest)

P.S. Поторопился.


Название: Re: CMake 2.6-patch4
Отправлено: Авварон от Август 22, 2010, 11:28
да, до этого я добрался уже после написания поста и просмотра нного количества серий фильма:) Хотя это-то как раз есть в доках и проблем не возникло
только не
Код:
set(ENABLE_TESTING True)
а
Код:
enable_testing()
Ваш вариант что-то не срабатывает (цель test в мейкфайле не появляется)
у меня пока остался только 1 вопрос - как по умолчанию включить --verbose мод или --output-on-failure ?


Название: Re: CMake 2.6-patch4
Отправлено: asvil от Август 22, 2010, 13:34
Оказывается, что создание целей для тестов находится в стадии feature request. Но перед тем как рассказать workaround цитирую некоторые высказывания.
Цитировать
Try moving the ENABLE_TESTING() call to the top-level CMakeLists.txt,
before any calls to add_subdirectory().  Add_test() can stay where it
is.
Дословно:

enable_testing() неоходимо вызвать в самом верхнем/корневом CMakeLists.txt и перед всеми вызовами add_subdirectory()
А создания тестов (add_test) можно вызывать из любого CMakeLists.txt.

А вот и собственно workaround для создания make-цели для компиляции/выполнения теста:
Код:
# Добавляем тест
add_test(NAME testqstring COMMAND QtTest)
# Добавляем цель для вызова созданного теста с зависимостью от бинарного файла выполняющего тестирование
# Вместо QtTest может быть несколько целей для создания программ-тестов
add_custom_target(check DEPENDS QtTest)
# Задаем параметры для тестирования
# ctest --help
# -V verbose mode
# -VV extra-verbose
# --output-on-failure verbose on test fail
set(CTEST_ARGUMENTS --output-on-failure)
# Добавляем команду, которая будет выполнятся после создания make-цели тестирования
add_custom_command(TARGET check POST_BUILD COMMAND ${CMAKE_CTEST_COMMAND} ${CTEST_ARGUMENTS} QtTest)
Используем так:
Код:
make check


Название: Re: CMake 2.6-patch4
Отправлено: Авварон от Август 22, 2010, 22:18
в принципе, достаточно вот так:
Код:
set( CTEST_ARGUMENTS --output-on-failure )
add_custom_target( check )
add_custom_command( TARGET check POST_BUILD COMMAND ${CMAKE_CTEST_COMMAND} ${CTEST_ARGUMENTS} )
тогда он прогонит ВСЕ тесты (как make test). Хотелось бы еще заменить цель test своей


Название: Re: CMake 2.6-patch4
Отправлено: Obey-Kun от Апрель 27, 2011, 02:08
Продолжаем тему. С изобретением иконок в дизайне их начали засовывать в самые труднодоступные места. Засунем и мы иконку в исполняемый в win среде файл, чтобы любой "проводник" показывал нам не синюю рамку с тремя пуговицами.
В каталоге с исходным кодом проекта создаем ветку директорий share/images/application. В полученной ветке создаем будущую иконку (пример, logo.ico) и файл win-ресурсов (пример, logo.rc).
...

Простите, что поднимаю старую тему, но в cmake недавно стало можно подключать rc-файлы напрямую как в msvc, так и в mingw: http://public.kitware.com/Bug/view.php?id=4068

Делать просто:
ADD_EXECUTABLE(экзешник бла-бла-бла файл_с_указанием_на_икноку.rc)

Вот переписка в рассылке cmake до того, как оно заработало в mingw: http://www.cmake.org/pipermail/cmake/2009-March/028306.html


Название: Re: CMake 2.6-patch4
Отправлено: Пантер от Апрель 28, 2011, 07:39
Это хорошо, а то такую фигню воротить приходилось.


Название: Re: CMake 2.6-patch4
Отправлено: asvil от Апрель 28, 2011, 09:23
Спасибо, обновился.


Название: Re: CMake 2.6-patch4
Отправлено: asvil от Май 12, 2011, 12:01
Продолжаем всякие хитрости.

Как сделать так, чтобы debug версии билиотек и программ имели постфикс _debug?
Код:
# Для библиотек
set(CMAKE_DEBUG_POSTFIX _debug)
# Для программ
# add_executable(${PROJECT_NAME} WIN32
set_target_properties(${PROJECT_NAME} PROPERTIES DEBUG_POSTFIX "_debug")

Как найти qtplatformdefs.h?
Код:
find_package( Qt4 REQUIRED)
include_directories(${QT_MKSPECS_DIR}/default)


Название: Re: CMake 2.6-patch4
Отправлено: asvil от Июнь 27, 2011, 19:59
А вообще всем нравится такой понт, как номер ревизии системы версий исходников засунутый в версию проекта.

Итак берем наш CMakeLists.txt и делаем шаги:

  1. Ищем subversion
  2. Берем оттуда информацию в переменные типа {X_*} X задаете вы сами
  3. Берем номер ревизии из переменной ${X_WC_REVISION}

Код:
# Ищем пакет Subversion
find_package(Subversion)
if(Subversion_SVN_EXECUTABLE AND EXISTS "${CMAKE_SOURCE_DIR}/.svn")
        # Получаем информацию о проекте. Все переменные будут иметь префикс переданный вторым параметром
        Subversion_WC_INFO(${CMAKE_SOURCE_DIR} SciDB)
        message(STATUS "Reading revision from svn: ${SciDB_WC_REVISION}")
        set(SCIDB_VERSION "${SCIDB_VERSION}.${SciDB_WC_REVISION}")
        # Записываем данную ревизию в файл
        file(WRITE "${CMAKE_BINARY_DIR}/version.txt" ${SciDB_WC_REVISION})
else(Subversion_SVN_EXECUTABLE AND EXISTS "${CMAKE_SOURCE_DIR}/.svn")
# Если ниче не получилось, то читаем ревизию из файла version.txt
        file(READ "${CMAKE_SOURCE_DIR}/version.txt" SciDB_WC_REVISION)
        message(STATUS "Reading revision from file: ${SciDB_WC_REVISION}")
        set(SCIDB_VERSION "${SCIDB_VERSION}.${SciDB_WC_REVISION}")
endif(Subversion_SVN_EXECUTABLE AND EXISTS "${CMAKE_SOURCE_DIR}/.svn")

Как вы заметили я позаимствовал это из исходников SciDB.


Название: Re: CMake 2.6-patch4
Отправлено: Авварон от Июнь 27, 2011, 23:07
а для гита?


Название: Re: CMake 2.6-patch4
Отправлено: Пантер от Июнь 27, 2011, 23:09
А что у гита? md5? Не вариант.


Название: Re: CMake 2.6-patch4
Отправлено: Авварон от Июнь 28, 2011, 08:59
почему бы и нет?


Название: Re: CMake 2.6-patch4
Отправлено: Пантер от Июнь 28, 2011, 09:54
Потому, что номера ревизий в гите не последовательны.


Название: Re: CMake 2.6-patch4
Отправлено: Авварон от Июнь 28, 2011, 10:15
и че? при разработке в свне номера ревизий тоже мало что говорят, у тебя релизы идут к примеру 10я, 115я, 1020, 1022я ревизии. Это юзеру о чем-то говорит? пожалуй нет, как и чексумма


Название: Re: CMake 2.6-patch4
Отправлено: Пантер от Июнь 28, 2011, 10:17
Ревизии в свн по крайней мере последовательны. То есть сразу ясно, что версия 1.0.1_r1025 вышла раньше, чем  1.0.1_r1136. В гите этого не сделать.


Название: Re: CMake 2.6-patch4
Отправлено: Авварон от Июнь 28, 2011, 10:21
ну ты же не будешь версию программы _только_ ревизией гита обозначать? Как минимум старшая версия должна указывать на бинари компатибилити библиотек программы. То есть "Мегапрога 2.1 (r1234)" смысл имеет, а "Мегапрога r100" нет


Название: Re: CMake 2.6-patch4
Отправлено: Пантер от Июнь 28, 2011, 10:23
Охтыжблин. У одной версии может быть множество билдов и их очередность нужно как-то разделять.


Название: Re: CMake 2.6-patch4
Отправлено: asvil от Июнь 28, 2011, 11:21
Посмотрев интернеты пришел к выводу о том, что git проекта версию не так то просто сформировать. Некоторые делают версию "Имя последенго тега"."Кол-во коммитов от него".

Пока вопрос остается открытым.

Однако есть еще один не менее интересный понт использовать в качестве версии Год.Месяц.День, однако кроссплатформенно получить timestamp не просто, надо писать способ под каждую платформу.

Вообще пользователю не интересна версия как таковая, версия по большей части используется для обратной связи с тестировщиками. И здесь, чем быстрее по версии можно включить коммит тем удобнее.


Название: Re: CMake 2.6-patch4
Отправлено: Авварон от Октябрь 11, 2011, 20:10
Так как получить хэш гита?


Название: Re: CMake 2.6-patch4
Отправлено: Авварон от Октябрь 11, 2011, 21:41
Сам с собой веду беседу
Код:
macro( get_git_revision VAR)
exec_program(
    "git"
    ${PROJECT_SOURCE_DIR}
    ARGS "rev-parse -q HEAD"
    OUTPUT_VARIABLE ${VAR} )
endmacro( get_git_revision )

get_git_revision(GIT_REVISION)


Название: Re: CMake 2.6-patch4
Отправлено: asvil от Ноябрь 02, 2011, 16:31
Как получить текущую дату?

Взято отсюда
http://projects.blender.org/scm/viewvc.php/*checkout*/trunk/blender/build_files/cmake/buildinfo.cmake?root=bf-blender (http://projects.blender.org/scm/viewvc.php/*checkout*/trunk/blender/build_files/cmake/buildinfo.cmake?root=bf-blender)

Код:
# Кроссплатформенно получаем дату и время и сохраняем их в переменных BUILD_DATE, BUILD_TIME соответственно
if(UNIX)
execute_process(COMMAND date "+%Y-%m-%d" OUTPUT_VARIABLE BUILD_DATE OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND date "+%H:%M:%S" OUTPUT_VARIABLE BUILD_TIME OUTPUT_STRIP_TRAILING_WHITESPACE)
endif()
if(WIN32)
execute_process(COMMAND cmd /c date /t OUTPUT_VARIABLE BUILD_DATE OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND cmd /c time /t OUTPUT_VARIABLE BUILD_TIME OUTPUT_STRIP_TRAILING_WHITESPACE)
endif()

# Записывает полученные данный в заголовочный файл
file(WRITE buildinfo.h.txt
"#define BUILD_DATE \"${BUILD_DATE}\"\n"
"#define BUILD_TIME \"${BUILD_TIME}\"\n"
)