Skip to content

Commit

Permalink
[CMake] Simplify CMake handling for zlib
Browse files Browse the repository at this point in the history
Rather than handling zlib handling manually, use find_package from CMake
to find zlib properly. Use this to normalize the LLVM_ENABLE_ZLIB,
HAVE_ZLIB, HAVE_ZLIB_H. Furthermore, require zlib if LLVM_ENABLE_ZLIB is
set to YES, which requires the distributor to explicitly select whether
zlib is enabled or not. This simplifies the CMake handling and usage in
the rest of the tooling.

This is a reland of abb0075 with all followup changes and fixes that
should address issues that were reported in PR44780.

Differential Revision: https://reviews.llvm.org/D79219
  • Loading branch information
petrhosek committed Aug 12, 2020
1 parent 1a67522 commit 31e5f71
Show file tree
Hide file tree
Showing 22 changed files with 79 additions and 92 deletions.
11 changes: 1 addition & 10 deletions clang/test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,23 +9,14 @@ endif ()

string(REPLACE ${CMAKE_CFG_INTDIR} ${LLVM_BUILD_MODE} CLANG_TOOLS_DIR ${LLVM_RUNTIME_OUTPUT_INTDIR})

if(CLANG_BUILT_STANDALONE)
# Set HAVE_LIBZ according to recorded LLVM_ENABLE_ZLIB value. This
# value is forced to 0 if zlib was not found, so it is fine to use it
# instead of HAVE_LIBZ (not recorded).
if(LLVM_ENABLE_ZLIB)
set(HAVE_LIBZ 1)
endif()
endif()

llvm_canonicalize_cmake_booleans(
CLANG_BUILD_EXAMPLES
CLANG_ENABLE_ARCMT
CLANG_ENABLE_STATIC_ANALYZER
CLANG_SPAWN_CC1
ENABLE_BACKTRACES
ENABLE_EXPERIMENTAL_NEW_PASS_MANAGER
HAVE_LIBZ
LLVM_ENABLE_ZLIB
LLVM_ENABLE_PER_TARGET_RUNTIME_DIR
LLVM_ENABLE_PLUGINS
LLVM_ENABLE_THREADS)
Expand Down
2 changes: 1 addition & 1 deletion clang/test/lit.site.cfg.py.in
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ config.host_triple = "@LLVM_HOST_TRIPLE@"
config.target_triple = "@TARGET_TRIPLE@"
config.host_cxx = "@CMAKE_CXX_COMPILER@"
config.llvm_use_sanitizer = "@LLVM_USE_SANITIZER@"
config.have_zlib = @HAVE_LIBZ@
config.have_zlib = @LLVM_ENABLE_ZLIB@
config.clang_arcmt = @CLANG_ENABLE_ARCMT@
config.clang_default_cxx_stdlib = "@CLANG_DEFAULT_CXX_STDLIB@"
config.clang_staticanalyzer = @CLANG_ENABLE_STATIC_ANALYZER@
Expand Down
2 changes: 1 addition & 1 deletion compiler-rt/test/lit.common.configured.in
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ elif config.android:
else:
set_default("target_suffix", "-%s" % config.target_arch)

set_default("have_zlib", "@HAVE_LIBZ@")
set_default("have_zlib", "@LLVM_ENABLE_ZLIB@")
set_default("libcxx_used", "@LLVM_LIBCXX_USED@")

# LLVM tools dir can be passed in lit parameters, so try to
Expand Down
11 changes: 1 addition & 10 deletions lld/test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,8 @@ set(LLVM_BUILD_MODE "%(build_mode)s")
set(LLVM_TOOLS_DIR "${LLVM_TOOLS_BINARY_DIR}/%(build_config)s")
set(LLVM_LIBS_DIR "${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}/%(build_config)s")

if(LLD_BUILT_STANDALONE)
# Set HAVE_LIBZ according to recorded LLVM_ENABLE_ZLIB value. This
# value is forced to 0 if zlib was not found, so it is fine to use it
# instead of HAVE_LIBZ (not recorded).
if(LLVM_ENABLE_ZLIB)
set(HAVE_LIBZ 1)
endif()
endif()

llvm_canonicalize_cmake_booleans(
HAVE_LIBZ
LLVM_ENABLE_ZLIB
LLVM_LIBXML2_ENABLED
)

