Skip to content

Commit a9069d2

Browse files
committed
Fix win build
1 parent 488d4c3 commit a9069d2

13 files changed

Lines changed: 746 additions & 14 deletions

File tree

.github/scripts/build-and-test.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ find . -name '*.lo' -o -name '*.o' | xargs rm -f 2>/dev/null || true
6767
find . -name '.libs' -type d | xargs rm -rf 2>/dev/null || true
6868

6969
phpize
70-
./configure --with-php-config="$(which php-config)" "$CONFIGURE_LIBARCHIVE"
70+
./configure --with-php-config="$(which php-config)" "$CONFIGURE_LIBARCHIVE" ${EXTRA_CONFIGURE_FLAGS:-}
7171
make -f Makefile -j"$(nproc)"
7272

7373
# ── Test ──────────────────────────────────────────────────────────────────────

.github/workflows/tests.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ jobs:
134134
uses: actions/cache@v4
135135
with:
136136
path: C:\vcpkg\installed\x64-windows-static-md
137-
key: vcpkg-x64-windows-static-md-libarchive-v1
137+
key: vcpkg-x64-windows-static-md-libarchive-cng-v1
138138

139139
- name: Install libarchive via vcpkg
140140
if: steps.vcpkg-cache.outputs.cache-hit != 'true'
@@ -147,6 +147,7 @@ jobs:
147147
C:\vcpkg\vcpkg.exe install libarchive `
148148
--triplet x64-windows-static-md `
149149
--overlay-triplets="$tripletDir" `
150+
--overlay-ports="${{ github.workspace }}\.vcpkg-overlay" `
150151
--vcpkg-root C:\vcpkg
151152
152153
- name: Build and test
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
diff --git a/CMakeLists.txt b/CMakeLists.txt
2+
index 2917839..6cf7cec 100644
3+
--- a/CMakeLists.txt
4+
+++ b/CMakeLists.txt
5+
@@ -411,6 +411,7 @@ IF(WIN32 AND NOT CMAKE_CL_64 AND NOT CYGWIN)
6+
SET(__GNUWIN32PATH "C:/Program Files/GnuWin32")
7+
ENDIF(WIN32 AND NOT CMAKE_CL_64 AND NOT CYGWIN)
8+
IF(DEFINED __GNUWIN32PATH AND EXISTS "${__GNUWIN32PATH}")
9+
+ELSEIF(0)
10+
# You have to add a path available DLL file into PATH environment variable.
11+
# Maybe DLL path is "C:/Program Files/GnuWin32/bin".
12+
# The zlib and the bzip2 Setup program have installed programs and DLLs into
13+
diff --git a/libarchive/CMakeLists.txt b/libarchive/CMakeLists.txt
14+
index fd997db..415bd89 100644
15+
--- a/libarchive/CMakeLists.txt
16+
+++ b/libarchive/CMakeLists.txt
17+
@@ -273,11 +273,12 @@ IF(ENABLE_INSTALL)
18+
RUNTIME DESTINATION bin
19+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
20+
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
21+
- ENDIF(BUILD_SHARED_LIBS)
22+
+ ELSE()
23+
INSTALL(TARGETS archive_static
24+
RUNTIME DESTINATION bin
25+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
26+
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
27+
+ ENDIF(BUILD_SHARED_LIBS)
28+
INSTALL_MAN(${libarchive_MANS})
29+
INSTALL(FILES ${include_HEADERS} DESTINATION include)
30+
ENDIF()
Lines changed: 259 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,259 @@
1+
diff --git a/CMakeLists.txt b/CMakeLists.txt
2+
index 38664d2..d0882b2 100644
3+
--- a/CMakeLists.txt
4+
+++ b/CMakeLists.txt
5+
@@ -439,6 +439,8 @@ IF(0)
6+
ENDIF(DEFINED __GNUWIN32PATH AND EXISTS "${__GNUWIN32PATH}")
7+
8+
SET(ADDITIONAL_LIBS "")
9+
+SET(LIBARCHIVE_LIBS_PRIVATE "") # additional libs for which the pc module is unknown
10+
+SET(LIBSREQUIRED "") # pc modules for additonal libs
11+
#
12+
# Find ZLIB
13+
#
14+
@@ -455,6 +457,7 @@ IF(ZLIB_FOUND)
15+
SET(HAVE_ZLIB_H 1)
16+
INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIR})
17+
LIST(APPEND ADDITIONAL_LIBS ${ZLIB_LIBRARIES})
18+
+ STRING(APPEND LIBSREQUIRED " zlib")
19+
IF(WIN32 AND NOT CYGWIN)
20+
#
21+
# Test if ZLIB_WINAPI macro is needed to use.
22+
@@ -494,6 +497,7 @@ IF(BZIP2_FOUND)
23+
SET(HAVE_BZLIB_H 1)
24+
INCLUDE_DIRECTORIES(${BZIP2_INCLUDE_DIR})
25+
LIST(APPEND ADDITIONAL_LIBS ${BZIP2_LIBRARIES})
26+
+ STRING(APPEND LIBSREQUIRED " bzip2")
27+
# Test if a macro is needed for the library.
28+
TRY_MACRO_FOR_LIBRARY(
29+
"${BZIP2_INCLUDE_DIR}" "${BZIP2_LIBRARIES}"
30+
@@ -522,6 +526,8 @@ ENDIF()
31+
IF(LIBLZMA_FOUND)
32+
SET(HAVE_LIBLZMA 1)
33+
SET(HAVE_LZMA_H 1)
34+
+ LIST(APPEND ADDITIONAL_LIBS LibLZMA::LibLZMA)
35+
+ STRING(APPEND LIBSREQUIRED " liblzma")
36+
CMAKE_PUSH_CHECK_STATE()
37+
SET(CMAKE_REQUIRED_INCLUDES ${LIBLZMA_INCLUDE_DIR})
38+
SET(CMAKE_REQUIRED_LIBRARIES ${LIBLZMA_LIBRARIES})
39+
@@ -569,6 +575,7 @@ IF(LZO2_FOUND)
40+
SET(HAVE_LZO_LZO1X_H 1)
41+
INCLUDE_DIRECTORIES(${LZO2_INCLUDE_DIR})
42+
LIST(APPEND ADDITIONAL_LIBS ${LZO2_LIBRARY})
43+
+ STRING(APPEND LIBSREQUIRED " lzo2")
44+
#
45+
# TODO: test for static library.
46+
#
47+
@@ -598,6 +605,7 @@ IF(LIBB2_FOUND)
48+
SET(ARCHIVE_BLAKE2 FALSE)
49+
LIST(APPEND ADDITIONAL_LIBS ${LIBB2_LIBRARY})
50+
INCLUDE_DIRECTORIES(${LIBB2_INCLUDE_DIR})
51+
+ LIST(APPEND LIBARCHIVE_LIBS_PRIVATE ${LIBB2_LIBRARY})
52+
CMAKE_PUSH_CHECK_STATE()
53+
SET(CMAKE_REQUIRED_LIBRARIES ${LIBB2_LIBRARY})
54+
SET(CMAKE_REQUIRED_INCLUDES ${LIBB2_INCLUDE_DIR})
55+
@@ -615,6 +623,8 @@ ENDIF(LIBB2_FOUND)
56+
# Find LZ4
57+
#
58+
IF(ENABLE_LZ4)
59+
+ FIND_PACKAGE(LZ4 NAMES lz4 CONFIG REQUIRED)
60+
+elseif(0)
61+
IF (LZ4_INCLUDE_DIR)
62+
# Already in cache, be silent
63+
SET(LZ4_FIND_QUIETLY TRUE)
64+
@@ -630,6 +640,10 @@ ENDIF(ENABLE_LZ4)
65+
IF(LZ4_FOUND)
66+
SET(HAVE_LIBLZ4 1)
67+
SET(HAVE_LZ4_H 1)
68+
+ SET(HAVE_LZ4HC_H 1)
69+
+ LIST(APPEND ADDITIONAL_LIBS lz4::lz4)
70+
+ STRING(APPEND LIBSREQUIRED " liblz4")
71+
+elseif(0)
72+
CMAKE_PUSH_CHECK_STATE() # Save the state of the variables
73+
SET(CMAKE_REQUIRED_INCLUDES ${LZ4_INCLUDE_DIR})
74+
CHECK_INCLUDE_FILES("lz4hc.h" HAVE_LZ4HC_H)
75+
@@ -646,6 +660,8 @@ MARK_AS_ADVANCED(CLEAR LZ4_LIBRARY)
76+
# Find Zstd
77+
#
78+
IF(ENABLE_ZSTD)
79+
+ FIND_PACKAGE(ZSTD NAMES zstd CONFIG REQUIRED)
80+
+elseif(0)
81+
IF (ZSTD_INCLUDE_DIR)
82+
# Already in cache, be silent
83+
SET(ZSTD_FIND_QUIETLY TRUE)
84+
@@ -665,6 +681,11 @@ ELSE(ENABLE_ZSTD)
85+
ENDIF(ENABLE_ZSTD)
86+
IF(ZSTD_FOUND)
87+
SET(HAVE_ZSTD_H 1)
88+
+ SET(HAVE_LIBZSTD 1)
89+
+ SET(HAVE_ZSTD_compressStream 1)
90+
+ LIST(APPEND ADDITIONAL_LIBS zstd::libzstd)
91+
+ STRING(APPEND LIBSREQUIRED " libzstd")
92+
+elseif(0)
93+
INCLUDE_DIRECTORIES(${ZSTD_INCLUDE_DIR})
94+
LIST(APPEND ADDITIONAL_LIBS ${ZSTD_LIBRARY})
95+
CMAKE_PUSH_CHECK_STATE()
96+
@@ -774,6 +795,7 @@ IF(ENABLE_CNG)
97+
LA_CHECK_INCLUDE_FILE("bcrypt.h" HAVE_BCRYPT_H)
98+
IF(HAVE_BCRYPT_H)
99+
LIST(APPEND ADDITIONAL_LIBS "bcrypt")
100+
+ LIST(APPEND LIBARCHIVE_LIBS_PRIVATE "bcrypt")
101+
ENDIF(HAVE_BCRYPT_H)
102+
ELSE(ENABLE_CNG)
103+
UNSET(HAVE_BCRYPT_H CACHE)
104+
@@ -805,6 +827,7 @@ IF(ENABLE_MBEDTLS)
105+
IF(MBEDTLS_FOUND)
106+
SET(HAVE_LIBMBEDCRYPTO 1)
107+
LIST(APPEND ADDITIONAL_LIBS ${MBEDCRYPTO_LIBRARY})
108+
+ LIST(APPEND LIBARCHIVE_LIBS_PRIVATE ${MBEDCRYPTO_LIBRARY})
109+
INCLUDE_DIRECTORIES(${MBEDTLS_INCLUDE_DIRS})
110+
111+
LIST(APPEND CMAKE_REQUIRED_INCLUDES ${MBEDTLS_INCLUDE_DIRS})
112+
@@ -825,6 +848,7 @@ IF(ENABLE_NETTLE)
113+
IF(NETTLE_FOUND)
114+
SET(HAVE_LIBNETTLE 1)
115+
LIST(APPEND ADDITIONAL_LIBS ${NETTLE_LIBRARIES})
116+
+ STRING(APPEND LIBSREQUIRED " nettle")
117+
INCLUDE_DIRECTORIES(${NETTLE_INCLUDE_DIR})
118+
119+
LIST(APPEND CMAKE_REQUIRED_INCLUDES ${NETTLE_INCLUDE_DIR})
120+
@@ -848,8 +872,8 @@ IF(ENABLE_OPENSSL AND NOT CMAKE_SYSTEM_NAME MATCHES "Darwin")
121+
FIND_PACKAGE(OpenSSL)
122+
IF(OPENSSL_FOUND)
123+
SET(HAVE_LIBCRYPTO 1)
124+
- INCLUDE_DIRECTORIES(${OPENSSL_INCLUDE_DIR})
125+
- LIST(APPEND ADDITIONAL_LIBS ${OPENSSL_CRYPTO_LIBRARY})
126+
+ LIST(APPEND ADDITIONAL_LIBS OpenSSL::Crypto)
127+
+ STRING(APPEND LIBSREQUIRED " libcrypto")
128+
SET(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
129+
SET(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
130+
LA_CHECK_INCLUDE_FILE("openssl/evp.h" HAVE_OPENSSL_EVP_H)
131+
@@ -868,6 +892,7 @@ IF(NOT OPENSSL_FOUND)
132+
SET(CMAKE_REQUIRED_LIBRARIES "md")
133+
FIND_LIBRARY(LIBMD_LIBRARY NAMES md)
134+
LIST(APPEND ADDITIONAL_LIBS ${LIBMD_LIBRARY})
135+
+ LIST(APPEND LIBARCHIVE_LIBS_PRIVATE ${LIBMD_LIBRARY})
136+
CMAKE_POP_CHECK_STATE() # Restore the state of the variables
137+
ENDIF(LIBMD_FOUND)
138+
ENDIF(NOT OPENSSL_FOUND)
139+
@@ -981,7 +1006,7 @@ main(int argc, char **argv)
140+
IF ("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND OPENSSL_FOUND)
141+
INCLUDE_DIRECTORIES(${OPENSSL_INCLUDE_DIR})
142+
LIST(APPEND ADDITIONAL_LIBS ${OPENSSL_LIBRARIES})
143+
- LIST(REMOVE_DUPLICATES ADDITIONAL_LIBS)
144+
+ STRING(APPEND LIBSREQUIRED " libssl")
145+
ENDIF ("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND OPENSSL_FOUND)
146+
ENDIF (ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION})
147+
ENDIF(NOT ARCHIVE_CRYPTO_${ALGORITHM})
148+
@@ -1155,6 +1180,7 @@ IF(ENABLE_ICONV)
149+
IF (HAVE_ICONV)
150+
SET(HAVE_LIBICONV 1)
151+
LIST(APPEND ADDITIONAL_LIBS ${LIBICONV_PATH})
152+
+ LIST(APPEND LIBARCHIVE_LIBS_PRIVATE ${LIBICONV_PATH})
153+
ENDIF(HAVE_ICONV)
154+
ENDIF(NOT HAVE_ICONV AND LIBICONV_PATH)
155+
ENDIF(ICONV_INCLUDE_DIR)
156+
@@ -1188,6 +1214,7 @@ IF(ENABLE_ICONV)
157+
ENDIF(WIN32 AND NOT CYGWIN)
158+
IF(HAVE_LOCALE_CHARSET)
159+
LIST(APPEND ADDITIONAL_LIBS ${LIBCHARSET_PATH})
160+
+ LIST(APPEND LIBARCHIVE_LIBS_PRIVATE ${LIBCHARSET_PATH})
161+
ENDIF(HAVE_LOCALE_CHARSET)
162+
ENDIF(LIBCHARSET_PATH)
163+
ENDIF(LIBICONV_PATH)
164+
@@ -1222,6 +1249,7 @@ IF(LIBXML2_FOUND)
165+
CMAKE_PUSH_CHECK_STATE() # Save the state of the variables
166+
INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR})
167+
LIST(APPEND ADDITIONAL_LIBS ${LIBXML2_LIBRARIES})
168+
+ STRING(APPEND LIBSREQUIRED " libxml-2.0")
169+
SET(HAVE_LIBXML2 1)
170+
# libxml2's include files use iconv.h
171+
SET(CMAKE_REQUIRED_INCLUDES ${ICONV_INCLUDE_DIR} ${LIBXML2_INCLUDE_DIR})
172+
@@ -1252,6 +1280,7 @@ ELSE(LIBXML2_FOUND)
173+
CMAKE_PUSH_CHECK_STATE() # Save the state of the variables
174+
INCLUDE_DIRECTORIES(${EXPAT_INCLUDE_DIR})
175+
LIST(APPEND ADDITIONAL_LIBS ${EXPAT_LIBRARIES})
176+
+ STRING(APPEND LIBSREQUIRED " expat")
177+
SET(HAVE_LIBEXPAT 1)
178+
LA_CHECK_INCLUDE_FILE("expat.h" HAVE_EXPAT_H)
179+
CMAKE_POP_CHECK_STATE() # Restore the state of the variables
180+
@@ -1272,6 +1301,7 @@ ELSE(LIBXML2_FOUND)
181+
IF(HAVE_XMLLITE_H)
182+
SET(XMLLITE_FOUND TRUE)
183+
LIST(APPEND ADDITIONAL_LIBS "xmllite" "uuid")
184+
+ LIST(APPEND LIBARCHIVE_LIBS_PRIVATE xmllite uuid)
185+
ENDIF()
186+
ENDIF()
187+
ENDIF(EXPAT_FOUND)
188+
@@ -1301,6 +1331,7 @@ IF(POSIX_REGEX_LIB MATCHES "^(AUTO|LIBC|LIBREGEX)$")
189+
CHECK_FUNCTION_EXISTS_GLIBC(regcomp HAVE_REGCOMP_LIBREGEX)
190+
IF(HAVE_REGCOMP_LIBREGEX)
191+
LIST(APPEND ADDITIONAL_LIBS ${REGEX_LIBRARY})
192+
+ LIST(APPEND LIBARCHIVE_LIBS_PRIVATE ${REGEX_LIBRARY})
193+
#
194+
# If regex.h is not found, retry looking for regex.h at
195+
# REGEX_INCLUDE_DIR
196+
@@ -1350,6 +1381,7 @@ IF(NOT FOUND_POSIX_REGEX_LIB AND POSIX_REGEX_LIB MATCHES "^(AUTO|LIBPCREPOSIX)$"
197+
IF(PCREPOSIX_FOUND)
198+
INCLUDE_DIRECTORIES(${PCRE_INCLUDE_DIR})
199+
LIST(APPEND ADDITIONAL_LIBS ${PCREPOSIX_LIBRARIES})
200+
+ LIST(APPEND LIBARCHIVE_LIBS_PRIVATE ${PCREPOSIX_LIBRARIES})
201+
# Test if a macro is needed for the library.
202+
TRY_MACRO_FOR_LIBRARY(
203+
"${PCRE_INCLUDE_DIR}" "${PCREPOSIX_LIBRARIES}"
204+
@@ -1361,6 +1393,7 @@ IF(NOT FOUND_POSIX_REGEX_LIB AND POSIX_REGEX_LIB MATCHES "^(AUTO|LIBPCREPOSIX)$"
205+
ELSEIF(NOT WITHOUT_PCRE_STATIC AND NOT PCRE_STATIC AND PCRE_FOUND)
206+
# Determine if pcre static libraries are to be used.
207+
LIST(APPEND ADDITIONAL_LIBS ${PCRE_LIBRARIES})
208+
+ LIST(APPEND LIBARCHIVE_LIBS_PRIVATE ${PCRE_LIBRARIES})
209+
SET(TMP_LIBRARIES ${PCREPOSIX_LIBRARIES} ${PCRE_LIBRARIES})
210+
MESSAGE(STATUS "trying again with -lpcre included")
211+
TRY_MACRO_FOR_LIBRARY(
212+
@@ -1376,6 +1409,7 @@ IF(NOT FOUND_POSIX_REGEX_LIB AND POSIX_REGEX_LIB MATCHES "^(AUTO|LIBPCREPOSIX)$"
213+
# ___chkstk_ms.
214+
MESSAGE(STATUS "Visual Studio build detected, trying again with -lgcc included")
215+
LIST(APPEND ADDITIONAL_LIBS ${LIBGCC_LIBRARIES})
216+
+ LIST(APPEND LIBARCHIVE_LIBS_PRIVATE ${LIBGCC_LIBRARIES})
217+
SET(TMP_LIBRARIES ${PCREPOSIX_LIBRARIES} ${PCRE_LIBRARIES} ${LIBGCC_LIBRARIES})
218+
TRY_MACRO_FOR_LIBRARY(
219+
"${PCRE_INCLUDE_DIR}" "${TMP_LIBRARIES}"
220+
@@ -1954,6 +1988,7 @@ IF(ENABLE_ACL)
221+
SET(CMAKE_REQUIRED_LIBRARIES "acl")
222+
FIND_LIBRARY(ACL_LIBRARY NAMES acl)
223+
LIST(APPEND ADDITIONAL_LIBS ${ACL_LIBRARY})
224+
+ LIST(APPEND LIBARCHIVE_LIBS_PRIVATE ${ACL_LIBRARY})
225+
pkg_check_modules(LIBACL libacl)
226+
IF(LIBACL_VERSION)
227+
SET(LIBACL_PKGCONFIG_VERSION ${LIBACL_VERSION})
228+
@@ -2099,6 +2134,7 @@ int main(void) { return ACL_SYNCHRONIZE; }" HAVE_DECL_ACL_SYNCHRONIZE)
229+
SET(CMAKE_REQUIRED_LIBRARIES "richacl")
230+
FIND_LIBRARY(RICHACL_LIBRARY NAMES richacl)
231+
LIST(APPEND ADDITIONAL_LIBS ${RICHACL_LIBRARY})
232+
+ LIST(APPEND LIBARCHIVE_LIBS_PRIVATE ${RICHACL_LIBRARY})
233+
pkg_check_modules(LIBRICHACL librichacl)
234+
IF(LIBRICHACL_VERSION)
235+
SET(LIBRICHACL_PKGCONFIG_VERSION ${LIBRICHACL_VERSION})
236+
diff --git a/build/cmake/CreatePkgConfigFile.cmake b/build/cmake/CreatePkgConfigFile.cmake
237+
index bc5a43f..422b83b 100644
238+
--- a/build/cmake/CreatePkgConfigFile.cmake
239+
+++ b/build/cmake/CreatePkgConfigFile.cmake
240+
@@ -8,7 +8,7 @@ SET(libdir \${exec_prefix}/lib)
241+
SET(includedir \${prefix}/include)
242+
# Now, this is not particularly pretty, nor is it terribly accurate...
243+
# Loop over all our additional libs
244+
-FOREACH(mylib ${ADDITIONAL_LIBS})
245+
+FOREACH(mylib ${LIBARCHIVE_LIBS_PRIVATE})
246+
# Extract the filename from the absolute path
247+
GET_FILENAME_COMPONENT(mylib_name ${mylib} NAME_WE)
248+
# Strip the lib prefix
249+
@@ -16,10 +16,6 @@ FOREACH(mylib ${ADDITIONAL_LIBS})
250+
# Append it to our LIBS string
251+
SET(LIBS "${LIBS} -l${mylib_name}")
252+
ENDFOREACH()
253+
-# libxml2 is easier, since it's already using pkg-config
254+
-FOREACH(mylib ${PC_LIBXML_STATIC_LDFLAGS})
255+
- SET(LIBS "${LIBS} ${mylib}")
256+
-ENDFOREACH()
257+
# FIXME: The order of the libraries doesn't take dependencies into account,
258+
# thus there's a good chance it'll make some binutils versions unhappy...
259+
# This only affects Libs.private (looked up for static builds) though.

0 commit comments

Comments
 (0)