Link external library (steamapi) by path with cmake

Viewed 20

I am trying to link Steam API with cmake.

I've tried Googling it, and there is close to nothing on steamapi cmake. In my case the Steam SDK is stored in C:/Users/user/Documents/Visual Studio 2022/Libraries/steam-sdk/.

This is my broken cmake:

# Project
cmake_minimum_required (VERSION 3.14)
project (MyProject)

#target_include_directories(${PROJECT_NAME} PUBLIC "C:/Users/user/Documents/Visual Studio 2022/Libraries/steam-sdk/public/steam/")
#target_link_directories(${PROJECT_NAME} PUBLIC "C:/Users/user/Documents/Visual Studio 2022/Libraries/steam-sdk/redistributable_bin/win64/")

#add_library(steamapi SHARED IMPORTED) # or STATIC instead of SHARED
#set_target_properties(bar PROPERTIES
#  IMPORTED_LOCATION "${CMAKE_SOURCE_DIR}/lib/libbar.so"
#  INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/include/libbar"
#)
find_library(
    steamapi
    #external_library_dependency 
    #external_library_name
    PATHS "C:/Users/user/Documents/Visual Studio 2022/Libraries/steam-sdk/" # you can manually provide a path to search for your library if its not in the PATH
    #PATH_SUFFIXES "/redistributable_bin/win64/" # possible subfolders inside the top directory of your library
    PATH_SUFFIXES "/redistributable_bin" "/redistributable_bin/win64" # possible subfolders inside the top directory of your library
 )
#find_library(steamapi "steam_api64.lib" PATHS "C:/Users/Rico/Documents/Visual Studio 2022/Libraries/steam-sdk/redistributable_bin/win64/")
#target_include_directories(${PROJECT_NAME} PUBLIC "C:/Users/Rico/Documents/Visual Studio 2022/Libraries/steam-sdk/public/steam/")

include_directories(${steamapi_INCLUDE_DIRS})

# Linking
add_executable(${PROJECT_NAME}
    "src/Main.cpp"
)

target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_20)
    
target_link_libraries(${PROJECT_NAME}
    steamapi
)

How can I do this?

1 Answers

I would end up with a solution similar to CPM.cmake for hands-free installation

# get_steamapi.cmake (located in myproject/cmake)
set(STEAMAPI_ZIP_LOCATION "${CMAKE_BINARY_DIR}/cmake/steamworks_sdk.zip")
set(STEAMAPI_LOCATION "${CMAKE_BINARY_DIR}/cmake/steamworks_sdk")
set(STEAMAPI_BINARY_DIR "${STEAMAPI_LOCATION}/sdk/redistributable_bin/win64/steam_api64.lib")
set(STEAMAPI_SOURCE_DIR "${STEAMAPI_LOCATION}/sdk/public/steam")
set(STEAMAPI_SHARED_DIR "${STEAMAPI_LOCATION}/sdk/redistributable_bin/win64/steam_api64.dll")

#set(CPM_DOWNLOAD_LOCATION "${CMAKE_BINARY_DIR}/cmake/CPM_${CPM_DOWNLOAD_VERSION}.cmake")

if(NOT (EXISTS ${STEAMAPI_ZIP_LOCATION}))
  message(STATUS "Downloading Steam SDK to ${STEAMAPI_ZIP_LOCATION}")
  file(DOWNLOAD
       https://partner.steamgames.com/downloads/steamworks_sdk.zip
       ${STEAMAPI_ZIP_LOCATION}
  )
endif()

if(NOT(EXISTS ${STEAMAPI_LOCATION}))
    message(STATUS "Unzipping Steam SDK to ${STEAMAPI_ZIP_LOCATION}")
    file(ARCHIVE_EXTRACT INPUT ${STEAMAPI_ZIP_LOCATION} DESTINATION ${STEAMAPI_LOCATION})
endif()

#include(${STEAMAPI_ZIP_LOCATION})

The CMakeLists.txt

#CMakeLists.txt
# Project
cmake_minimum_required (VERSION 3.14)
project (MyProject)
set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
include(get_steamapi)

# Libraries
find_package(Threads REQUIRED)

# Linking
add_executable(${PROJECT_NAME}
    "src/Main.cpp"    
)

target_include_directories(${PROJECT_NAME} 
    PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include
    PUBLIC ${STEAMAPI_SOURCE_DIR}
    #PUBLIC "C:/Users/user/Documents/Visual Studio 2022/Libraries/steam-sdk/public/steam"
)

target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_20)
    
target_link_libraries(${PROJECT_NAME}
    PRIVATE Threads::Threads
    PUBLIC ${STEAMAPI_BINARY_DIR}
    #"C:/Users/user/Documents/Visual Studio 2022/Libraries/steam-sdk/redistributable_bin/win64/steam_api64.lib"
)

file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/steam_appid.txt
     DESTINATION ${CMAKE_CURRENT_BINARY_DIR})

file(COPY ${STEAMAPI_SHARED_DIR}
    DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
)

The commented out portions also work but I think the method I came up with is pretty neat.

Related