# -----------------------------------------------------------------------------------------------------------
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
# CANN Open Software License Agreement Version 2.0 (the "License").
# Please refer to the License for details. You may not use this file except in compliance with the License.
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
# See LICENSE in the root of the software repository for the full text of the License.
# -----------------------------------------------------------------------------------------------------------
set(_TargetNameAlias "json")
set(_TargetVersion 3.11.3)
# 免重入
if (TARGET ${_TargetNameAlias})
return()
endif ()
# 异常拦截
if (NOT PYPTO_THIRD_PARTY_PATH)
# 不再从环境上查找, 因当前部分软件编译过程需要添加 -D_GLIBCXX_USE_CXX11_ABI=0, 可能与环境上已安装软件冲突.
set(_Msg
"Failed to get nlohmann_json source dir, "
"need to specify its path through the PYPTO_THIRD_PARTY_PATH (via env/CMake option)"
)
string(REPLACE ";" "" _Msg "${_Msg}")
message(FATAL_ERROR ${_Msg})
endif ()
# 直接查找制品, 若找到则直接退出
get_filename_component(_TargetTarGzFile "${PYPTO_THIRD_PARTY_PATH}/json-${_TargetVersion}.tar.gz" REALPATH)
get_filename_component(_TargetInstallPrefix "${PYPTO_THIRD_PARTY_PATH}/${CMAKE_BUILD_TYPE}" REALPATH)
find_package(nlohmann_json ${_TargetVersion} EXACT CONFIG PATHS ${_TargetInstallPrefix} NO_DEFAULT_PATH)
if (NOT nlohmann_json_FOUND)
# 兼容部分镜像直接存放 json 安装结果的情况
get_filename_component(_TargetSourceDir "${PYPTO_THIRD_PARTY_PATH}/json" REALPATH)
if (NOT EXISTS ${_TargetSourceDir})
get_filename_component(_TargetSourceDir "${PYPTO_THIRD_PARTY_PATH}/json-${_TargetVersion}" REALPATH)
endif ()
find_package(nlohmann_json ${_TargetVersion} EXACT CONFIG PATHS ${_TargetSourceDir} NO_DEFAULT_PATH)
endif ()
if (nlohmann_json_FOUND)
message(STATUS "Use nlohmann_json from binary, nlohmann_json_DIR=${nlohmann_json_DIR}")
# 重命名目标
if (NOT TARGET json)
get_target_property(_JsonInc nlohmann_json::nlohmann_json INTERFACE_INCLUDE_DIRECTORIES)
add_library(json INTERFACE)
set_target_properties(json PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${_JsonInc}")
endif ()
return()
endif ()
# 触发编译
get_filename_component(_TargetSourceDir "${PYPTO_THIRD_PARTY_PATH}/json" REALPATH)
if (NOT EXISTS ${_TargetSourceDir})
get_filename_component(_TargetSourceDir "${PYPTO_THIRD_PARTY_PATH}/json-${_TargetVersion}" REALPATH)
endif ()
get_filename_component(_TargetBinaryDir "${PYPTO_THIRD_PARTY_PATH}/${CMAKE_BUILD_TYPE}/build/json-${_TargetVersion}" REALPATH)
PTO_Fwk_CleanEmptyDir(DIR ${_TargetSourceDir})
set(_ExtArgs)
if (NOT EXISTS ${_TargetSourceDir})
list(APPEND _ExtArgs
URL "https://gitcode.com/cann-src-third-party/json/releases/download/v3.11.3/json-3.11.3.tar.gz"
URL_HASH SHA256=0d8ef5af7f9794e3263480193c491549b2ba6cc74bb018906202ada498a79406
DOWNLOAD_DIR ${PYPTO_THIRD_PARTY_PATH}
)
endif ()
ExternalProject_Add(ExternalProject_nlohmann_json ${_ExtArgs}
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/third_party/json-${_TargetVersion}
SOURCE_DIR ${_TargetSourceDir}
BINARY_DIR ${_TargetBinaryDir}
INSTALL_DIR ${_TargetInstallPrefix}
CMAKE_ARGS
-G ${CMAKE_GENERATOR}
-S <SOURCE_DIR>
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
# 编译器相关配置
-DCMAKE_CXX_COMPILER_LAUNCHER=${CMAKE_CXX_COMPILER_LAUNCHER}
# 具体软件相关变量
-DJSON_MultipleHeaders=ON
-DJSON_BuildTests=OFF
BUILD_ALWAYS FALSE
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
TLS_VERIFY OFF
EXCLUDE_FROM_ALL TRUE
BUILD_BYPRODUCTS
${_TargetInstallPrefix}/include/nlohmann/json.hpp
)
if (NOT TARGET json)
add_library(json INTERFACE)
set_target_properties(json PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${_TargetInstallPrefix}/include")
add_dependencies(json ExternalProject_nlohmann_json)
message(STATUS "Use nlohmann_json from source: ${_TargetSourceDir}")
endif ()