aboutsummaryrefslogtreecommitdiff
path: root/vcpkg/ports/nss/portfile.cmake
blob: a0140c610f5350cd0f9d755a1ff3641c1197507e (plain)
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
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
# - The static lib is named "ssl", conflicting with the "ssl" lib from openssl.
# - The tools use the shared libs.
# - The pkgconfig file refers to "ssl3"
# - Linux distros don't install the static lib.
# (Renaming the static lib to "ssl3" might be an alternative solution.)
vcpkg_check_linkage(ONLY_DYNAMIC_LIBRARY)

string(REPLACE "." "_" V_URL ${VERSION})

vcpkg_download_distfile(ARCHIVE
    URLS "https://ftp.mozilla.org/pub/security/nss/releases/NSS_${V_URL}_RTM/src/nss-${VERSION}.tar.gz"
    FILENAME "nss-${VERSION}.tar.gz"
    SHA512 5ffb1182e7d65f8895c09656d20bc7146d1616cd4f09046469b2f79f60b57083094c78da39a3f3faa5087742a19f706ce9e7928a662f9f0d3c410514cba2028f
)

vcpkg_extract_source_archive(
    SOURCE_PATH
    ARCHIVE "${ARCHIVE}"
    SOURCE_BASE "${VERSION}"
    PATCHES
        "02-gen-debug-info-for-release.patch"
        "03-use-debug-crt-for-debug.patch" # See https://learn.microsoft.com/dotnet/api/microsoft.visualstudio.vcprojectengine.runtimelibraryoption
        include-dirs.diff
)
file(GLOB devendor "${SOURCE_PATH}/nss/lib/sqlite/*.?" "${SOURCE_PATH}/nss/lib/zlib/*.?")
file(REMOVE ${devendor})
file(COPY "${CURRENT_PORT_DIR}/configure" DESTINATION "${SOURCE_PATH}")

function(download_distfile var url sha512)
    string(REGEX REPLACE ".*/" "" filename "${url}")
    vcpkg_download_distfile(archive
        URLS "${url}"
        FILENAME "${filename}"
        SHA512 "${sha512}"
    )
    set("${var}" "${archive}" PARENT_SCOPE)
endfunction()

download_distfile(gyp_next
    "https://files.pythonhosted.org/packages/37/3e/d920a254ad927c942a541388c84dd1af0db1af6f6c2b96e99d9ec3f3a148/gyp_next-0.20.2-py3-none-any.whl"
    53feff516d0de8738910e04e4e5664af27947c0a2bca856c290f9082d18678b03e917403e2c842edb62b6dd5412c625f34edb52d6d9b295c07ef34b3c18981f8
)
download_distfile(packaging
    "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl"
    a726fb46cce24f781fc8b55a3e6dea0a884ebc3b2b400ea74aa02333699f4955a5dc1e2ec5927ac72f35a624401f3f3b442882ba1cc4cadaf9c88558b5b8bdae
)
download_distfile(setuptools
    "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl"
    2a0420f7faaa33d2132b82895a8282688030e939db0225ad8abb95a47bdb87b45318f10985fc3cee271a9121441c1526caa363d7f2e4a4b18b1a674068766e87
)
x_vcpkg_get_python_packages(
    OUT_PYTHON_VAR PYTHON3
    PYTHON_VERSION 3
    PACKAGES "${gyp_next}" "${packaging}" "${setuptools}"
)
cmake_path(GET PYTHON3 PARENT_PATH GYP_NEXT_ROOT)

# Prepend to PATH in controlled order
vcpkg_find_acquire_program(NINJA)
get_filename_component(NINJA_ROOT "${NINJA}" DIRECTORY)
vcpkg_add_to_path(PREPEND "${NINJA_ROOT}")

find_program(GYP_NEXT NAMES gyp PATHS "${GYP_NEXT_ROOT}" NO_DEFAULT_PATH REQUIRED)
message(STATUS "Using ${GYP_NEXT}")
vcpkg_add_to_path(PREPEND "${GYP_NEXT_ROOT}")

