Last active
September 23, 2021 07:24
-
-
Save Harold2017/b4eb59615a56589e5070e3aea47c9191 to your computer and use it in GitHub Desktop.
cmake denpendency build
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# . | |
# 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