0

I would like to select triplet for vcpgk from cmake scripts. However, I've faced with two problems.

  1. If I set VCPKG_TARGET_TRIPLET after project()
cmake_minimum_required(VERSION 3.5)

project(xxx CXX)

if(CMAKE_SIZEOF_VOID_P EQUAL 8)
    message(STATUS "----------------- x64")
    set(__ARCH "x64")
elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
    message(STATUS "----------------- x86")
    set(__ARCH "x86")
else()
    set(__ARCH "xUNKNOWN")
    message(STATUS "----------------- xUNKNOWN")
endif()

if(CMAKE_BUILD_TYPE MATCHES Debug)
    set(VCPKG_TARGET_TRIPLET "${__ARCH}-windows-static-md" CACHE STRING "target triplet" FORCE)
    message(STATUS "Target triplet for debug is " ${VCPKG_TARGET_TRIPLET})
else()
    set(VCPKG_TARGET_TRIPLET "${__ARCH}-windows-static" CACHE STRING "target triplet" FORCE)
    message(STATUS "Target triplet for release is " ${VCPKG_TARGET_TRIPLET})
endif(CMAKE_BUILD_TYPE MATCHES Debug)

if(DEFINED ENV{VCPKG_ROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)
    set(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" CACHE STRING "")
endif()

find_package(Protobuf REQUIRED)

I get errors

CMake Error at C:/Program Files/CMake/share/cmake-3.12/Modules/FindPackageHandleStandardArgs.cmake:137 (message):
  Could NOT find Protobuf (missing: Protobuf_LIBRARIES Protobuf_INCLUDE_DIR)
  1. If I set VCPKG_TARGET_TRIPLET before project(), it works as expected, but then I can't determine if it's x64 or x86
cmake_minimum_required(VERSION 3.5)

if(CMAKE_SIZEOF_VOID_P EQUAL 8)
    message(STATUS "----------------- x64")
    set(__ARCH "x64")
elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
    message(STATUS "----------------- x86")
    set(__ARCH "x86")
else()
    set(__ARCH "xUNKNOWN")
    message(STATUS "----------------- xUNKNOWN")
endif()

if(CMAKE_BUILD_TYPE MATCHES Debug)
    set(VCPKG_TARGET_TRIPLET "${__ARCH}-windows-static-md" CACHE STRING "target triplet" FORCE)
    message(STATUS "Target triplet for debug is " ${VCPKG_TARGET_TRIPLET})
else()
    set(VCPKG_TARGET_TRIPLET "${__ARCH}-windows-static" CACHE STRING "target triplet" FORCE)
    message(STATUS "Target triplet for release is " ${VCPKG_TARGET_TRIPLET})
endif(CMAKE_BUILD_TYPE MATCHES Debug)

if(DEFINED ENV{VCPKG_ROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)
    set(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" CACHE STRING "")
endif()

project(xxx CXX)
find_package(Protobuf REQUIRED)

And get this print

----------------- xUNKNOWN

PS: I can't use -DVCPKG_TARGET_TRIPLET=<> due to env. limitations. This has to be detected during configuration

yudjin
  • 349
  • 5
  • 14
  • It doesn't seem like you've shown *all* of the relevant code. Where is the code for `Protobuf` and how is this called? How does the value of `VCPKG_TARGET_TRIPLET` affect it? From what you've shown, it's unclear... – Kevin Nov 29 '19 at 16:33
  • `VCPKG_TARGET_TRIPLET` is a part of `vcpkg`, which is integrated with cmake via toolchain file... I added `find_package(Protobuf REQUIRED)` – yudjin Nov 29 '19 at 19:54

1 Answers1

1

Maybe not the best solution, but finally I check arch by compiler

if(CMAKE_CXX_COMPILER MATCHES "x64/cl.exe")
    set(__ARCH "x64")
elseif(CMAKE_CXX_COMPILER MATCHES "x86/cl.exe")
    set(__ARCH "x86")
else()
    set(__ARCH "xUNKNOWN")
    message(ERRRO "Can't determine target architecture")
endif()

#now setting triplet
if(CMAKE_BUILD_TYPE MATCHES Debug)
    set(VCPKG_TARGET_TRIPLET "${__ARCH}-windows-static-md" CACHE STRING "target triplet" FORCE)
    message(STATUS "Target triplet for debug is " ${VCPKG_TARGET_TRIPLET})
else()
    set(VCPKG_TARGET_TRIPLET "${__ARCH}-windows-static" CACHE STRING "target triplet" FORCE)
    message(STATUS "Target triplet for release is " ${VCPKG_TARGET_TRIPLET})
endif(CMAKE_BUILD_TYPE MATCHES Debug)

if(DEFINED ENV{VCPKG_ROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)
    set(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" CACHE STRING "")
endif()

#and only now setup the project with configured triplet
project(xxx CXX)

This works fine for me for Windows MSVC.

yudjin
  • 349
  • 5
  • 14