# setup build.sh options -- see help.txt in nss root
set(OPTIONS "")
if(VCPKG_TARGET_IS_ANDROID)
    list(APPEND OPTIONS "-DOS=android")
elseif(VCPKG_TARGET_IS_FREEBSD)
    list(APPEND OPTIONS "-DOS=freebsd")
elseif(VCPKG_TARGET_IS_IOS)
    list(APPEND OPTIONS "-DOS=ios")
elseif(VCPKG_TARGET_IS_LINUX)
    list(APPEND OPTIONS "-DOS=linux")
elseif(VCPKG_TARGET_IS_OSX)
    list(APPEND OPTIONS "-DOS=mac")
elseif(VCPKG_TARGET_IS_OPENBSD)
    list(APPEND OPTIONS "-DOS=openbsd")
elseif(VCPKG_TARGET_IS_WINDOWS)
    list(APPEND OPTIONS "-DOS=win")
elseif(VCPKG_CROSSCOMPILING)
    message(WARNING "Cannot determine OS setting for ${TARGET_TRIPLET}")
endif()

if(VCPKG_TARGET_ARCHITECTURE STREQUAL "x86")
    list(APPEND OPTIONS "--target=ia32")
else()
    list(APPEND OPTIONS "--target=${VCPKG_TARGET_ARCHITECTURE}")
endif()

function(cygpath_u out_var input) # equivalent to cygpath -u
    string(REGEX REPLACE "^([a-zA-Z]):/" "/\\1/" input "${input}")
    set("${out_var}" "${input}" PARENT_SCOPE)
endfunction()

if(CMAKE_HOST_WIN32 AND VCPKG_TARGET_IS_WINDOWS AND NOT VCPKG_TARGET_IS_MINGW)
    vcpkg_cmake_get_vars(cmake_vars_file)
    include("${cmake_vars_file}")
    if(VCPKG_DETECTED_MSVC)
        list(APPEND OPTIONS "--msvc")
        set(ENV{PYTHONUTF8} 1)

        # vswhere needed in PATH
        cmake_path(SET vswhere "$ENV{ProgramFiles\(x86\)}/Microsoft Visual Studio/Installer/vswhere.exe")
        if(NOT EXISTS "${vswhere}")
            vcpkg_execute_in_download_mode(
                COMMAND "$ENV{VCPKG_COMMAND}" fetch vswhere --x-stderr-status
                OUTPUT_VARIABLE vswhere
                RESULT_VARIABLE error_code
                OUTPUT_STRIP_TRAILING_WHITESPACE
                WORKING_DIRECTORY "${DOWNLOADS}"
            )
            if(NOT error_code STREQUAL "0")
                message(FATAL_ERROR "Failed to fetch vswhere.")
            endif()
            string(REGEX REPLACE "^.*\n *" "" vswhere "${vswhere}")
        endif()
        message(STATUS "Using ${vswhere}")
        cmake_path(GET vswhere PARENT_PATH vswhere_dir)
        vcpkg_host_path_list(APPEND ENV{PATH} "${vswhere_dir}")

        # Set GYP_MSVS_OVERRIDE_PATH and GYP_MSVS_VERSION for actual cl.exe
        if("$ENV{GYP_MSVS_OVERRIDE_PATH}" STREQUAL "" OR "$ENV{GYP_MSVS_VERSION}" STREQUAL "")
            execute_process(
                COMMAND "${vswhere}"
                    -nologo
                    -property resolvedInstallationPath
                    -path "${VCPKG_DETECTED_CMAKE_C_COMPILER}"
                OUTPUT_VARIABLE msvs_installdir
                OUTPUT_STRIP_TRAILING_WHITESPACE
            )
            message(STATUS "MSVS resolvedInstallationPath: ${msvs_installdir}")
            if(NOT EXISTS "${msvs_installdir}")
                message(FATAL_ERROR "Failed to determine MSVS dir for ${VCPKG_DETECTED_CMAKE_C_COMPILER}.")
            endif()
            cygpath_u(vspath "${msvs_installdir}")
            set(ENV{VSPATH} "${vspath}")
            set(ENV{GYP_MSVS_OVERRIDE_PATH} "${vspath}")

            execute_process(
                COMMAND "${vswhere}"
                    -nologo
                    -property catalog_productLineVersion
                    -path "${VCPKG_DETECTED_CMAKE_C_COMPILER}"
                OUTPUT_VARIABLE msvs_version
                OUTPUT_STRIP_TRAILING_WHITESPACE
            )
            message(STATUS "MSVS catalog_productLineVersion: ${msvs_version}")
            if(NOT msvs_version MATCHES "^20..e?\$")
                message(FATAL_ERROR "Failed to determine MSVS version for ${VCPKG_DETECTED_CMAKE_C_COMPILER}.")
            endif()
            set(ENV{GYP_MSVS_VERSION} "${msvs_version}")
        endif()
    endif()