Expand Down
2 changes: 1 addition & 1 deletion lld/test/lit.site.cfg.py.in
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ config.lld_libs_dir = "@LLVM_LIBRARY_OUTPUT_INTDIR@"
config.lld_tools_dir = "@LLVM_RUNTIME_OUTPUT_INTDIR@"
config.target_triple = "@TARGET_TRIPLE@"
config.python_executable = "@Python3_EXECUTABLE@"
config.have_zlib = @HAVE_LIBZ@
config.have_zlib = @LLVM_ENABLE_ZLIB@
config.sizeof_void_p = @CMAKE_SIZEOF_VOID_P@

# Support substitution of the tools and libs dirs with user parameters. This is
Expand Down
4 changes: 0 additions & 4 deletions lldb/cmake/modules/LLDBStandalone.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -74,10 +74,6 @@ endif()
# CMake modules to be in that directory as well.
list(APPEND CMAKE_MODULE_PATH "${LLVM_DIR}")

if(LLVM_ENABLE_ZLIB)
find_package(ZLIB)
endif()

include(AddLLVM)
include(TableGen)
include(HandleLLVMOptions)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
#include <compression.h>
#endif

#if defined(HAVE_LIBZ)
#if LLVM_ENABLE_ZLIB
#include <zlib.h>
#endif

Expand Down Expand Up @@ -582,7 +582,7 @@ bool GDBRemoteCommunication::DecompressPacket() {
}
#endif

#if defined(HAVE_LIBZ)
#if LLVM_ENABLE_ZLIB
if (decompressed_bytes == 0 && decompressed_bufsize != ULONG_MAX &&
decompressed_buffer != nullptr &&
m_compression_type == CompressionType::ZlibDeflate) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1053,7 +1053,7 @@ void GDBRemoteCommunicationClient::MaybeEnableCompression(
}
#endif

