]>
Commit | Line | Data |
---|---|---|
1e59de90 TL |
1 | #[===[.md:\r |
2 | # vcpkg_build_nmake\r | |
3 | \r | |
4 | Build a msvc makefile project.\r | |
5 | \r | |
6 | ## Usage:\r | |
7 | ```cmake\r | |
8 | vcpkg_build_nmake(\r | |
9 | SOURCE_PATH <${SOURCE_PATH}>\r | |
10 | [NO_DEBUG]\r | |
11 | [TARGET <all>]\r | |
12 | [PROJECT_SUBPATH <${SUBPATH}>]\r | |
13 | [PROJECT_NAME <${MAKEFILE_NAME}>]\r | |
14 | [PRERUN_SHELL <${SHELL_PATH}>]\r | |
15 | [PRERUN_SHELL_DEBUG <${SHELL_PATH}>]\r | |
16 | [PRERUN_SHELL_RELEASE <${SHELL_PATH}>]\r | |
17 | [OPTIONS <-DUSE_THIS_IN_ALL_BUILDS=1>...]\r | |
18 | [OPTIONS_RELEASE <-DOPTIMIZE=1>...]\r | |
19 | [OPTIONS_DEBUG <-DDEBUGGABLE=1>...]\r | |
20 | [TARGET <target>])\r | |
21 | ```\r | |
22 | \r | |
23 | ## Parameters\r | |
24 | ### SOURCE_PATH\r | |
25 | Specifies the directory containing the source files.\r | |
26 | By convention, this is usually set in the portfile as the variable `SOURCE_PATH`.\r | |
27 | \r | |
28 | ### PROJECT_SUBPATH\r | |
29 | Specifies the sub directory containing the `makefile.vc`/`makefile.mak`/`makefile.msvc` or other msvc makefile.\r | |
30 | \r | |
31 | ### PROJECT_NAME\r | |
32 | Specifies the name of msvc makefile name.\r | |
33 | Default is `makefile.vc`\r | |
34 | \r | |
35 | ### NO_DEBUG\r | |
36 | This port doesn't support debug mode.\r | |
37 | \r | |
38 | ### ENABLE_INSTALL\r | |
39 | Install binaries after build.\r | |
40 | \r | |
41 | ### PRERUN_SHELL\r | |
42 | Script that needs to be called before build\r | |
43 | \r | |
44 | ### PRERUN_SHELL_DEBUG\r | |
45 | Script that needs to be called before debug build\r | |
46 | \r | |
47 | ### PRERUN_SHELL_RELEASE\r | |
48 | Script that needs to be called before release build\r | |
49 | \r | |
50 | ### OPTIONS\r | |
51 | Additional options passed to generate during the generation.\r | |
52 | \r | |
53 | ### OPTIONS_RELEASE\r | |
54 | Additional options passed to generate during the Release generation. These are in addition to `OPTIONS`.\r | |
55 | \r | |
56 | ### OPTIONS_DEBUG\r | |
57 | Additional options passed to generate during the Debug generation. These are in addition to `OPTIONS`.\r | |
58 | \r | |
59 | ### TARGET\r | |
60 | The target passed to the nmake build command (`nmake/nmake install`). If not specified, no target will\r | |
61 | be passed.\r | |
62 | \r | |
63 | ### ADD_BIN_TO_PATH\r | |
64 | Adds the appropriate Release and Debug `bin\` directories to the path during the build such that executables can run against the in-tree DLLs.\r | |
65 | \r | |
66 | ## Notes:\r | |
67 | This command should be preceded by a call to [`vcpkg_configure_nmake()`](vcpkg_configure_nmake.md).\r | |
68 | You can use the alias [`vcpkg_install_nmake()`](vcpkg_install_nmake.md) function if your makefile supports the\r | |
69 | "install" target\r | |
70 | \r | |
71 | ## Examples\r | |
72 | \r | |
73 | * [tcl](https://github.com/Microsoft/vcpkg/blob/master/ports/tcl/portfile.cmake)\r | |
74 | * [freexl](https://github.com/Microsoft/vcpkg/blob/master/ports/freexl/portfile.cmake)\r | |
75 | #]===]\r | |
76 | \r | |
77 | function(vcpkg_build_nmake)\r | |
78 | # parse parameters such that semicolons in options arguments to COMMAND don't get erased\r | |
79 | cmake_parse_arguments(PARSE_ARGV 0 _bn\r | |
80 | "ADD_BIN_TO_PATH;ENABLE_INSTALL;NO_DEBUG"\r | |
81 | "SOURCE_PATH;PROJECT_SUBPATH;PROJECT_NAME;LOGFILE_ROOT"\r | |
82 | "OPTIONS;OPTIONS_RELEASE;OPTIONS_DEBUG;PRERUN_SHELL;PRERUN_SHELL_DEBUG;PRERUN_SHELL_RELEASE;TARGET"\r | |
83 | )\r | |
84 | \r | |
85 | if (NOT CMAKE_HOST_WIN32)\r | |
86 | message(FATAL_ERROR "vcpkg_build_nmake only support windows.")\r | |
87 | endif()\r | |
88 | \r | |
89 | if (_bn_OPTIONS_DEBUG STREQUAL _bn_OPTIONS_RELEASE)\r | |
90 | message(FATAL_ERROR "Detected debug configuration is equal to release configuration, please use NO_DEBUG for vcpkg_build_nmake/vcpkg_install_nmake")\r | |
91 | endif()\r | |
92 | \r | |
93 | if(NOT _bn_LOGFILE_ROOT)\r | |
94 | set(_bn_LOGFILE_ROOT "build")\r | |
95 | endif()\r | |
96 | \r | |
97 | if (NOT _bn_PROJECT_NAME)\r | |
98 | set(MAKEFILE_NAME makefile.vc)\r | |
99 | else()\r | |
100 | set(MAKEFILE_NAME ${_bn_PROJECT_NAME})\r | |
101 | endif()\r | |
102 | \r | |
103 | set(MAKE )\r | |
104 | set(MAKE_OPTS_BASE )\r | |
105 | \r | |
106 | find_program(NMAKE nmake REQUIRED)\r | |
107 | get_filename_component(NMAKE_EXE_PATH ${NMAKE} DIRECTORY)\r | |
108 | # Load toolchains\r | |
109 | if(NOT VCPKG_CHAINLOAD_TOOLCHAIN_FILE)\r | |
110 | set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE "${SCRIPTS}/toolchains/windows.cmake")\r | |
111 | endif()\r | |
112 | include("${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}")\r | |
113 | # Set needed env\r | |
114 | set(ENV{PATH} "$ENV{PATH};${NMAKE_EXE_PATH}")\r | |
115 | set(ENV{INCLUDE} "${CURRENT_INSTALLED_DIR}/include;$ENV{INCLUDE}")\r | |
116 | # Set make command and install command\r | |
117 | set(MAKE ${NMAKE} /NOLOGO /G /U)\r | |
118 | set(MAKE_OPTS_BASE -f ${MAKEFILE_NAME})\r | |
119 | if (_bn_ENABLE_INSTALL)\r | |
120 | set(INSTALL_COMMAND install)\r | |
121 | endif()\r | |
122 | if (_bn_TARGET)\r | |
123 | set(MAKE_OPTS_BASE ${MAKE_OPTS_BASE} ${_bn_TARGET} ${INSTALL_COMMAND})\r | |
124 | else()\r | |
125 | set(MAKE_OPTS_BASE ${MAKE_OPTS_BASE} all ${INSTALL_COMMAND})\r | |
126 | endif()\r | |
127 | # Add subpath to work directory\r | |
128 | if (_bn_PROJECT_SUBPATH)\r | |
129 | set(_bn_PROJECT_SUBPATH /${_bn_PROJECT_SUBPATH})\r | |
130 | else()\r | |
131 | set(_bn_PROJECT_SUBPATH )\r | |
132 | endif()\r | |
133 | \r | |
134 | foreach(BUILDTYPE "debug" "release")\r | |
135 | if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL BUILDTYPE)\r | |
136 | if(BUILDTYPE STREQUAL "debug")\r | |
137 | # Skip debug generate\r | |
138 | if (_bn_NO_DEBUG)\r | |
139 | continue()\r | |
140 | endif()\r | |
141 | # Generate obj dir suffix\r | |
142 | set(SHORT_BUILDTYPE "-dbg")\r | |
143 | set(CONFIG "Debug")\r | |
144 | # Add install command and arguments\r | |
145 | set(MAKE_OPTS ${MAKE_OPTS_BASE})\r | |
146 | if (_bn_ENABLE_INSTALL)\r | |
147 | set(INSTALL_OPTS INSTALLDIR=${CURRENT_PACKAGES_DIR}/debug)\r | |
148 | set(MAKE_OPTS ${MAKE_OPTS} ${INSTALL_OPTS})\r | |
149 | endif()\r | |
150 | set(MAKE_OPTS ${MAKE_OPTS} ${_bn_OPTIONS} ${_bn_OPTIONS_DEBUG})\r | |
151 | \r | |
152 | unset(ENV{CL})\r | |
153 | set(TMP_CL_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG}")\r | |
154 | string(REPLACE "/" "-" TMP_CL_FLAGS "${TMP_CL_FLAGS}")\r | |
155 | set(ENV{CL} "$ENV{CL} ${TMP_CL_FLAGS}")\r | |
156 | else()\r | |
157 | # In NO_DEBUG mode, we only use ${TARGET_TRIPLET} directory.\r | |
158 | if (_bn_NO_DEBUG)\r | |
159 | set(SHORT_BUILDTYPE "")\r | |
160 | else()\r | |
161 | set(SHORT_BUILDTYPE "-rel")\r | |
162 | endif()\r | |
163 | set(CONFIG "Release")\r | |
164 | # Add install command and arguments\r | |
165 | set(MAKE_OPTS ${MAKE_OPTS_BASE})\r | |
166 | if (_bn_ENABLE_INSTALL)\r | |
167 | set(INSTALL_OPTS INSTALLDIR=${CURRENT_PACKAGES_DIR})\r | |
168 | set(MAKE_OPTS ${MAKE_OPTS} ${INSTALL_OPTS})\r | |
169 | endif()\r | |
170 | set(MAKE_OPTS ${MAKE_OPTS} ${_bn_OPTIONS} ${_bn_OPTIONS_RELEASE})\r | |
171 | \r | |
172 | unset(ENV{CL})\r | |
173 | set(TMP_CL_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}")\r | |
174 | string(REPLACE "/" "-" TMP_CL_FLAGS "${TMP_CL_FLAGS}")\r | |
175 | set(ENV{CL} "$ENV{CL} ${TMP_CL_FLAGS}")\r | |
176 | endif()\r | |
177 | \r | |
178 | set(CURRENT_TRIPLET_NAME ${TARGET_TRIPLET}${SHORT_BUILDTYPE})\r | |
179 | set(OBJ_DIR ${CURRENT_BUILDTREES_DIR}/${CURRENT_TRIPLET_NAME})\r | |
180 | \r | |
181 | file(REMOVE_RECURSE ${OBJ_DIR})\r | |
182 | file(MAKE_DIRECTORY ${OBJ_DIR})\r | |
183 | file(GLOB_RECURSE SOURCE_FILES ${_bn_SOURCE_PATH}/*)\r | |
184 | foreach(ONE_SOUCRCE_FILE ${SOURCE_FILES})\r | |
185 | get_filename_component(DST_DIR ${ONE_SOUCRCE_FILE} PATH)\r | |
186 | string(REPLACE "${_bn_SOURCE_PATH}" "${OBJ_DIR}" DST_DIR "${DST_DIR}")\r | |
187 | file(COPY ${ONE_SOUCRCE_FILE} DESTINATION ${DST_DIR})\r | |
188 | endforeach()\r | |
189 | \r | |
190 | if (_bn_PRERUN_SHELL)\r | |
191 | message(STATUS "Prerunning ${CURRENT_TRIPLET_NAME}")\r | |
192 | vcpkg_execute_required_process(\r | |
193 | COMMAND ${_bn_PRERUN_SHELL}\r | |
194 | WORKING_DIRECTORY ${OBJ_DIR}${_bn_PROJECT_SUBPATH}\r | |
195 | LOGNAME "$prerun-${CURRENT_TRIPLET_NAME}"\r | |
196 | )\r | |
197 | endif()\r | |
198 | if (BUILDTYPE STREQUAL "debug" AND _bn_PRERUN_SHELL_DEBUG)\r | |
199 | message(STATUS "Prerunning ${CURRENT_TRIPLET_NAME}")\r | |
200 | vcpkg_execute_required_process(\r | |
201 | COMMAND ${_bn_PRERUN_SHELL_DEBUG}\r | |
202 | WORKING_DIRECTORY ${OBJ_DIR}${_bn_PROJECT_SUBPATH}\r | |
203 | LOGNAME "prerun-${CURRENT_TRIPLET_NAME}-dbg"\r | |
204 | )\r | |
205 | endif()\r | |
206 | if (BUILDTYPE STREQUAL "release" AND _bn_PRERUN_SHELL_RELEASE)\r | |
207 | message(STATUS "Prerunning ${CURRENT_TRIPLET_NAME}")\r | |
208 | vcpkg_execute_required_process(\r | |
209 | COMMAND ${_bn_PRERUN_SHELL_RELEASE}\r | |
210 | WORKING_DIRECTORY ${OBJ_DIR}${_bn_PROJECT_SUBPATH}\r | |
211 | LOGNAME "prerun-${CURRENT_TRIPLET_NAME}-rel"\r | |
212 | )\r | |
213 | endif()\r | |
214 | \r | |
215 | if (NOT _bn_ENABLE_INSTALL)\r | |
216 | message(STATUS "Building ${CURRENT_TRIPLET_NAME}")\r | |
217 | else()\r | |
218 | message(STATUS "Building and installing ${CURRENT_TRIPLET_NAME}")\r | |
219 | endif()\r | |
220 | \r | |
221 | vcpkg_execute_build_process(\r | |
222 | COMMAND ${MAKE} ${MAKE_OPTS}\r | |
223 | WORKING_DIRECTORY ${OBJ_DIR}${_bn_PROJECT_SUBPATH}\r | |
224 | LOGNAME "${_bn_LOGFILE_ROOT}-${CURRENT_TRIPLET_NAME}"\r | |
225 | )\r | |
226 | \r | |
227 | if(_bn_ADD_BIN_TO_PATH)\r | |
228 | set(ENV{PATH} "${_BACKUP_ENV_PATH}")\r | |
229 | endif()\r | |
230 | endif()\r | |
231 | endforeach()\r | |
232 | endfunction()\r |