Есть у меня проектик, он как тестовый полигон, хоть код и достаточно в большом количестве поддается только одной характеристике: исторически сложилось. Но на нем первом я опробовал кросс-компиляцию для Windows из Linux. Теперь его же перевел в обучающих целях на Cmake. Однако, все новое не должно отменять старых достижений, как следствие встал вопрос - а как теперь делать сборку для Windows?
С учетом того, что система сама по себе пока малознакома, решил понапрягать гугл (точнее: http://google.com/linux)
Почти сразу нашел две статьи мини-цикла:
- Mingw + OpenSSL + Qt4 for Windows on Linux - как бы вводная статья
- Using CMake + Mingw to Cross-Compile Windows Apps - продолжение
Сделав по этому методу, немного помучавшись, получил все-таки рабочее окружение для отстройки и собрал в проект. Но не давало покоя много ручной суетливой работы, и, практически, полный отказ от уже реализованных методов поиска Qt библиотек в Cmake.
Именно по вышеуказанной причине я решил продолжить изыскания. Поиском по готовым модулям Cmake нашел упоминание некой директивы CMAKE_TOOLCHAIN_FILE
, которая, по внутреннему ощущению, должна была мне помочь.
Дальнейший поиск привел меня на вики самого Cmake: How to use MinGW to cross compile software for Windows, где было сказано про тот самый toolchain file. С минимальными изменениями поместил его в каталог cmake в корне дерева проекта.
Ниже приведу листинг этого файла, назвал его win32-x-mingw32.cmake, в адоптации для ArchLinux:
# the name of the target operating system
SET(CMAKE_SYSTEM_NAME Windows)
# which compilers to use for C and C++
SET(CMAKE_C_COMPILER i486-mingw32-gcc)
SET(CMAKE_CXX_COMPILER i486-mingw32-g++)
SET(CMAKE_RC_COMPILER i486-mingw32-windres)
# here is the target environment located
SET(CMAKE_FIND_ROOT_PATH /usr/i486-mingw32)
# adjust the default behaviour of the FIND_XXX() commands:
# search headers and libraries in the target environment, search
# programs in the host environment
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
# next options is needed by some cases
#set(CMAKE_EXE_LINKER_FLAGS
# ${CMAKE_EXE_LINKER_FLAGS}
# -Wl,-subsystem,windows
# -Wl,-enable-auto-import
# -Wl,-enable-runtime-pseudo-reloc)
# Uncomment this if you have problem: unrecognized option '-rdynamic'
#set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS)
set(MINGW32 1)
Это, конечно, не все, остались последние штрихи.
Использование данного тулчайна приведет к установке переменной CMAKE_CROSSCOMPILING
, на основании этого, перед вызовом
find_package(Qt4 REQUIRED)
или аналогичного, достаточно вставить (в случае ArchLinux и пакета mingw32-qt из AUR или моей репы mingw32) следующий код:
if(CMAKE_CROSSCOMPILING)
set(QT_HEADERS_DIR "/usr/i486-mingw32/include")
set(QT_LIBRARY_DIR "/usr/i486-mingw32/lib")
endif()
После этого сборка осуществляется примерно так:
mkdir win32-build
cd win32-build
cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/win32-x-mingw32.cmake ..
make
Все! :)
PS проверено на Cmake 2.8.1 и Qt 4.6.2
Updated: обновлён файл тулчейна