UPD 2024-04-15 vcpkg поборол, причём статику сгенерил как при помощи системного MinGW из Manjaro, так и с тулчёном из MXE. Подробности чуть позже. Conan в пролёте. UPD 2024-04-23 а вот и подробности: Conan vs vcpkg, действие второе
дискас.
А вообще, мне нужно было кросс-компильнуть максимально статический бинарник из-под Linux в Windows. Оба не справились, но vcpkg продвинулся дальше.
Не без мук, но дальше. Настолько дальше, что бинарь он отстроил… но в конце он зачем-то пытается сделать:
/bin/sh: строка 1: powershell.exe: команда не найдена
ninja: build stopped: subcommand failed.
o_O
А быстрее всего и с минимальными телодвижениями справился MXE, но он чисто под MinGW кросс-компиляцию и создаёт свой sysroot. Понятно, что как универсально средство - не очень подходит.
MXE можно использовать и только собрать тулчейн (make cc
), а остальное отдать на откуп пакетникам. vcpkg частично справляется (см выше). Conan на рецепте iconv свалился из-за косяка в рецепте (жёстко ищет RC компилятор с именем windres
, причём не понятно по каким путям), а что-то сходу как его заоверлеить я не нашёл (MXE и vcpkg позволяют это и достаточно лехко).
ЗЫ у меня в системном MinGW тулчейне сломали статическую сборку.
Для тех, кто ходит под кат. Но напомню - успех не достигнут.
Текущий файл профиля для Conan (информации мало) - mingw64:
[settings]
os=Windows
arch=x86_64
build_type=Release
compiler=gcc
compiler.version=13.2
compiler.libcxx=libstdc++11
compiler.exception=seh
compiler.threads=posix
#compiler.cppstd=17
[options]
[buildenv]
# А вот как прочитать окружение пользователя? Или найти расположение относительно файла?
PATH=+(path)/mnt/zyncdev/user/repos/MXE/mxe/usr/bin
# WA (это проба пера - обмануть libiconv, не прокатило)
PROCESSOR_ARCHITECTURE=i386
CHOST=x86_64-w64-mingw32.static
AR=x86_64-w64-mingw32.static-ar
AS=x86_64-w64-mingw32.static-as
RANLIB=x86_64-w64-mingw32.static-ranlib
CC=x86_64-w64-mingw32.static-gcc
CXX=x86_64-w64-mingw32.static-g++
STRIP=x86_64-w64-mingw32.static-strip
RC=x86_64-w64-mingw32.static-windres
WINDRES=x86_64-w64-mingw32.static-windres
[runenv]
#PATH=+(path)/mnt/zyncdev/user/repos/MXE/mxe/usr/bin
[conf]
tools.build:jobs=8
tools.build:compiler_executables={'c': 'x86_64-w64-mingw32.static-gcc', 'cpp': 'x86_64-w64-mingw32.static-g++', 'rc': 'x86_64-w64-mingw32.static-windres'}
# tools.build:compiler_executables={'c': '/usr/bin/clang', 'cpp': '/usr/bin/clang++'}
# tools.cmake.cmaketoolchain:toolchain_file
# Appending values into the existing list
#user.myconf.build:ldflags+=["--flag2 value2"]
# Unsetting the existing value (it'd be like we define it as an empty value)
#user.myconf.build:cflags=!
# Prepending values into the existing list
#user.myconf.build:ldflags=+["--prefix prefix-value"]
И текущий тулчейн-файл для CMake, который передаю VCPKG как -DVCPKG_CHAINLOAD_TOOLCHAIN_FILE=$(pwd)/toolchain-cross-mingw32-linux-w64-mxe.cmake
:
# the name of the target operating system
set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_CROSSCOMPILING TRUE)
set(MXE_PREFIX ${CMAKE_CURRENT_LIST_DIR}/mxe/usr)
set(COMPILER_PREFIX "x86_64-w64-mingw32.static")
# for find_library()
set(CMAKE_LIBRARY_ARCHITECTURE ${COMPILER_PREFIX})
# WA for vcpkg, первый... но не последний
if (VCPKG_INSTALLED_DIR OR VCPKG_CHAINLOAD_TOOLCHAIN_FILE OR VCPKG_MANIFEST_DIR)
set(IS_VCPKG True)
endif()
# which compilers to use for C and C++
find_program(CMAKE_RC_COMPILER NAMES ${MXE_PREFIX}/bin/${COMPILER_PREFIX}-windres)
find_program(CMAKE_C_COMPILER NAMES ${MXE_PREFIX}/bin/${COMPILER_PREFIX}-gcc)
find_program(CMAKE_CXX_COMPILER NAMES ${MXE_PREFIX}/bin/${COMPILER_PREFIX}-g++)
if (NOT IS_VCPKG)
find_program(PKG_CONFIG_EXECUTABLE NAMES ${MXE_PREFIX}/bin/${COMPILER_PREFIX}-pkg-config)
endif()
set(CMAKE_C_COMPILER_WORKS On)
set(CMAKE_CXX_COMPILER_WORKS On)
# here is the target environment located
set(USER_ROOT_PATH $ENV{HOME})
#set(CMAKE_FIND_ROOT_PATH ${MXE_PREFIX}/${COMPILER_PREFIX} ${USER_ROOT_PATH})
list(APPEND CMAKE_FIND_ROOT_PATH ${MXE_PREFIX}/${COMPILER_PREFIX} ${USER_ROOT_PATH})
SET(CMAKE_SYSROOT ${MXE_PREFIX})
# 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)
# We want to install alongside the compiler by default
set(CMAKE_INSTALL_PREFIX ${MXE_PREFIX})
# WA for vcpkg, да ещё один
if (VCPKG_INSTALLED_DIR)
# TBD: make more clean
set(CMAKE_EXE_LINKER_FLAGS "-L${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib")
endif()
# DEBUG
#get_cmake_property(_variableNames VARIABLES)
#list (SORT _variableNames)
#foreach (_variableName ${_variableNames})
# message(STATUS "${_variableName}=${${_variableName}}")
#endforeach()
Этот же тулчейн при работе с MXE (если строить зависимости его силами) отрабатывает на УРА.
Манифест (conanfile.txt) Conan:
[requires]
zlib/1.3.1
libusb/1.0.26
ffmpeg/6.1
[generators]
CMakeDeps
CMakeToolchain
Манифест (vcpkg.json) vcpkg:
{
"$schema": "https://raw.githubusercontent.com/microsoft/vcpkg-tool/main/docs/vcpkg.schema.json",
"dependencies": [
"ffmpeg",
"libusb",
"avcpp",
"zlib"
],
"name": "usbctl",
"version-string": "1.11"
}