Hatred's Log Place

DON'T PANIC!

Apr 12, 2024 - 3 minute read - Programming C++

Conan vs vcpkg

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"  
}