From 538f512e99e39ae72616b1af3f2bf79c19b26a3c Mon Sep 17 00:00:00 2001 From: Sean Donnelly <23455376+seando-adsk@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:19:53 -0400 Subject: [PATCH] MAYA-124107 - MayaUSD: build as Universal Binary 2 (x86_64 + arm64) * Added support for Microsoft Visual Studio 2019/2022. * Created helper for general external project settings. Includes OSX UB2 and Linux CXX11_ABI. --- CMakeLists.txt | 1 + build.py | 29 +++++++++++++++--- cmake/googletest.cmake | 6 ---- cmake/googletest_download.txt.in | 5 ++- cmake/googletest_src.txt.in | 5 ++- cmake/utils.cmake | 52 ++++++++++++++++++++++++++++++++ 6 files changed, 82 insertions(+), 16 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2dbff893ad..7a4cd5df6e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,6 +58,7 @@ set(CMAKE_INSTALL_MESSAGE "NEVER") if(APPLE) if(BUILD_UB2) + message(STATUS "Building with Universal Binary 2") set(CMAKE_OSX_ARCHITECTURES "x86_64;arm64") set(CMAKE_OSX_DEPLOYMENT_TARGET 11.0) else() diff --git a/build.py b/build.py index 457ae44b55..3cc0ccc59a 100755 --- a/build.py +++ b/build.py @@ -107,14 +107,28 @@ def GetVisualStudioCompilerAndVersion(): return (msvcCompiler, tuple(int(v) for v in match.groups())) return None -def IsVisualStudio2017OrGreater(): - VISUAL_STUDIO_2017_VERSION = (15, 0) +def IsVisualStudioVersionOrGreater(desiredVersion): + if not Windows(): + return False + msvcCompilerAndVersion = GetVisualStudioCompilerAndVersion() if msvcCompilerAndVersion: _, version = msvcCompilerAndVersion - return version >= VISUAL_STUDIO_2017_VERSION + return version >= desiredVersion return False +def IsVisualStudio2022OrGreater(): + VISUAL_STUDIO_2022_VERSION = (17, 0) + return IsVisualStudioVersionOrGreater(VISUAL_STUDIO_2022_VERSION) + +def IsVisualStudio2019OrGreater(): + VISUAL_STUDIO_2019_VERSION = (16, 0) + return IsVisualStudioVersionOrGreater(VISUAL_STUDIO_2019_VERSION) + +def IsVisualStudio2017OrGreater(): + VISUAL_STUDIO_2017_VERSION = (15, 0) + return IsVisualStudioVersionOrGreater(VISUAL_STUDIO_2017_VERSION) + def GetCPUCount(): try: return multiprocessing.cpu_count() @@ -245,7 +259,11 @@ def RunCMake(context, extraArgs=None, stages=None): # building a 64-bit project. (Surely there is a better way to do this?) # TODO: figure out exactly what "vcvarsall.bat x64" sets to force x64 if generator is None and Windows(): - if IsVisualStudio2017OrGreater(): + if IsVisualStudio2022OrGreater(): + generator = "Visual Studio 17 2022" + elif IsVisualStudio2019OrGreater(): + generator = "Visual Studio 16 2019" + elif IsVisualStudio2017OrGreater(): generator = "Visual Studio 15 2017 Win64" else: generator = "Visual Studio 14 2015 Win64" @@ -253,6 +271,9 @@ def RunCMake(context, extraArgs=None, stages=None): if generator is not None: generator = '-G "{gen}"'.format(gen=generator) + if generator and 'Visual Studio' in generator and IsVisualStudio2019OrGreater(): + generator = generator + " -A x64" + # get build variant variant= BuildVariant(context) diff --git a/cmake/googletest.cmake b/cmake/googletest.cmake index 3539ad7d76..b659331264 100644 --- a/cmake/googletest.cmake +++ b/cmake/googletest.cmake @@ -25,12 +25,6 @@ macro(fetch_googletest) # sequence parsing errors. PPT, 22-Nov-2018. file(TO_CMAKE_PATH ${CMAKE_MAKE_PROGRAM} CMAKE_MAKE_PROGRAM) - # Force the use of ABI version 0 on Linux. - # This is what Maya has been using for 2019...2023 - if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") - set(FORCE_OLD_ABI "-D_GLIBCXX_USE_CXX11_ABI=0") - endif() - if (GOOGLETEST_SRC_DIR) configure_file(cmake/googletest_src.txt.in ${GOOGLETEST_BUILD_ROOT}/googletest-config/CMakeLists.txt) else() diff --git a/cmake/googletest_download.txt.in b/cmake/googletest_download.txt.in index 6249969d42..f06db6303a 100644 --- a/cmake/googletest_download.txt.in +++ b/cmake/googletest_download.txt.in @@ -21,9 +21,8 @@ ExternalProject_Add(googletest SOURCE_DIR "${GOOGLETEST_BUILD_ROOT}/googletest-src" BINARY_DIR "${GOOGLETEST_BUILD_ROOT}/googletest-build" CMAKE_ARGS - "-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}" + "${MAYAUSD_EXTERNAL_PROJECT_GENERAL_SETTINGS}" "-DCMAKE_INSTALL_PREFIX=${GOOGLETEST_BUILD_ROOT}/googletest-install" - "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" "-Dgtest_force_shared_crt=ON" "-DBUILD_GMOCK=OFF" "-DBUILD_SHARED_LIBS=ON" @@ -32,5 +31,5 @@ ExternalProject_Add(googletest "-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}" "-DCMAKE_CXX_EXTENSIONS=${CMAKE_CXX_EXTENSIONS}" "-DCMAKE_CXX_STANDARD_REQUIRED=${CMAKE_CXX_STANDARD_REQUIRED}" - "-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} ${FORCE_OLD_ABI}" + "-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}" ) diff --git a/cmake/googletest_src.txt.in b/cmake/googletest_src.txt.in index 6191d17b7a..8a8225db1c 100644 --- a/cmake/googletest_src.txt.in +++ b/cmake/googletest_src.txt.in @@ -18,9 +18,8 @@ ExternalProject_Add(googletest SOURCE_DIR "${GOOGLETEST_SRC_DIR}" BINARY_DIR "${GOOGLETEST_BUILD_ROOT}/googletest-build" CMAKE_ARGS - "-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}" + "${MAYAUSD_EXTERNAL_PROJECT_GENERAL_SETTINGS}" "-DCMAKE_INSTALL_PREFIX=${GOOGLETEST_BUILD_ROOT}/googletest-install" - "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" "-Dgtest_force_shared_crt=ON" "-DBUILD_GMOCK=OFF" "-DBUILD_SHARED_LIBS=ON" @@ -29,5 +28,5 @@ ExternalProject_Add(googletest "-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}" "-DCMAKE_CXX_EXTENSIONS=${CMAKE_CXX_EXTENSIONS}" "-DCMAKE_CXX_STANDARD_REQUIRED=${CMAKE_CXX_STANDARD_REQUIRED}" - "-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} ${FORCE_OLD_ABI}" + "-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}" ) diff --git a/cmake/utils.cmake b/cmake/utils.cmake index 11c80d3e19..46089860af 100644 --- a/cmake/utils.cmake +++ b/cmake/utils.cmake @@ -263,3 +263,55 @@ function(set_python_module_property target) ) endif() endfunction() + +# This fuction will populate "out_var" with the default values external +# projects are expected to need. +# It can take an optional argument that will replace the list separator +# in CMake values. For instance, if an external project uses a different +# list separator, the values in here must be changed to reflect this. +function(get_external_project_default_values out_var) + # Some of these variables might end up not being used by some projects + # Therefore avoid useless warnings in the log. + list(APPEND setting_list --no-warn-unused-cli) + + # Force the use of ABI version 0 on Linux. + # This is what Maya has been using for 2019...2023 + if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") + list(APPEND setting_list -D_GLIBCXX_USE_CXX11_ABI=0) + endif() + + if(ARGN) + list(GET ARGN 0 custom_sep) + endif() + + # Macro to add the value only if it's present. + macro(external_project_conditional_define option) + if (${option}) + if(custom_sep) + # This will change the list separator to the desired one. + # i.e. -DCMAKE_OSX_ARCHITECTURES=x86_64;arm64 -> -DCMAKE_OSX_ARCHITECTURES=x86_64|arm64 + string(REPLACE ";" ${custom_sep} ${option} "${${option}}") + endif() + list(APPEND setting_list -D${option}=${${option}}) + endif() + endmacro(external_project_conditional_define) + + external_project_conditional_define(CMAKE_INSTALL_MESSAGE) + external_project_conditional_define(CMAKE_BUILD_TYPE) + external_project_conditional_define(CMAKE_MAKE_PROGRAM) + + if(BUILD_UB2) + # UB2 builds require this flag + external_project_conditional_define(CMAKE_OSX_ARCHITECTURES) + external_project_conditional_define(CMAKE_OSX_DEPLOYMENT_TARGET) + endif() + + # Debugging informations for external projects + external_project_conditional_define(CMAKE_VERBOSE_MAKEFILE) + external_project_conditional_define(CMAKE_FIND_DEBUG_MODE) + + set(${out_var} ${setting_list} PARENT_SCOPE) +endfunction(get_external_project_default_values) + +# Create one for all the project using the default list separator +get_external_project_default_values(MAYAUSD_EXTERNAL_PROJECT_GENERAL_SETTINGS "$")