endif()

x_vcpkg_pkgconfig_get_modules(PREFIX PC_NSPR MODULES nspr CFLAGS LIBS)
x_vcpkg_pkgconfig_get_modules(PREFIX PC_SQLITE MODULES sqlite3 CFLAGS LIBS)
x_vcpkg_pkgconfig_get_modules(PREFIX PC_ZLIB MODULES zlib CFLAGS LIBS)
# Produce absolute include dirs and library dirs filepaths.
# Manually managing MSVC syntax because gyp converts foo.lib as if it were a relative path.
foreach(key IN ITEMS NSPR_CFLAGS_RELEASE SQLITE_CFLAGS_RELEASE ZLIB_CFLAGS_RELEASE)
    separate_arguments(cflags UNIX_COMMAND "${PC_${key}}")
    string(REPLACE "CFLAGS_RELEASE" "INCLUDE_DIRS" out_var "${key}")
    set(${out_var} "")
    foreach(item IN LISTS cflags)
        if(item MATCHES "^-I(.*)")
            cmake_path(SET dir NORMALIZE "${CMAKE_MATCH_1}")
            if(CMAKE_HOST_WIN32)
                cygpath_u(dir "${dir}")
            else()
            endif()
            list(APPEND ${out_var} "${dir}")
        endif()
    endforeach()
    list(JOIN ${key}_INCLUDE_DIRS ":" ${key}_INCLUDE_DIRS)
endforeach()
foreach(out_var IN ITEMS NSPR_LIBS_RELEASE NSPR_LIBS_DEBUG SQLITE_LIBS_RELEASE SQLITE_LIBS_DEBUG ZLIB_LIBS_RELEASE ZLIB_LIBS_DEBUG)
    separate_arguments(libs UNIX_COMMAND "${PC_${out_var}}")
    set(${out_var} "")
    foreach(item IN LISTS libs)
        if(item MATCHES "^-L(.*)")
            cmake_path(SET dir NORMALIZE "${CMAKE_MATCH_1}")
            if(CMAKE_HOST_WIN32)
                cygpath_u(dir "${dir}")
            endif()
            if(VCPKG_DETECTED_MSVC)
                list(APPEND ${out_var} "-LIBPATH:${dir}")
            else()
                list(APPEND ${out_var} "-L${dir}")
            endif()
        elseif(item MATCHES "^-l(.*)")
            list(APPEND ${out_var} "${item}")
        endif()
    endforeach()
endforeach()

# configuring and building in an autotools-like environment, but using gyp-next and ninja
vcpkg_make_configure(
    SOURCE_PATH "${SOURCE_PATH}"
    COPY_SOURCE
    DISABLE_DEFAULT_OPTIONS
    DISABLE_MSVC_WRAPPERS
    DISABLE_MSVC_TRANSFORMATIONS
    OPTIONS
        -g
        -v
        -j "${VCPKG_CONCURRENCY}"
        ${OPTIONS}
        -Ddisable_tests=1
        -Ddisable_werror=1
        -Dsign_libs=0
        -Duse_system_sqlite=1
        -Duse_system_zlib=1
        "--with-nspr=${NSPR_INCLUDE_DIRS}:"
        "-Dsqlite_include_dirs=${SQLITE_INCLUDE_DIRS}"
        "-Dzlib_include_dirs=${ZLIB_INCLUDE_DIRS}"
    OPTIONS_DEBUG
        "-Dnspr_libs=${NSPR_LIBS_DEBUG}"
        "-Dsqlite_libs=${SQLITE_LIBS_DEBUG}"
        "-Dzlib_libs=${ZLIB_LIBS_DEBUG}"
    OPTIONS_RELEASE
        --opt
        "-Dnspr_libs=${NSPR_LIBS_RELEASE}"
        "-Dsqlite_libs=${SQLITE_LIBS_RELEASE}"
        "-Dzlib_libs=${ZLIB_LIBS_RELEASE}"
)

