-
Notifications
You must be signed in to change notification settings - Fork 2.1k
/
utils.cmake
143 lines (133 loc) · 4.42 KB
/
utils.cmake
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
132
133
134
135
136
137
138
139
140
141
142
143
# Copyright 2010-2024 Google LLC
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
function(get_patch_from_git VERSION_PATCH VERSION_MAJOR)
find_package(Git QUIET)
if(NOT GIT_FOUND)
message(STATUS "Did not find git package.")
set(PATCH 9999)
else()
# If no tags can be found, it is a git shallow clone
execute_process(COMMAND
${GIT_EXECUTABLE} rev-list --count v${VERSION_MAJOR}.0..HEAD
RESULT_VARIABLE RESULT_VAR
OUTPUT_VARIABLE PATCH
ERROR_QUIET
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
if(RESULT_VAR) # since 0 is success, need invert it
message(STATUS "Did not be able to compute patch from v${VERSION_MAJOR}.0.")
set(PATCH 9999)
endif()
STRING(STRIP PATCH ${PATCH})
STRING(REGEX REPLACE "\n$" "" PATCH ${PATCH})
STRING(REGEX REPLACE " " "" PATCH ${PATCH})
endif()
set(${VERSION_PATCH} ${PATCH} PARENT_SCOPE)
endfunction()
function(set_version VERSION)
if(DEFINED ENV{OR_TOOLS_MAJOR} AND DEFINED ENV{OR_TOOLS_MINOR})
set(MAJOR $ENV{OR_TOOLS_MAJOR})
set(MINOR $ENV{OR_TOOLS_MINOR})
else()
# Get Major and Minor from Version.txt
file(STRINGS "Version.txt" VERSION_STR)
foreach(STR ${VERSION_STR})
if(${STR} MATCHES "OR_TOOLS_MAJOR=(.*)")
set(MAJOR ${CMAKE_MATCH_1})
endif()
if(${STR} MATCHES "OR_TOOLS_MINOR=(.*)")
set(MINOR ${CMAKE_MATCH_1})
endif()
endforeach()
endif()
if(DEFINED ENV{OR_TOOLS_PATCH})
set(PATCH $ENV{OR_TOOLS_PATCH})
else()
# Compute Patch if .git is present otherwise set it to 9999
get_filename_component(GIT_DIR ".git" ABSOLUTE)
if(EXISTS ${GIT_DIR})
get_patch_from_git(PATCH ${MAJOR})
else()
set(PATCH 9999)
endif()
endif()
set(${VERSION} "${MAJOR}.${MINOR}.${PATCH}" PARENT_SCOPE)
endfunction()
# fetch_git_dependency()
#
# CMake function to download, build and install (in staging area) a dependency at configure
# time.
#
# Parameters:
# NAME: name of the dependency
# REPOSITORY: git url of the dependency
# TAG: tag of the dependency
# PATCH_COMMAND: apply patch
# SOURCE_SUBDIR: Path to source CMakeLists.txt relative to root dir
# CMAKE_ARGS: List of specific CMake args to add
#
# e.g.:
# fetch_git_dependency(
# NAME
# abseil-cpp
# URL
# https://github.com/abseil/abseil-cpp.git
# TAG
# main
# PATCH_COMMAND
# "git apply ${CMAKE_SOURCE_DIR}/patches/abseil-cpp.patch"
# )
function(fetch_git_dependency)
set(options "")
set(oneValueArgs NAME REPOSITORY TAG PATCH_COMMAND SOURCE_SUBDIR)
set(multiValueArgs CMAKE_ARGS)
cmake_parse_arguments(GIT_DEP
"${options}"
"${oneValueArgs}"
"${multiValueArgs}"
${ARGN}
)
message(STATUS "Building ${GIT_DEP_NAME}: ...")
string(TOLOWER ${GIT_DEP_NAME} NAME_LOWER)
if(GIT_DEP_PATCH_COMMAND)
set(PATCH_CMD "${GIT_DEP_PATCH_COMMAND}")
else()
set(PATCH_CMD "")
endif()
configure_file(
${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt.in
${CMAKE_BINARY_DIR}/_deps/${NAME_LOWER}-subbuild/CMakeLists.txt @ONLY)
execute_process(
COMMAND ${CMAKE_COMMAND} -S. -Bproject_build -G "${CMAKE_GENERATOR}"
RESULT_VARIABLE result
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/_deps/${NAME_LOWER}-subbuild)
if(result)
message(FATAL_ERROR "CMake step for ${GIT_DEP_NAME} failed: ${result}")
endif()
execute_process(
COMMAND ${CMAKE_COMMAND} --build project_build --config ${CMAKE_BUILD_TYPE}
RESULT_VARIABLE result
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/_deps/${NAME_LOWER}-subbuild)
if(result)
message(FATAL_ERROR "Build step for ${GIT_DEP_NAME} failed: ${result}")
endif()
if(GIT_DEP_SOURCE_SUBDIR)
add_subdirectory(
${CMAKE_BINARY_DIR}/_deps/${NAME_LOWER}-src/${GIT_DEP_SOURCE_SUBDIR}
${CMAKE_BINARY_DIR}/_deps/${NAME_LOWER}-build)
else()
add_subdirectory(
${CMAKE_BINARY_DIR}/_deps/${NAME_LOWER}-src
${CMAKE_BINARY_DIR}/_deps/${NAME_LOWER}-build)
endif()
message(STATUS "Building ${GIT_DEP_NAME}: ...DONE")
endfunction()