forked from microsoft/vcpkg
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvcpkg_build_nmake.cmake
executable file
·166 lines (149 loc) · 7.21 KB
/
vcpkg_build_nmake.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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
function(vcpkg_build_nmake)
cmake_parse_arguments(PARSE_ARGV 0 arg
"ADD_BIN_TO_PATH;ENABLE_INSTALL;NO_DEBUG;PREFER_JOM"
"SOURCE_PATH;PROJECT_SUBPATH;PROJECT_NAME;LOGFILE_ROOT;CL_LANGUAGE"
"OPTIONS;OPTIONS_RELEASE;OPTIONS_DEBUG;PRERUN_SHELL;PRERUN_SHELL_DEBUG;PRERUN_SHELL_RELEASE;TARGET"
)
if(DEFINED arg_UNPARSED_ARGUMENTS)
message(WARNING "${CMAKE_CURRENT_FUNCTION} was passed extra arguments: ${arg_UNPARSED_ARGUMENTS}")
endif()
if(NOT DEFINED arg_SOURCE_PATH)
message(FATAL_ERROR "SOURCE_PATH must be specified")
endif()
if(arg_NO_DEBUG)
message(WARNING "NO_DEBUG argument to ${CMAKE_CURRENT_FUNCTION} is deprecated")
endif()
if(arg_ADD_BIN_TO_PATH)
message(WARNING "ADD_BIN_TO_PATH argument to ${CMAKE_CURRENT_FUNCTION} is deprecated - it never did anything")
endif()
if(NOT VCPKG_HOST_IS_WINDOWS)
message(FATAL_ERROR "${CMAKE_CURRENT_FUNCTION} only support windows.")
endif()
if(NOT DEFINED arg_LOGFILE_ROOT)
set(arg_LOGFILE_ROOT "build")
endif()
if(NOT DEFINED arg_PROJECT_NAME)
set(arg_PROJECT_NAME makefile.vc)
endif()
if(NOT DEFINED arg_TARGET)
vcpkg_list(SET arg_TARGET all)
endif()
if(arg_ENABLE_INSTALL)
vcpkg_list(APPEND arg_TARGET install)
endif()
if(NOT DEFINED arg_CL_LANGUAGE)
vcpkg_list(SET arg_CL_LANGUAGE CXX)
endif()
find_program(NMAKE nmake REQUIRED)
get_filename_component(NMAKE_EXE_PATH "${NMAKE}" DIRECTORY)
# Load toolchains
z_vcpkg_get_cmake_vars(cmake_vars_file)
debug_message("Including cmake vars from: ${cmake_vars_file}")
include("${cmake_vars_file}")
# Set needed env
set(ENV{PATH} "$ENV{PATH};${NMAKE_EXE_PATH}")
set(ENV{INCLUDE} "${CURRENT_INSTALLED_DIR}/include;$ENV{INCLUDE}")
# Set make options
vcpkg_list(SET make_opts_base /NOLOGO /G /U /F "${arg_PROJECT_NAME}" ${arg_TARGET})
if(arg_PREFER_JOM AND VCPKG_CONCURRENCY GREATER "1")
vcpkg_find_acquire_program(JOM)
get_filename_component(JOM_EXE_PATH "${JOM}" DIRECTORY)
vcpkg_add_to_path("${JOM_EXE_PATH}")
if(arg_CL_LANGUAGE AND "${VCPKG_DETECTED_CMAKE_${arg_CL_LANGUAGE}_COMPILER_ID}" STREQUAL "MSVC")
string(REGEX REPLACE " [/-]MP[0-9]* " " " VCPKG_COMBINED_${arg_CL_LANGUAGE}_FLAGS_DEBUG " ${VCPKG_COMBINED_${arg_CL_LANGUAGE}_FLAGS_DEBUG} /FS")
string(REGEX REPLACE " [/-]MP[0-9]* " " " VCPKG_COMBINED_${arg_CL_LANGUAGE}_FLAGS_RELEASE " ${VCPKG_COMBINED_${arg_CL_LANGUAGE}_FLAGS_RELEASE} /FS")
endif()
else()
set(arg_PREFER_JOM FALSE)
endif()
# Add subpath to work directory
if(DEFINED arg_PROJECT_SUBPATH)
set(project_subpath "/${arg_PROJECT_SUBPATH}")
else()
set(project_subpath "")
endif()
vcpkg_backup_env_variables(VARS _CL_ LINK)
cmake_path(NATIVE_PATH CURRENT_PACKAGES_DIR NORMALIZE install_dir_native)
foreach(build_type IN ITEMS debug release)
if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL build_type)
if(build_type STREQUAL "debug")
# Generate obj dir suffix
set(short_build_type "-dbg")
# Add install command and arguments
set(make_opts "${make_opts_base}")
if (arg_ENABLE_INSTALL)
vcpkg_list(APPEND make_opts "INSTALLDIR=${install_dir_native}\\debug")
endif()
vcpkg_list(APPEND make_opts ${arg_OPTIONS} ${arg_OPTIONS_DEBUG})
if(NOT arg_CL_LANGUAGE STREQUAL "NONE")
set(ENV{_CL_} "${VCPKG_DETECTED_CMAKE_${arg_CL_LANGUAGE}_FLAGS_DEBUG}")
endif()
set(ENV{_LINK_} "${VCPKG_DETECTED_CMAKE_SHARED_LINKER_FLAGS_DEBUG}")
set(prerun_variable_name arg_PRERUN_SHELL_DEBUG)
else()
set(short_build_type "-rel")
# Add install command and arguments
set(make_opts "${make_opts_base}")
if (arg_ENABLE_INSTALL)
vcpkg_list(APPEND make_opts "INSTALLDIR=${install_dir_native}")
endif()
vcpkg_list(APPEND make_opts ${arg_OPTIONS} ${arg_OPTIONS_RELEASE})
if(NOT arg_CL_LANGUAGE STREQUAL "NONE")
set(ENV{_CL_} "${VCPKG_DETECTED_CMAKE_${arg_CL_LANGUAGE}_FLAGS_RELEASE}")
endif()
set(ENV{_LINK_} "${VCPKG_DETECTED_CMAKE_SHARED_LINKER_FLAGS_RELEASE}")
set(prerun_variable_name arg_PRERUN_SHELL_RELEASE)
endif()
set(triplet_and_build_type "${TARGET_TRIPLET}${short_build_type}")
set(object_dir "${CURRENT_BUILDTREES_DIR}/${triplet_and_build_type}")
file(REMOVE_RECURSE "${object_dir}")
file(COPY "${arg_SOURCE_PATH}/" DESTINATION "${object_dir}")
if(DEFINED arg_PRERUN_SHELL)
message(STATUS "Prerunning ${triplet_and_build_type}")
vcpkg_execute_required_process(
COMMAND ${arg_PRERUN_SHELL}
WORKING_DIRECTORY "${object_dir}${project_subpath}"
LOGNAME "prerun-${triplet_and_build_type}"
)
endif()
if(DEFINED "${prerun_variable_name}")
message(STATUS "Prerunning ${triplet_and_build_type}")
vcpkg_execute_required_process(
COMMAND ${${prerun_variable_name}}
WORKING_DIRECTORY "${object_dir}${project_subpath}"
LOGNAME "prerun-specific-${triplet_and_build_type}"
)
endif()
if (NOT arg_ENABLE_INSTALL)
message(STATUS "Building ${triplet_and_build_type}")
else()
message(STATUS "Building and installing ${triplet_and_build_type}")
endif()
set(run_nmake TRUE)
set(tool_suffix "")
if(arg_PREFER_JOM)
execute_process(
COMMAND "${JOM}" /K /J ${VCPKG_CONCURRENCY} ${make_opts}
WORKING_DIRECTORY "${object_dir}${project_subpath}"
OUTPUT_FILE "${CURRENT_BUILDTREES_DIR}/${arg_LOGFILE_ROOT}-${triplet_and_build_type}-jom-out.log"
ERROR_FILE "${CURRENT_BUILDTREES_DIR}/${arg_LOGFILE_ROOT}-${triplet_and_build_type}-jom-err.log"
RESULT_VARIABLE error_code
)
if(error_code EQUAL "0")
set(run_nmake FALSE)
else()
message(STATUS "Restarting build without parallelism")
set(tool_suffix "-nmake")
endif()
endif()
if(run_nmake)
vcpkg_execute_build_process(
COMMAND "${NMAKE}" ${make_opts}
WORKING_DIRECTORY "${object_dir}${project_subpath}"
LOGNAME "${arg_LOGFILE_ROOT}-${triplet_and_build_type}${tool_suffix}"
)
endif()
vcpkg_restore_env_variables(VARS _CL_ LINK)
endif()
endforeach()
endfunction()