if(NOT VCPKG_BUILD_TYPE)
    set(label "${TARGET_TRIPLET}-dbg")
    set(binary_dir "${CURRENT_BUILDTREES_DIR}/${label}")
    message(STATUS "Installing ${label} ...")
    file(COPY "${binary_dir}/dist/Debug/lib"
        DESTINATION "${CURRENT_PACKAGES_DIR}/debug"
        FILES_MATCHING REGEX "[.](a|dylib|lib|so([.][0-9]+)*)\$"
    )
    file(GLOB runtime_debug "${binary_dir}/dist/Debug/lib/*.dll" "${binary_dir}/dist/Debug/lib/*.pdb")
    if(NOT runtime_debug STREQUAL "")
        file(COPY ${runtime_debug} DESTINATION "${CURRENT_PACKAGES_DIR}/debug/bin")
    endif()
endif()

set(label "${TARGET_TRIPLET}-rel")
set(binary_dir "${CURRENT_BUILDTREES_DIR}/${label}")
message(STATUS "Installing ${label} ...")
file(COPY "${binary_dir}/dist/Release/lib"
    DESTINATION "${CURRENT_PACKAGES_DIR}"
    FILES_MATCHING REGEX "[.](a|dylib|lib|so([.][0-9]+)*)\$"
)
file(GLOB runtime_release "${binary_dir}/dist/Release/lib/*.dll" "${binary_dir}/dist/Release/lib/*.pdb")
if(NOT runtime_release STREQUAL "")
    file(COPY ${runtime_release} DESTINATION "${CURRENT_PACKAGES_DIR}/bin")
endif()

file(COPY "${binary_dir}/dist/public/nss" DESTINATION "${CURRENT_PACKAGES_DIR}/include")
file(COPY "${binary_dir}/dist/private/nss/" DESTINATION "${CURRENT_PACKAGES_DIR}/include/nss/private")

file(READ "${SOURCE_PATH}/nss/pkg/pkg-config/nss.pc.in" pkgconfig)
string(REPLACE "%exec_prefix%" "\${prefix}" pkgconfig "${pkgconfig}")
string(REPLACE "%libdir%" "\${prefix}/lib" pkgconfig "${pkgconfig}")
string(REPLACE "%includedir%" "\${prefix}/include/nss" pkgconfig "${pkgconfig}")
string(REPLACE "%NSS_VERSION%" "${VERSION}" pkgconfig "${pkgconfig}")
string(REPLACE "%NSPR_VERSION%" "4.36" pkgconfig "${pkgconfig}")
string(APPEND pkgconfig "Requires.private: sqlite3\n")
file(WRITE "${CURRENT_PACKAGES_DIR}/lib/pkgconfig/nss.pc" "${pkgconfig}")
if(NOT VCPKG_BUILD_TYPE)
    file(WRITE "${CURRENT_PACKAGES_DIR}/debug/lib/pkgconfig/nss.pc" "${pkgconfig}")
endif()
vcpkg_fixup_pkgconfig()

vcpkg_copy_tools(
    TOOL_NAMES
        "certutil"
        "cmsutil"
        "crlutil"
        "hw-support"
        "modutil"
        "nss"
        "pk12util"
        "pwdecrypt"
        "shlibsign"
        "signtool"
        "signver"
        "ssltap"
        "symkeyutil"
        "validation"
    SEARCH_DIR "${binary_dir}/dist/Release/bin"
    DESTINATION "${CURRENT_PACKAGES_DIR}/tools/${PORT}"
)

vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/nss/COPYING")