-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathExternalProject.cmake
More file actions
131 lines (104 loc) · 3.64 KB
/
ExternalProject.cmake
File metadata and controls
131 lines (104 loc) · 3.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# ------ Set the options for the external project ------- #
message(STATUS "# Set the options for the external project")
include(ExternalProject)
if (WIN32)
message(STATUS "- Platform : Windows")
set(STATIC_LIBRARY lib)
set(SHARED_LIBRARY dll)
else()
message(STATUS "- Platform : Others")
set(STATIC_LIBRARY a)
set(SHARED_LIBRARY so)
endif()
set(CMAKE_BUILD_TYPE Debug CACHE STRING "Build Type")
set(EXE_DIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE})
set(EXT_INCLUDE_DIR ${CMAKE_BINARY_DIR}/include)
set(EXT_LIB_DIR ${CMAKE_BINARY_DIR}/lib)
set(EXT_BIN_DIR ${EXE_DIR})
set(EXT_LIST "")
set(EXT_LIBRARIES "")
target_include_directories(${PROJECT_NAME} PUBLIC ${EXT_INCLUDE_DIR})
# ------ Find the library name ---------- #
function(get_library_name RESULT LIBRARY_NAME)
if (WIN32)
set(${RESULT} ${LIBRARY_NAME} PARENT_SCOPE)
else()
set(${RESULT} "lib${LIBRARY_NAME}" PARENT_SCOPE)
endif()
endfunction()
# ------ Find the library extension ----- #
function(get_library_extension RESULT BUILD_SHARED)
if (WIN32)
set(${RESULT} "lib" PARENT_SCOPE)
else()
if (${BUILD_SHARED})
set(${RESULT} "so" PARENT_SCOPE)
else()
set(${RESULT} "a" PARENT_SCOPE)
endif()
endif()
endfunction()
# ------ Add the external project ------- #
function(add_external_library)
cmake_parse_arguments(
ARG # Options / Single Value / Multi Value
""
"PROJECT_NAME;LIBRARY_NAME;GIT_REPOSITORY;GIT_TAG;UPDATE_COMMAND;PATCH_COMMAND;TEST_COMMAND;BUILD_SHARED_LIBS;BUILD_DEMO_FILE"
""
${ARGN})
if (NOT DEFINED ARG_PROJECT_NAME)
message(FATAL_ERROR "# Error : The external project must have a name")
endif()
if (NOT DEFINED ARG_LIBRARY_NAME)
set(ARG_LIBRARY_NAME ${ARG_PROJECT_NAME})
endif()
if (NOT DEFINED ARG_GIT_REPOSITORY)
message(FATAL_ERROR "# Error : The external project must have a git repository")
endif()
if (NOT DEFINED ARG_GIT_TAG)
set(ARG_GIT_TAG "")
endif()
if (NOT DEFINED ARG_UPDATE_COMMAND)
set(ARG_UPDATE_COMMAND "")
endif()
if (NOT DEFINED ARG_PATCH_COMMAND)
set(ARG_PATCH_COMMAND "")
endif()
if (NOT DEFINED ARG_TEST_COMMAND)
set(ARG_TEST_COMMAND "")
endif()
if (NOT DEFINED ARG_BUILD_SHARED_LIBS)
set(ARG_BUILD_SHARED_LIBS ON)
endif()
if (NOT DEFINED ARG_BUILD_DEDMO_FILE)
set(ARG_BUILD_DEMO_FILE OFF)
endif()
message(STATUS "# Download the external project : ${ARG_PROJECT_NAME}")
message(STATUS "- The repository : ${ARG_GIT_REPOSITORY} | the tag : ${ARG_GIT_TAG}")
message(STATUS "- The External Build Type : ${CMAKE_BUILD_TYPE}")
message(STATUS "- The External Include Directory : ${EXT_INCLUDE_DIR}")
message(STATUS "- The External Library Directory : ${EXT_LIB_DIR}")
message(STATUS "- The External Binary Directory : ${EXT_BIN_DIR}")
message(STATUS "- The External Library Type : ${ARG_BUILD_SHARED_LIBS}")
ExternalProject_Add(
${ARG_PROJECT_NAME}
GIT_REPOSITORY ${ARG_GIT_REPOSITORY}
GIT_TAG ${ARG_GIT_TAG}
PREFIX ${CMAKE_BINARY_DIR}/Prefix/${ARG_LIBRARY_NAME}
UPDATE_COMMAND ${ARG_UPDATE_COMMAND}
PATCH_COMMAND ${ARG_PATCH_COMMAND}
TEST_COMMAND ${ARG_TEST_COMMAND}
CMAKE_ARGS
-DINCLUDE_DIR=${EXT_INCLUDE_DIR}
-DLIB_DIR=${EXT_LIB_DIR}
-DBIN_DIR=${EXT_BIN_DIR}
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-DBUILD_SHARED_LIBS=${ARG_BUILD_SHARED_LIBS}
-DBUILD_DEMO_FILE=${ARG_BUILD_DEMO_FILE}
)
get_library_extension(LIB_EXT ${ARG_BUILD_SHARED_LIBS})
get_library_name(LIBRARY_NAME ${ARG_LIBRARY_NAME})
message(STATUS "# Link the external library")
target_link_libraries(${PROJECT_NAME} PUBLIC ${EXT_LIB_DIR}/${LIBRARY_NAME}.${LIB_EXT})
add_dependencies(${PROJECT_NAME} ${ARG_PROJECT_NAME})
endfunction()