#if defined(HAVE_LIBZ)
#if LLVM_ENABLE_ZLIB
if (avail_type == CompressionType::None) {
for (auto compression : supported_compressions) {
if (compression == "zlib-deflate") {
Expand Down
47 changes: 22 additions & 25 deletions llvm/cmake/config-ix.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ include(CheckSymbolExists)
include(CheckFunctionExists)
include(CheckStructHasMember)
include(CheckCCompilerFlag)
include(CMakePushCheckState)

include(CheckCompilerVersion)
include(HandleLLVMStdlib)
Expand Down Expand Up @@ -56,7 +57,6 @@ check_include_file(sys/types.h HAVE_SYS_TYPES_H)
check_include_file(termios.h HAVE_TERMIOS_H)
check_include_file(unistd.h HAVE_UNISTD_H)
check_include_file(valgrind/valgrind.h HAVE_VALGRIND_VALGRIND_H)
check_include_file(zlib.h HAVE_ZLIB_H)
check_include_file(fenv.h HAVE_FENV_H)
check_symbol_exists(FE_ALL_EXCEPT "fenv.h" HAVE_DECL_FE_ALL_EXCEPT)
check_symbol_exists(FE_INEXACT "fenv.h" HAVE_DECL_FE_INEXACT)
Expand Down Expand Up @@ -115,22 +115,30 @@ if(HAVE_LIBPTHREAD)
set(LLVM_PTHREAD_LIB ${CMAKE_THREAD_LIBS_INIT})
endif()

if(LLVM_ENABLE_ZLIB)
if(LLVM_ENABLE_ZLIB STREQUAL FORCE_ON)
find_package(ZLIB REQUIRED)
elseif(NOT LLVM_USE_SANITIZER MATCHES "Memory.*")
find_package(ZLIB)
endif()
if(ZLIB_FOUND)
# Check if zlib we found is usable; for example, we may have found a 32-bit
# library on a 64-bit system which would result in a link-time failure.
cmake_push_check_state()
set(CMAKE_REQUIRED_INCLUDES ${ZLIB_INCLUDE_DIRS})
set(CMAKE_REQUIRED_LIBRARIES ${ZLIB_LIBRARY})
check_symbol_exists(compress2 zlib.h HAVE_ZLIB)
cmake_pop_check_state()
if(LLVM_ENABLE_ZLIB STREQUAL FORCE_ON AND NOT HAVE_ZLIB)
message(FATAL_ERROR "Failed to configure zlib")
endif()
endif()
set(LLVM_ENABLE_ZLIB "${HAVE_ZLIB}")
endif()

# Don't look for these libraries if we're using MSan, since uninstrumented third
# party code may call MSan interceptors like strlen, leading to false positives.
if(NOT LLVM_USE_SANITIZER MATCHES "Memory.*")
set(HAVE_LIBZ 0)
if(LLVM_ENABLE_ZLIB)
foreach(library z zlib_static zlib)
string(TOUPPER ${library} library_suffix)
check_library_exists(${library} compress2 "" HAVE_LIBZ_${library_suffix})
if(HAVE_LIBZ_${library_suffix})
set(HAVE_LIBZ 1)
set(ZLIB_LIBRARIES "${library}")
break()
endif()
endforeach()
endif()

# Don't look for these libraries on Windows.
if (NOT PURE_WINDOWS)
# Skip libedit if using ASan as it contains memory leaks.
Expand Down Expand Up @@ -175,10 +183,6 @@ if (LLVM_ENABLE_LIBXML2 STREQUAL "FORCE_ON" AND NOT LLVM_LIBXML2_ENABLED)
message(FATAL_ERROR "Failed to congifure libxml2")
endif()

if (LLVM_ENABLE_ZLIB STREQUAL "FORCE_ON" AND NOT HAVE_LIBZ)
message(FATAL_ERROR "Failed to configure zlib")
endif()

check_library_exists(xar xar_open "" HAVE_LIBXAR)
if(HAVE_LIBXAR)
set(XAR_LIB xar)
Expand Down Expand Up @@ -517,13 +521,6 @@ else( LLVM_ENABLE_THREADS )
message(STATUS "Threads disabled.")
endif()

if (LLVM_ENABLE_ZLIB )
# Check if zlib is available in the system.
if ( NOT HAVE_ZLIB_H OR NOT HAVE_LIBZ )
set(LLVM_ENABLE_ZLIB 0)
endif()
endif()

if (LLVM_ENABLE_DOXYGEN)
message(STATUS "Doxygen enabled.")
find_package(Doxygen REQUIRED)
Expand Down
3 changes: 3 additions & 0 deletions llvm/cmake/modules/LLVMConfig.cmake.in
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ set(LLVM_ENABLE_THREADS @LLVM_ENABLE_THREADS@)
set(LLVM_ENABLE_UNWIND_TABLES @LLVM_ENABLE_UNWIND_TABLES@)

set(LLVM_ENABLE_ZLIB @LLVM_ENABLE_ZLIB@)
if(LLVM_ENABLE_ZLIB)
find_package(ZLIB)
endif()

set(LLVM_LIBXML2_ENABLED @LLVM_LIBXML2_ENABLED@)

Expand Down
6 changes: 0 additions & 6 deletions llvm/include/llvm/Config/config.h.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -115,9 +115,6 @@
/* Define to 1 if you have the `pthread_setname_np' function. */
#cmakedefine HAVE_PTHREAD_SETNAME_NP ${HAVE_PTHREAD_SETNAME_NP}

/* Define to 1 if you have the `z' library (-lz). */
#cmakedefine HAVE_LIBZ ${HAVE_LIBZ}

/* Define to 1 if you have the <link.h> header file. */
#cmakedefine HAVE_LINK_H ${HAVE_LINK_H}

Expand Down Expand Up @@ -226,9 +223,6 @@
/* Define to 1 if you have the <valgrind/valgrind.h> header file. */
#cmakedefine HAVE_VALGRIND_VALGRIND_H ${HAVE_VALGRIND_VALGRIND_H}

/* Define to 1 if you have the <zlib.h> header file. */
#cmakedefine HAVE_ZLIB_H ${HAVE_ZLIB_H}

/* Have host's _alloca */
#cmakedefine HAVE__ALLOCA ${HAVE__ALLOCA}

Expand Down
35 changes: 30 additions & 5 deletions llvm/lib/Support/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
set(system_libs)
if ( LLVM_ENABLE_ZLIB AND HAVE_LIBZ )
set(system_libs ${system_libs} ${ZLIB_LIBRARIES})
if(LLVM_ENABLE_ZLIB)
set(imported_libs ZLIB::ZLIB)
endif()

if( MSVC OR MINGW )
# libuuid required for FOLDERID_Profile usage in lib/Support/Windows/Path.inc.
# advapi32 required for CryptAcquireContextW in lib/Support/Windows/Path.inc.
Expand Down Expand Up @@ -194,10 +194,35 @@ add_llvm_component_library(LLVMSupport
${LLVM_MAIN_INCLUDE_DIR}/llvm/ADT
${LLVM_MAIN_INCLUDE_DIR}/llvm/Support
${Backtrace_INCLUDE_DIRS}
LINK_LIBS ${system_libs} ${delayload_flags} ${Z3_LINK_FILES}
LINK_LIBS ${system_libs} ${imported_libs} ${delayload_flags} ${Z3_LINK_FILES}
)

set_property(TARGET LLVMSupport PROPERTY LLVM_SYSTEM_LIBS "${system_libs}")
set(llvm_system_libs ${system_libs})

if(LLVM_ENABLE_ZLIB)
# CMAKE_BUILD_TYPE is only meaningful to single-configuration generators.
if(CMAKE_BUILD_TYPE)
string(TOUPPER ${CMAKE_BUILD_TYPE} build_type)
get_property(zlib_library TARGET ZLIB::ZLIB PROPERTY LOCATION_${build_type})
endif()
if(NOT zlib_library)
get_property(zlib_library TARGET ZLIB::ZLIB PROPERTY LOCATION)
endif()
get_filename_component(zlib_library ${zlib_library} NAME)
if(CMAKE_STATIC_LIBRARY_PREFIX AND CMAKE_STATIC_LIBRARY_SUFFIX AND
zlib_library MATCHES "^${CMAKE_STATIC_LIBRARY_PREFIX}.*${CMAKE_STATIC_LIBRARY_SUFFIX}$")
STRING(REGEX REPLACE "^${CMAKE_STATIC_LIBRARY_PREFIX}" "" zlib_library ${zlib_library})
STRING(REGEX REPLACE "${CMAKE_STATIC_LIBRARY_SUFFIX}$" "" zlib_library ${zlib_library})
endif()
if(CMAKE_SHARED_LIBRARY_PREFIX AND CMAKE_SHARED_LIBRARY_SUFFIX AND
zlib_library MATCHES "^${CMAKE_SHARED_LIBRARY_PREFIX}.*${CMAKE_SHARED_LIBRARY_SUFFIX}$")
STRING(REGEX REPLACE "^${CMAKE_SHARED_LIBRARY_PREFIX}" "" zlib_library ${zlib_library})
STRING(REGEX REPLACE "${CMAKE_SHARED_LIBRARY_SUFFIX}$" "" zlib_library ${zlib_library})
endif()
set(llvm_system_libs ${llvm_system_libs} "${zlib_library}")
endif()

set_property(TARGET LLVMSupport PROPERTY LLVM_SYSTEM_LIBS "${llvm_system_libs}")

if(LLVM_WITH_Z3)
target_include_directories(LLVMSupport SYSTEM
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Support/CRC.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@

using namespace llvm;

#if LLVM_ENABLE_ZLIB == 0 || !HAVE_ZLIB_H
#if !LLVM_ENABLE_ZLIB

static const uint32_t CRCTable[256] = {
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
Expand Down
4 changes: 2 additions & 2 deletions llvm/lib/Support/Compression.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,13 @@
#include "llvm/Support/Compiler.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/ErrorHandling.h"
#if LLVM_ENABLE_ZLIB == 1 && HAVE_ZLIB_H
#if LLVM_ENABLE_ZLIB
#include <zlib.h>
#endif

using namespace llvm;

#if LLVM_ENABLE_ZLIB == 1 && HAVE_LIBZ
#if LLVM_ENABLE_ZLIB
static Error createError(StringRef Err) {
return make_error<StringError>(Err, inconvertibleErrorCode());
}
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
llvm_canonicalize_cmake_booleans(
BUILD_SHARED_LIBS
HAVE_LIBXAR
HAVE_LIBZ
HAVE_OCAMLOPT
HAVE_OCAML_OUNIT
LLVM_ENABLE_DIA_SDK
LLVM_ENABLE_FFI
LLVM_ENABLE_THREADS
LLVM_ENABLE_ZLIB
LLVM_INCLUDE_GO_TESTS
LLVM_LIBXML2_ENABLED
LLVM_LINK_LLVM_DYLIB
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/lit.site.cfg.py.in
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ config.host_cxx = "@HOST_CXX@"
config.host_ldflags = '@HOST_LDFLAGS@'
config.llvm_use_intel_jitevents = @LLVM_USE_INTEL_JITEVENTS@
config.llvm_use_sanitizer = "@LLVM_USE_SANITIZER@"
config.have_zlib = @HAVE_LIBZ@
config.have_zlib = @LLVM_ENABLE_ZLIB@
config.have_libxar = @HAVE_LIBXAR@
config.have_dia_sdk = @LLVM_ENABLE_DIA_SDK@
config.enable_ffi = @LLVM_ENABLE_FFI@
Expand Down
2 changes: 1 addition & 1 deletion llvm/unittests/Support/CompressionTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ using namespace llvm;

namespace {

#if LLVM_ENABLE_ZLIB == 1 && HAVE_LIBZ
#if LLVM_ENABLE_ZLIB

void TestZlibCompression(StringRef Input, int Level) {
SmallString<32> Compressed;
Expand Down
4 changes: 2 additions & 2 deletions llvm/utils/gn/secondary/clang/test/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -79,9 +79,9 @@ write_lit_config("lit_site_cfg") {
}

if (llvm_enable_zlib) {
extra_values += [ "HAVE_LIBZ=1" ]
extra_values += [ "LLVM_ENABLE_ZLIB=1" ]
} else {
extra_values += [ "HAVE_LIBZ=0" ] # Must be 0.
extra_values += [ "LLVM_ENABLE_ZLIB=0" ] # Must be 0.
}

if (host_cpu == "x64") {
Expand Down
4 changes: 2 additions & 2 deletions llvm/utils/gn/secondary/compiler-rt/test/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,8 @@ write_cmake_config("lit_common_configured") {
}

if (llvm_enable_zlib) {
values += [ "HAVE_LIBZ=1" ]
values += [ "LLVM_ENABLE_ZLIB=1" ]
} else {
values += [ "HAVE_LIBZ=0" ]
values += [ "LLVM_ENABLE_ZLIB=0" ]
}
}
4 changes: 2 additions & 2 deletions llvm/utils/gn/secondary/lld/test/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,9 @@ write_lit_cfg("lit_site_cfg") {
}

if (llvm_enable_zlib) {
extra_values += [ "HAVE_LIBZ=1" ]
extra_values += [ "LLVM_ENABLE_ZLIB=1" ]
} else {
extra_values += [ "HAVE_LIBZ=0" ] # Must be 0.
extra_values += [ "LLVM_ENABLE_ZLIB=0" ] # Must be 0.
}

if (current_cpu == "x64" || current_cpu == "arm64" ||
Expand Down
14 changes: 2 additions & 12 deletions llvm/utils/gn/secondary/llvm/include/llvm/Config/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -295,20 +295,10 @@ write_cmake_config("config") {
values += [ "LLVM_ENABLE_DIA_SDK=" ]
}

# FIXME: Once https://reviews.llvm.org/D79219 is in, remove the two
# redundant HAVE_ variables.
if (llvm_enable_zlib) {
values += [
"HAVE_LIBZ=1",
"HAVE_ZLIB_H=1",
"LLVM_ENABLE_ZLIB=1",
]
values += [ "LLVM_ENABLE_ZLIB=1" ]
} else {
values += [
"HAVE_LIBZ=",
"HAVE_ZLIB_H=",
"LLVM_ENABLE_ZLIB=",
]
values += [ "LLVM_ENABLE_ZLIB=" ]
}

if (llvm_enable_libxml2) {
Expand Down
4 changes: 2 additions & 2 deletions llvm/utils/gn/secondary/llvm/test/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -174,9 +174,9 @@ write_lit_config("lit_site_cfg") {
}

if (llvm_enable_zlib) {
extra_values += [ "HAVE_LIBZ=1" ]
extra_values += [ "LLVM_ENABLE_ZLIB=1" ]
} else {
extra_values += [ "HAVE_LIBZ=0" ] # Must be 0.
extra_values += [ "LLVM_ENABLE_ZLIB=0" ] # Must be 0.
}
}

Expand Down

0 comments on commit 31e5f71

Please sign in to comment.