sewenew / redis-plus-plus

Redis client written in C++
Apache License 2.0
1.58k stars 347 forks source link

[QUESTION]how to use CPM include this project? #386

Open WangHHY19931001 opened 2 years ago

WangHHY19931001 commented 2 years ago

cmake_minimum_required(VERSION 3.14 FATAL_ERROR)

project ("redis_cpp") if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") set(CMAKE_POLICY_DEFAULT_CMP0077 NEW) endif()

set(CPM_DOWNLOAD_LOCATION "${PROJECT_SOURCE_DIR}/cmake/CPM.cmake") set(CPM_GET_CPM_DOWNLOAD_LOCATION "${PROJECT_SOURCE_DIR}/cmake/get_cpm.cmake")

if(NOT EXISTS ${CPM_DOWNLOAD_LOCATION}) message(STATUS "Downloading CPM.cmake") file(DOWNLOAD https://github.com/cpm-cmake/CPM.cmake/releases/latest/download/CPM.cmake ${CPM_DOWNLOAD_LOCATION}) else() message(STATUS "CPM.cmake exists pass download") endif(NOT EXISTS ${CPM_DOWNLOAD_LOCATION})

if(NOT EXISTS ${CPM_GET_CPM_DOWNLOAD_LOCATION}) message(STATUS "Downloading get_cpm.cmake") file(DOWNLOAD https://github.com/cpm-cmake/CPM.cmake/releases/latest/download/get_cpm.cmake ${CPM_GET_CPM_DOWNLOAD_LOCATION}) else() message(STATUS "get_cpm.cmake exists pass download") endif(NOT EXISTS ${CPM_GET_CPM_DOWNLOAD_LOCATION})

启用c++11

set(CMAKE_CXX_STANDARD 11)

include(GNUInstallDirs) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})

include(${CPM_DOWNLOAD_LOCATION})

CPMAddPackage( NAME hiredis # <- use OpenSSL here GITHUB_REPOSITORY redis/hiredis GIT_TAG v1.0.2 VERSION v1.0.2 EXCLUDE_FROM_ALL true OPTIONS "BUILD_TESTING OFF" "BUILD_SHARED_LIBS OFF" "BUILD_STATIC_LIBS ON" )

包含子项目。

set(ENABLE_SSL OFF) set(REDIS_PLUS_PLUS_BUILD_STATIC ON) set(REDIS_PLUS_PLUS_BUILD_SHARED OFF) set(REDIS_PLUS_PLUS_BUILD_TEST OFF) add_subdirectory("3rd/redis-plus-plus")

use cmake file like this, but not work。

1> 命令行: "C:\WINDOWS\system32\cmd.exe" /c "%SYSTEMROOT%\System32\chcp.com 65001 >NUL && "C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\2022\COMMUNITY\COMMON7\IDE\COMMONEXTENSIONS\MICROSOFT\CMAKE\CMake\bin\cmake.exe" -G "Ninja" -DCMAKE_BUILD_TYPE:STRING="Debug" -DCMAKE_INSTALL_PREFIX:PATH="C:\work\redis_cpp\redis_cpp\out\install\x64-Debug" -DVCPKG_TARGET_TRIPLET:STRING="x64-windows" -DCMAKE_C_COMPILER:FILEPATH="C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.33.31629/bin/Hostx64/x64/cl.exe" -DCMAKE_CXX_COMPILER:FILEPATH="C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.33.31629/bin/Hostx64/x64/cl.exe" -DCMAKE_MAKE_PROGRAM="C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\2022\COMMUNITY\COMMON7\IDE\COMMONEXTENSIONS\MICROSOFT\CMAKE\Ninja\ninja.exe" -DCMAKE_TOOLCHAIN_FILE="C:/vcpkg/scripts/buildsystems/vcpkg.cmake" "C:\work\redis_cpp\redis_cpp" 2>&1" 1> 工作目录: C:\work\redis_cpp\redis_cpp\out\build\x64-Debug 1> [CMake] -- CPM.cmake exists pass download 1> [CMake] -- get_cpm.cmake exists pass download 1> [CMake] -- CPM: adding package hiredis@v1.0.2 (v1.0.2) 1> [CMake] Detected version: 1.0.2 1> [CMake] -- redis-plus-plus version: 1.3.5 1> [CMake] -- redis-plus-plus build type: Debug 1> [CMake] -- redis-plus-plus build with CXX standard: c++17 1> [CMake] -- redis-plus-plus TLS support: OFF 1> [CMake] -- redis-plus-plus build static library: ON 1> [CMake] -- redis-plus-plus build static library with position independent code: ON 1> [CMake] -- redis-plus-plus build shared library: OFF 1> [CMake] -- redis-plus-plus build test: OFF 1> [CMake] -- Debian package name: .deb 1> [CMake] -- Configuring done 1> [CMake] CMake Error at 3rd/redis-plus-plus/CMakeLists.txt:162 (target_link_libraries): 1> [CMake] Target "redis++_static" links to: 1> [CMake] 1> [CMake] hiredis::hiredis 1> [CMake] 1> [CMake] but the target was not found. Possible reasons include: 1> [CMake] 1> [CMake] There is a typo in the target name. 1> [CMake] A find_package call is missing for an IMPORTED target. 1> [CMake] * An ALIAS target is missing. 1> [CMake] 1> [CMake] 1> [CMake] 1> [CMake] -- Generating done 1> [CMake] CMake Generate step failed. Build files cannot be regenerated correctly.

sewenew commented 2 years ago

I didn't used CPM before, and I did some research. Looks like it needs FetchContent support. However, so far, redis-plus-plus does not support FetchContent feature. So it looks like that you cannot compile it with CPM by now.

Regards

WangHHY19931001 commented 2 years ago

but use add_submodule also can't include, with hiredis be include by add_submodule

WangHHY19931001 commented 2 years ago

how can i do? just want include you project by src

sewenew commented 2 years ago

What do you mean by including redis-plus-plus by src?

B.T.W. instead of FetchContent, you can use ExternalProject feature of cmake to include redis-plus-plus. this issue gives an example, and hope it helpful for you.

Regards

WangHHY19931001 commented 2 years ago

with the issue

1> 命令行: "C:\WINDOWS\system32\cmd.exe" /c "%SYSTEMROOT%\System32\chcp.com 65001 >NUL && "C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\2022\COMMUNITY\COMMON7\IDE\COMMONEXTENSIONS\MICROSOFT\CMAKE\CMake\bin\cmake.exe" -G "Ninja" -DCMAKE_BUILD_TYPE:STRING="Debug" -DCMAKE_INSTALL_PREFIX:PATH="C:\work\redis_cpp\redis_cpp\out\install\x64-Debug" -DVCPKG_TARGET_TRIPLET:STRING="x64-windows" -DCMAKE_C_COMPILER:FILEPATH="C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.33.31629/bin/Hostx64/x64/cl.exe" -DCMAKE_CXX_COMPILER:FILEPATH="C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.33.31629/bin/Hostx64/x64/cl.exe" -DCMAKE_MAKE_PROGRAM="C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\2022\COMMUNITY\COMMON7\IDE\COMMONEXTENSIONS\MICROSOFT\CMAKE\Ninja\ninja.exe" -DCMAKE_TOOLCHAIN_FILE="C:/vcpkg/scripts/buildsystems/vcpkg.cmake" "C:\work\redis_cpp\redis_cpp" 2>&1" 1> 工作目录: C:\work\redis_cpp\redis_cpp\out\build\x64-Debug 1> [CMake] CMake Warning (dev) at C:/Program Files/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.23/Modules/ExternalProject.cmake:2147 (message): 1> [CMake] Policy CMP0114 is not set: ExternalProject step targets fully adopt their 1> [CMake] steps. Run "cmake --help-policy CMP0114" for policy details. Use the 1> [CMake] cmake_policy command to set the policy and suppress this warning. 1> [CMake] 1> [CMake] ExternalProject target 'hiredis' would depend on the targets for step(s) 1> [CMake] 'install' under policy CMP0114, but this is being left out for 1> [CMake] compatibility since the policy is not set. 1> [CMake] Call Stack (most recent call first): 1> [CMake] CMakeLists.txt:14 (ExternalProject_Add_StepTargets) 1> [CMake] This warning is for project developers. Use -Wno-dev to suppress it. 1> [CMake] 1> [CMake] -- Configuring done 1> [CMake] -- Generating done 1> [CMake] -- Build files have been written to: C:/work/redis_cpp/redis_cpp/out/build/x64-Debug

C:\work\redis_cpp\redis_cpp\out\build\x64-Debug\ninja : error : '../../install/x64-Debug/lib/libredis++.a', needed by 'app.exe', missing and no known rule to make it

WangHHY19931001 commented 2 years ago

cmake_minimum_required(VERSION 3.14)

project(app) set(CMAKE_CXX_STANDARD 17) include(GNUInstallDirs) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})

