Рисоваська под Mac (как собрать Qt-приложение под Mac OS X)

    Upd. Чтобы помочь в тестировании под разные дистрибутивы Linux — подключайтесь в группу «Друзья Рисоваськи»

    Еще в начале января я собрал первую работающую версию Рисоваськи под Mac и лишь два дня назад появилась версия, которую не стыдно показывать другим людям. Сначала расскажу почему же портирование на Mac заняло так много времени, а потом — как собрать проект на Qt под Mac OS X

    Почему так долго


    В команде не было Mac-эксперта

    Как-то так получилось, что вся команда Рисоваськи была мало знакома с Mac OS X — использовали Ubuntu и Windows. Мы купили пару Mac Book'ов в прошлом году, но пользовались ими лишь как дополнительными инструментами. И только когда наш давний друг и опытный маковод Валерий Хиора взялся нам помогать, дело сдвинулось с мертвой точки. Особенно неоценимой была его помощь при сборке Universal-версии — я раз пять пытался собрать её наскоком, без глубокого понимания внутренних механизмов, и у меня каждый раз чуть-чуть не получалось. Зато теперь я умею читать config.log :)

    Есть ошибки в работе Qt (4.5.0 и 4.5.1) под Mac OS X

    Подозреваю, что немногие пишут Mac-программы с использованием C++ и Qt. Видимо, в основном используют нативные инструменты — Objective-C, Cocoa. То тут, то там в Qt встречаются мелкие недоделки, разное поведение стилей и лэйаутов и прочие неприятности.

    XCode очень сильно отличается от Visual Studio

    Совершенно другие схемы интерфейса, совершенно другая (очень слабая) поддержка Qt. Пока не привыкнешь — уходит много времени на самые простые действия. Более того, поскольку это всё же Unix, поэтому многие вещи нужно выносить в командные файлы, а не совершать их каждый раз руками, что тоже отличает разработку в Mac OS X от разработки в Windows. Я лично очень полюбил консоль.

    Mac OS X — это совсем другой мир

    В остальном не хватало просто смелости решить для себя, что Mac OS X — это действительно другой мир, который нужно изучать, любить и с которым дружить.

    Краткое руководство под сборке Qt проекта на Mac OS X


    Если вы написали какое-то приложение под Windows с использованием Qt и хотите собрать его под Mac OS X, то вот вам краткая инструкция:

    1. Устанавливаем последнюю версию XCode, вместе с ней устанавливается компилятор gcc

    2. Качаем Qt — www.qtsoftware.com/downloads, мы качали Framework Only (122 Mb)

    3. Собираем Qt с учетом специфики проекта (мы собирали статическую версию):

    cd /tmp/qt-mac-opensource-desktop-4.5.1
    ./configure -prefix /Developer/Qt -qt-zlib -qt-libpng -qt-libjpeg -svg -qt-libtiff
    -qt-libmng -qt-gif -qt-sql-sqlite -openssl -universal -sdk /Developer/SDKs/MacOSX10.4u.sdk -static -release

    -prefix /Developer/Qt — куда устанавливать Qt
    -qt-zlib -qt-libpng -qt-libjpeg -svg -qt-libtiff -qt-libmng -qt-gif -qt-sql-sqlite — список подключаемых Qt-плагинов
    -openssl — собираем с поддержкой openssl (его нужно установить заранее)
    -universal — чтобы работало на процессорах Intel и PowerPC
    -sdk /Developer/SDKs/MacOSX10.4u.sdk — путь к SDK 10.4 universal
    -static — статическая версия
    -release — только релиз-версия, потому что основные баги Qt мы уже отладили

    make -j 4 sub-src
    sudo make install

    -j 4 — собирать в 4 потока, ускоряет сборку при наличии двухядерного процессора, правда и машину нагружает
    sub-src — собирать только «ядро» Qt, не собирать всякие примеры и дополнительные утилиты

    Добавляем в ~/.bash_profile:
    PATH="/Developer/Qt/bin:$PATH"
    export PATH
    export QTDIR=/Developer/Qt
    export QMAKESPEC=macx-g++

    Всё, Qt установлена.

    4. Сгенерировать файл проекта XCode

    Файлы проекта под Windows — обычно .sln и .vcproj. В них указано какие файлы относятся к проекту, какие дополнительные библиотеки подключать и т.п. Нам нужно создать такой же файл, но для XCode. Хорошая новость — собирать его вручную каждый раз при изменении проекта не придется, потому что этот процесс можно автоматизировать.

    Допустим что у нас проект состоит из двух папок — MoodBox (UI, сеть и всё остальное) и Velasquez (рисовальный движок). Под Windows у нас есть MoodBox.vcproj, который включает все необходимые файлы из папки Velasques

    4.1 Создаем в любимом редакторе файл с описанием проекта MacOS.pro

    # тут мы подключаем файлы с переводами
    TRANSLATIONS = moodbox_en.ts \
    moodbox_ru.ts

    # настройки Qt и плагинов
    QT += network xml svg
    QTPLUGIN += qjpeg qgif qmng qsvg qtiff

    # задаем иконку для проекта и имя приложения
    ICON = moodbox-dock.icns
    TARGET = MoodBox

    # добавляем пути include и библиотеки
    INCLUDEPATH += /sw/include/ImageMagick /sw/include/ImageMagick/Magick++
    LIBS += -lMagick++ -lMagickCore -lMagickWand
    LIBS += -L/sw/lib/

    # указываем DEBUG, чтобы легче отлаживаться
    DEFINES += DEBUG

    # добавляем необходимые данные в bundle
    data.path = Contents/Resources
    data.files = $$(PWD)/Avatars $$(PWD)/Clipart $$(PWD)/Sound $$(PWD)/catalogue.pal
    QMAKE_BUNDLE_DATA += data

    QMAKE_INFO_PLIST = MoodBox_Info.plist

    # убираем то ненужное, что лежит в папке MoodBox, но не нужно для сборки проекта
    HEADERS -= _PaletteConverter/stdafx.h \
    _PaletteConverter/targetver.h

    SOURCES -= _PaletteConverter/PaletteConverter.cpp \
    _PaletteConverter/stdafx.cpp \
    qtsingleapplication_win.cpp \
    qtsingleapplication_x11.cpp

    # добавляем нужные файлы из проекта Velasquez

    HEADERS += ../../Velasquez/Qt/backgroundelement.h \
    ../../Velasquez/Qt/backgroundtool.h \
    ../../Velasquez/Qt/undocommands.h \
    ../../Velasquez/Qt/varianthash.h \
    ../../Velasquez/Qt/vcommon.h

    SOURCES += ../../Velasquez/Qt/backgroundelement.cpp \
    ../../Velasquez/Qt/backgroundtool.cpp \
    ../../Velasquez/Qt/brushdrawingelement.cpp \
    ../../Velasquez/Qt/undocommands.cpp \
    ../../Velasquez/Qt/varianthash.cpp

    Этот файл нужно менять только при изменении настроек или при включении/исключении файлов из других папок. Новые файлы из папки MoodBox подключатся автоматически.

    4.2 А теперь создаем скрипт make-pro.sh, который как раз и будет генерировать проект XCode

    qmake -project -o MoodBox_Mac.pro
    cat MoodBox_Mac.pro MacOS.pro > tmp.pro
    mv tmp.pro MoodBox_Mac.pro
    qmake -spec macx-xcode MoodBox_Mac.pro

    4.3 Открываем полученный MoodBox_Mac.xcodeproj в XCode, соглашаемся с выбором папки проекта.

    4.4 Заходим в меню XCode: Project — Edit Active Target и устанавливайте следующие параметры:

    Architectures = Standard (32-bit Universal)
    Base SDK = Mac OS X 10.5
    Build active architectures only = disabled

    5. Жмём большую кнопку «Build and Go»

    Если проект не очень сложный, то программа скомпилируется, слинкуется и будет запущена. А если сложный (есть зависимости с другими библиотеками, есть windows-specific код, активно используются стили .qss), то придется еще поработать — выделять специфичный для платформ код в #ifdef, разделять файл стилей на общие стили и стили, специфичные для платформ, а потом клеить эти файлы при загрузке приложения, собирать сторонние библиотеки с поддержкой universal и многое-многое другое.

    А вот Mac-версия Рисоваськиstatic.risovaska.ru/Risovaska_Mac.zip
    Присылайте фидбек в комментарии к этому посту или в сообщество Друзья Рисоваськи"
    Поделиться публикацией
    Никаких подозрительных скриптов, только релевантные баннеры. Не релевантные? Пиши на: adv@tmtm.ru с темой «Полундра»

    Зачем оно вам?
    Реклама
    Комментарии 37
    • +3
      Ураааа! Наконец-то появилась рисоваська и для маков. Уже активно юзаю. Спасибо вам!
    • +1
      Странно, а почему Xcode, а не QtCreator? Насколько я понял, с ним работать с библиотекой много проще.
      • +2
        QtCreator — он версии 1.0, очень мало функций. Пробовали его и расстроились только. Лучше бы в Qt сделали QtDev плагин к Eclipse и поддерживали бы его по серьезному — тогда и бесплатно, и кроссплатформенно бы было.
        • 0
          Понятно.
          Да, плагин под Эклипс вроде есть — www.qtsoftware.com/developer/eclipse-integration
          Правда, когда я его пробовал, оный работал весьма нестабильно.
          • +1
            QtCreator уже давно версии 1.1. Плюс ко всему, куда уж больше его функционала? Мне вот только не хватает виртуальных папок для дерева файлов проекта, а так — более чем устраивает.
            • 0
              В QtCreator 1.1 есть функция «открыть файл с определением класса, содержащего в имени Foo»?
              • 0
                Ctrl+ЛКМ на имени класса.
                • 0
                  Нет, вы не поняли. Я, не имея ни одного открытого исходника, хочу перейти к определению класса MyTimer. Как мне это сделать?
                  • 0
                    Ctrl+Shift+T в CDT или Alt+Shift+S в Visual Assist, чтобы было понятнее, что я имею в виду.
                    • 0
                      Понятнее, к сожалению, не стало :) Я пытался пользоваться Eclipse, но как-то не пошло.
                      Судя по всему, там действительно такого функционала нет. Но, признаюсь, лично мне оно и не особо не нужно. :)
                      Там действительно многих вещей нет, как, например, дерева классов. Но я обычно сразу в диаграмму классов UML добавляю, когда появляется новый, так что с необходимостью тоже можно поспорить.
                      Что ж, видимо, вам QtCreator не подойдет, меня же он вполне устраивает.
        • 0
          Поздравляю!
          • 0
            ура :)
            • 0
              Это значит, что версия для Линукс уже не за горами?
            • +2
              А почему крестик который должен закрывать программу справа а не слева? и почему он сворачивает окно вместо того что бы закрыть его?
              • 0
                А где Linux? Этож куте
                • 0
                  Скорее всего скоро будет :) Уже думаем над этим :)
                  • 0
                    Жду с нетерпением. Потому как под wine рисоваська конечно же работает, но как-то местами.
                    • 0
                      Хорошие новости: Рисоваська уже компилируется под Ubuntu. Сначала были проблемы со шрифтами, сегодня уже разобрались, но осталось еще много визуальных проблем в клиенте и движок рисования еще сильно глючит.
                      Но в целом половину пути уже прошли :)
                      • 0
                        Отлично! Будем ждать результатов «борьбы»! :)
                        • 0
                          Ты, кстати, можешь подключаться — пиши в сообщество «Друзья Рисоваськи», у нас куча вопросов по разным дистрибутивам Линуксов и проч. Как минимум тестирование точно нужно будет. «Друзья Рисоваськи» — groups.google.com/group/risovaska2
                          • 0
                            Подключаюсь. У самого Ubuntu 9.04.
                  • 0
                    См. habrahabr.ru/blogs/apple/59057/#comment_1602997
                    Так точно быстрее соберем пакеты для самых популярных дистрибов
                  • 0
                    Вы под какой лицензией Qt используете — LGPL?
                    • 0
                      Win и Mac версии мы писали с использованием коммерческих лицензий, Linux-версию сейчас собираем под Qt LGPL — пока просто как альфа-версию, proof of concept. Хорошо бы всю разработку перевести на LGPL.
                      • 0
                        Я просто почему спросил — вы в примере используете opensource версию (значит лицензия либо GPL либо LGPL), но раз код рисоваськи закрыт — значит LGPL. Но вот LGPL и статическая линковка у меня никак не связывались :) Теперь всё понятно, спасибо :)
                    • 0
                      Открытие кода будет? Иначе не нужно, у меня гента.
                      • 0
                        В ближайшие месяц-два код открывать не будем
                      • 0
                        отлично! теперь Macintosh пополнился и множеством QT-приложений!
                        • 0
                          извените за оффтопик, но меня мучает вопрос, можно ли кутишный проект написаный под линукс и венду запустить как-то на макоси без того чтоб его собирать в самой макоси? А то есть большой проект который использует офигенную кучу разных библиотек и собирать все это дело в макоси просто сил уже не хватит.
                          • 0
                            В общем случае — нельзя.
                            • 0
                              жалко, но спасибо за быстрый ответ. Значит буду собирать все библиотеки :)
                          • 0
                            Понимаю, прошел уже почти год, НО вопрос появился сейчас (после прочтения):
                            надо ли проделывать всю эту волокиту с установкой или можно скачать qt-creator и qt-library по отдельности и установить их из .DMG?
                            Просто я именно так и сделал — у меня редактор то не видит qmake, то половину библиотек (в итоге таблицы летают без окон по экрану).
                            Помогите.

                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.