# ConfigureMsvc3rdParty.cmake - Configure 3rd Party Library Paths on Windows # we want to handle various cases here: # fgmeta layout, where windows-3rd-party is a sibling of our flightgear source dir # - this should work with no manual options # explicitly specifying MSVC_3RDPARTY_ROOT: we'll select a subdir based on MSVC version # and architecture. We want to allow for people specify various paths here: # - path to windows-3rd-party # - path to an MSVC versioned subdir, eg -DMSVC_3RDPARTY_ROOT=C:\FGFS\windows-3rd-party\msvc140 # - path to an architecture specific subdir, eg -DMSVC_3RDPARTY_ROOT=C:\FGFS\windows-3rd-party\msvc140\3rdparty.x64 set(_FOUND_3RDPARTY_DIR "NOTFOUND") set(_FOUND_BOOST_INCLUDE_DIR "NOTFOUND") # try various suffixes of a base directory, and # set the variables above on success function(_check_candidate_msvc_path pathToCheck) unset (_freeTypeHeader CACHE ) unset (_zlibDll CACHE ) unset (_boostHeaders CACHE ) find_path(_freeTypeHeader include/ft2build.h PATHS ${pathToCheck} PATH_SUFFIXES ${ARCH_SUBDIR_NAME} ${MSVC_SUBDIR_NAME}/${ARCH_SUBDIR_NAME} ${COMPAT_SUBDIR_NAME}/${ARCH_SUBDIR_NAME} NO_DEFAULT_PATH ) find_path(_zlibDll bin/zlib.dll PATHS ${pathToCheck} PATH_SUFFIXES ${ARCH_SUBDIR_NAME} ${MSVC_SUBDIR_NAME}/${ARCH_SUBDIR_NAME} ${COMPAT_SUBDIR_NAME}/${ARCH_SUBDIR_NAME} NO_DEFAULT_PATH ) find_path(_boostHeaders boost/atomic.hpp PATHS ${pathToCheck} NO_DEFAULT_PATH ) if (_freeTypeHeader AND _zlibDll) set(_FOUND_3RDPARTY_DIR "${_freeTypeHeader}" PARENT_SCOPE) if (_boostHeaders) set(_FOUND_BOOST_INCLUDE_DIR "${_boostHeaders}" PARENT_SCOPE) endif() endif() endfunction() if (MSVC) # compute values for the compiler and arch subdirs string(SUBSTRING ${MSVC_VERSION} 0 2 MSVC_VERSION_MAJOR) string(SUBSTRING ${MSVC_VERSION} 2 2 MSVC_VERSION_MINOR) if (${MSVC_VERSION_MAJOR} EQUAL "19") if (${MSVC_VERSION_MINOR} EQUAL "00") set( MSVC_SUBDIR_NAME msvc140 ) else () set( MSVC_SUBDIR_NAME msvc141 ) set( COMPAT_SUBDIR_NAME msvc140 ) endif() else () message(FATAL_ERROR "Visual Studio 2017 is required") endif () if (CMAKE_CL_64) SET(ARCH_SUBDIR_NAME "3rdParty.x64") else (CMAKE_CL_64) SET(ARCH_SUBDIR_NAME "3rdParty") endif (CMAKE_CL_64) # try the explicitly specified value first if (EXISTS ${MSVC_3RDPARTY_ROOT}) _check_candidate_msvc_path("${MSVC_3RDPARTY_ROOT}") endif() # then try the fgmeta setup: look for a windows-3rdparty sibling of # our source dir get_filename_component(PARENT_SOURCE_DIR ${PROJECT_SOURCE_DIR} DIRECTORY) get_filename_component(PARENT_BINARY_DIR ${PROJECT_BINARY_DIR} DIRECTORY) if (NOT _FOUND_3RDPARTY_DIR AND EXISTS "${PARENT_SOURCE_DIR}/windows-3rd-party") message(STATUS "Trying src 3rdparty") _check_candidate_msvc_path("${PARENT_SOURCE_DIR}/windows-3rd-party") endif() if (NOT _FOUND_3RDPARTY_DIR AND EXISTS "${PARENT_BINARY_DIR}/windows-3rd-party") message(STATUS "Trying bin 3rdparty") _check_candidate_msvc_path("${PARENT_BINARY_DIR}/windows-3rd-party") endif() # try the Jenkins setup, whre the arch dir is copied into the WORKSPACE if (NOT _FOUND_3RDPARTY_DIR AND EXISTS "${PARENT_BINARY_DIR}/${ARCH_SUBDIR_NAME}") message(STATUS "Trying arch subdir ${PARENT_BINARY_DIR}/${ARCH_SUBDIR_NAME}") _check_candidate_msvc_path("${PARENT_BINARY_DIR}/${ARCH_SUBDIR_NAME}") endif() if (NOT _FOUND_3RDPARTY_DIR) message(WARNING "Failed to find the Windows 3rdparty files at all.") set(MSVC_3RDPARTY_ROOT NOT_FOUND CACHE PATH "Location where the third-party dependencies are extracted") endif() list(APPEND PLATFORM_LIBS "winmm.lib") else (MSVC) set(MSVC_3RDPARTY_ROOT NOT_FOUND CACHE PATH "Location where the third-party dependencies are extracted") endif (MSVC) if (MSVC AND _FOUND_3RDPARTY_DIR) message(STATUS "3rdparty files located in ${_FOUND_3RDPARTY_DIR}") list(APPEND CMAKE_PREFIX_PATH ${_FOUND_3RDPARTY_DIR}) set(FINAL_MSVC_3RDPARTY_DIR ${_FOUND_3RDPARTY_DIR}) if (CMAKE_CL_64) set( BOOST_LIB lib64 ) else (CMAKE_CL_64) set( BOOST_LIB lib ) endif (CMAKE_CL_64) if(NOT BOOST_INCLUDEDIR AND _FOUND_BOOST_INCLUDE_DIR) set(BOOST_INCLUDEDIR ${_FOUND_BOOST_INCLUDE_DIR}) message(STATUS "found Boost headers at ${_FOUND_BOOST_INCLUDE_DIR}") endif() endif ()