include(FetchContent)

用于在cmake低于3.14是使用FetchContent_MakeAvailable

set(FetchContentHelp_LOCATION "${PROJECT_SOURCE_DIR}/cmake/FetchContentHelp.cmake") include(${FetchContentHelp_LOCATION})

FetchContent_Declare( hiredis URL https://github.com/redis/hiredis/archive/refs/tags/v1.0.2.zip )

这种方式需要用cmake 3.14

FetchContent_MakeAvailable(hiredis)

FetchContent_getproperties(hiredis INSTALL_DIR) set(HIREDIS_HEADER_PATH ${INSTALL_DIR}/include) set(HIREDIS_LIB_PATH ${INSTALL_DIR}/lib)

FetchContent_Declare( redis++ URL https://github.com/sewenew/redis-plus-plus/archive/refs/tags/1.3.5.zip )

FetchContent_MakeAvailable(redis++)

FetchContent_getproperties(redis++ INSTALL_PATH) set(REDIS_PLUS_PLUS_HEADER_PATH ${INSTALL_DIR}/include) set(REDIS_PLUS_PLUS_LIB_PATH ${INSTALL_DIR}/lib)

add_executable(app app.cpp) target_include_directories(app PRIVATE ${HIREDIS_HEADER_PATH} ${REDIS_PLUS_PLUS_HEADER_PATH}) target_link_libraries(app redis++::redis++ hiredis)

in this way it work,maybe you can add it to README.md

WangHHY19931001 commented 2 years ago

FetchContentHelp.cmake:

if(${CMAKE_VERSION} VERSION_LESS 3.14) message("build not have FetchContent_MakeAvailable, so use self") macro(FetchContent_MakeAvailable NAME) FetchContent_GetProperties(${NAME}) if(NOT ${NAME}_POPULATED) FetchContent_Populate(${NAME}) add_subdirectory(${${NAME}_SOURCE_DIR} ${${NAME}_BINARY_DIR}) endif() endmacro() endif()

sewenew commented 2 years ago

Great! Thanks a lot for your work! I'll take a try!

Regards