Skip to content

Instantly share code, notes, and snippets.

@Harold2017
Last active September 23, 2021 07:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Harold2017/b4eb59615a56589e5070e3aea47c9191 to your computer and use it in GitHub Desktop.
Save Harold2017/b4eb59615a56589e5070e3aea47c9191 to your computer and use it in GitHub Desktop.
cmake denpendency build
# .
# bin
# source
# dependency
# include
# source
# example
# include
# source
# external
# project level
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin) # dll / exe
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib) # dll
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib) # lib
set(CMAKE_DEBUG_POSTFIX _d)
# custom install path
set(CMAKE_INSTALL_PREFIX ${PROJECT_SOURCE_DIR}/install)
# function to install lib
function(install_lib lib_name public_headers)
math(EXPR lastIndex "${ARGC} - 1")
if (${ARGC} GREATER 2)
foreach(index RANGE 2 ${lastIndex})
set(public_headers "${public_headers};${ARGV${index}}") # append all headers into public_headers
endforeach()
endif()
set_target_properties(${lib_name} PROPERTIES PUBLIC_HEADER "${public_headers}") # quotations are required here
install(TARGETS ${lib_name}
ARCHIVE DESTINATION lib # relative path to CMAKE_INSTALL_PREFIX
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin
PUBLIC_HEADER DESTINATION include)
endfunction()
# Dependency
set(DEPENDENCY_LIBRARY_OUTPUR_NAME Dependency)
set(DEPENDENCY_SOURCE_DIR ${PROJECT_SOURCE_DIR}/source/Dependency/source)
add_library(${DEPENDENCY_LIBRARY_OUTPUR_NAME} SHARED ${DEPENDENCY_SOURCE_DIR}/dependency.cpp)
target_include_directories(${DEPENDENCY_LIBRARY_OUTPUR_NAME} PRIVATE ${DEPENDENCY_INCLUDE_DIR})
install_lib(${DEPENDENCY_LIBRARY_OUTPUR_NAME} ${DEPENDENCY_INCLUDE_DIR}/dependency.hpp)
# Example
set(EXAMPLE_LIBRARY_OUTPUT_NAME ExampleLib)
set(EXAMPLE_SOURCE_DIR ${PROJECT_SOURCE_DIR}/source/example/source)
set(EXAMPLE_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/source/example/include)
set(EXAMPLE_EXTERNAL_DIR ${PROJECT_SOURCE_DIR}/source/example/external)
set(EXAMPLE_LIB_FILES
${EXAMPLE_SOURCE_DIR}/example.cpp
)
add_library(${EXAMPLE_LIBRARY_OUTPUT_NAME} SHARED ${EXAMPLE_LIB_FILES})
target_include_directories(${EXAMPLE_LIBRARY_OUTPUT_NAME}
PRIVATE ${EXAMPLE_INCLUDE_DIR}
PRIVATE ${EXAMPLE_EXTERNAL_DIR}
)
target_link_libraries(${EXAMPLE_LIBRARY_OUTPUT_NAME}
debug ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/Debug/Dependency_d.lib optimized ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/Release/Dependency.lib
)
set(EXAMPLE_PUBLIC_HEADERS
${EXAMPLE_EXTERNAL_DIR}/example.hpp
)
install_lib(${EXAMPLE_LIBRARY_OUTPUT_NAME} ${EXAMPLE_PUBLIC_HEADERS})
# ensure to build dependency first
add_dependencies(${EXAMPLE_LIBRARY_OUTPUT_NAME} ${DEPENDENCY_LIBRARY_OUTPUR_NAME})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment