CMake/macOS: Remove _LIBPATH, avoid link_directories.

After tests were bundled in a single executable and cycles and libmv
created their own tests, the warnings on macOS have gone over 800.
The reason is setting `*_LIBRARIES` to names of the libraries
and later using `link_directories` to link them properly.

https://cmake.org/cmake/help/latest/command/link_directories.html

> Note This command is rarely necessary and should be avoided where
> there are other choices. Prefer to pass full absolute paths to
> libraries where possible, since this ensures the correct library
> will always be linked. The find_library() command provides the
> full path, which can generally be used directly in calls to
> target_link_libraries().

Warnings like the following popup for every target/executable,
for every library it links to.
```
ld: warning: directory not found for option
'-L/Users/me/blender-build/blender/../lib/darwin/jpeg/lib/Debug'
```

The patch completes a step towards removing `link_directories` as
mentioned in TODO at several places.
The patch uses absolute paths to link libraries and removes
all `*_LIBPATH`s except `PYTHON_LIBPATH` from
`platform_apple.cmake` file. (The corner case where it's used seems
like dead code. Python is no longer shipped with that file structure.)

Also, unused code for LLVM-3.4 has been removed.
Also, guards to avoid searching libraries in system directories have
been added.

`APPLE` platform now no longer needs `setup_libdirs`,
`cycles_link_directories`, and `link_directories`.
The number of warnings now is less than 100, most of them being
deprecation ones in dependencies.

This patch depended on {rBb746179d0add}, {rB2fdbe4d05011},
{rB402a4cadba49} and {rBd7f482f88ecb}.

Reviewed By: brecht

Differential Revision: https://developer.blender.org/D8855
This commit is contained in:
Ankit Meel
2020-10-08 19:31:40 +05:30
parent 83e91485d0
commit 1f6b7387ad
5 changed files with 121 additions and 169 deletions

View File

@@ -477,8 +477,8 @@ function(SETUP_LIBDIRS)
# NOTE: For all new libraries, use absolute library paths. # NOTE: For all new libraries, use absolute library paths.
# This should eventually be phased out. # This should eventually be phased out.
# APPLE plaform uses full paths for linking libraries, and avoids link_directories.
if(NOT MSVC) if(NOT MSVC AND NOT APPLE)
link_directories(${JPEG_LIBPATH} ${PNG_LIBPATH} ${ZLIB_LIBPATH} ${FREETYPE_LIBPATH}) link_directories(${JPEG_LIBPATH} ${PNG_LIBPATH} ${ZLIB_LIBPATH} ${FREETYPE_LIBPATH})
if(WITH_PYTHON) # AND NOT WITH_PYTHON_MODULE # WIN32 needs if(WITH_PYTHON) # AND NOT WITH_PYTHON_MODULE # WIN32 needs

View File

@@ -30,6 +30,20 @@ macro(find_package_wrapper)
# do nothing, just satisfy the macro # do nothing, just satisfy the macro
endmacro() endmacro()
function(print_found_status
lib_name
lib_path
)
if(FIRST_RUN)
if(lib_path)
message(STATUS "Found ${lib_name}: ${lib_path}")
else()
message(WARNING "Could NOT find ${lib_name}")
endif()
endif()
endfunction()
if(NOT DEFINED LIBDIR) if(NOT DEFINED LIBDIR)
set(LIBDIR ${CMAKE_SOURCE_DIR}/../lib/darwin) set(LIBDIR ${CMAKE_SOURCE_DIR}/../lib/darwin)
# Prefer lib directory paths # Prefer lib directory paths
@@ -42,6 +56,23 @@ if(NOT EXISTS "${LIBDIR}/")
message(FATAL_ERROR "Mac OSX requires pre-compiled libs at: '${LIBDIR}'") message(FATAL_ERROR "Mac OSX requires pre-compiled libs at: '${LIBDIR}'")
endif() endif()
# ------------------------------------------------------------------------
# Find system provided libraries.
# Find system ZLIB, not the pre-compiled one supplied with OpenCollada.
set(ZLIB_ROOT /usr)
find_package(ZLIB REQUIRED)
find_package(BZip2 REQUIRED)
list(APPEND ZLIB_LIBRARIES ${BZIP2_LIBRARIES})
# -------------------------------------------------------------------------
# Find precompiled libraries, and avoid system or user-installed ones.
if(EXISTS ${LIBDIR})
without_system_libs_begin()
endif()
if(WITH_OPENAL) if(WITH_OPENAL)
find_package(OpenAL) find_package(OpenAL)
if(OPENAL_FOUND) if(OPENAL_FOUND)
@@ -52,12 +83,7 @@ if(WITH_OPENAL)
endif() endif()
if(WITH_ALEMBIC) if(WITH_ALEMBIC)
set(ALEMBIC ${LIBDIR}/alembic) find_package(Alembic)
set(ALEMBIC_INCLUDE_DIR ${ALEMBIC}/include)
set(ALEMBIC_INCLUDE_DIRS ${ALEMBIC_INCLUDE_DIR})
set(ALEMBIC_LIBPATH ${ALEMBIC}/lib)
set(ALEMBIC_LIBRARIES Alembic)
set(ALEMBIC_FOUND ON)
endif() endif()
if(WITH_USD) if(WITH_USD)
@@ -68,30 +94,38 @@ if(WITH_USD)
endif() endif()
if(WITH_OPENSUBDIV) if(WITH_OPENSUBDIV)
set(OPENSUBDIV ${LIBDIR}/opensubdiv) find_package(OpenSubdiv)
set(OPENSUBDIV_LIBPATH ${OPENSUBDIV}/lib)
find_library(OSD_LIB_CPU NAMES osdCPU PATHS ${OPENSUBDIV_LIBPATH})
find_library(OSD_LIB_GPU NAMES osdGPU PATHS ${OPENSUBDIV_LIBPATH})
set(OPENSUBDIV_INCLUDE_DIR ${OPENSUBDIV}/include)
set(OPENSUBDIV_INCLUDE_DIRS ${OPENSUBDIV_INCLUDE_DIR})
list(APPEND OPENSUBDIV_LIBRARIES ${OSD_LIB_CPU} ${OSD_LIB_GPU})
endif() endif()
if(WITH_JACK) if(WITH_JACK)
find_library(JACK_FRAMEWORK find_library(JACK_FRAMEWORK
NAMES jackmp NAMES jackmp
) )
set(JACK_INCLUDE_DIRS ${JACK_FRAMEWORK}/headers)
if(NOT JACK_FRAMEWORK) if(NOT JACK_FRAMEWORK)
set(WITH_JACK OFF) set(WITH_JACK OFF)
else()
set(JACK_INCLUDE_DIRS ${JACK_FRAMEWORK}/headers)
endif() endif()
endif() endif()
if(WITH_CODEC_SNDFILE) if(WITH_CODEC_SNDFILE)
set(LIBSNDFILE ${LIBDIR}/sndfile) find_package(SndFile)
set(LIBSNDFILE_INCLUDE_DIRS ${LIBSNDFILE}/include) find_library(_sndfile_FLAC_LIBRARY NAMES flac HINTS ${LIBDIR}/sndfile/lib)
set(LIBSNDFILE_LIBRARIES sndfile FLAC ogg vorbis vorbisenc) find_library(_sndfile_OGG_LIBRARY NAMES ogg HINTS ${LIBDIR}/ffmpeg/lib)
set(LIBSNDFILE_LIBPATH ${LIBSNDFILE}/lib ${LIBDIR}/ffmpeg/lib) # TODO, deprecate find_library(_sndfile_VORBIS_LIBRARY NAMES vorbis HINTS ${LIBDIR}/ffmpeg/lib)
find_library(_sndfile_VORBISENC_LIBRARY NAMES vorbisenc HINTS ${LIBDIR}/ffmpeg/lib)
list(APPEND LIBSNDFILE_LIBRARIES
${_sndfile_FLAC_LIBRARY}
${_sndfile_OGG_LIBRARY}
${_sndfile_VORBIS_LIBRARY}
${_sndfile_VORBISENC_LIBRARY}
)
print_found_status("SndFile libraries" "${LIBSNDFILE_LIBRARIES}")
unset(_sndfile_FLAC_LIBRARY)
unset(_sndfile_OGG_LIBRARY)
unset(_sndfile_VORBIS_LIBRARY)
unset(_sndfile_VORBISENC_LIBRARY)
endif() endif()
if(WITH_PYTHON) if(WITH_PYTHON)
@@ -130,54 +164,27 @@ if(WITH_PYTHON)
endif() endif()
if(WITH_FFTW3) if(WITH_FFTW3)
set(FFTW3 ${LIBDIR}/fftw3) find_package(Fftw3)
set(FFTW3_INCLUDE_DIRS ${FFTW3}/include)
set(FFTW3_LIBRARIES fftw3)
set(FFTW3_LIBPATH ${FFTW3}/lib)
endif() endif()
set(ZLIB /usr) find_package(Freetype REQUIRED)
set(ZLIB_INCLUDE_DIRS "${ZLIB}/include")
set(ZLIB_LIBRARIES z bz2)
set(PNG_LIBRARIES png ${ZLIB_LIBRARIES})
set(JPEG_LIBRARIES jpeg)
set(FREETYPE ${LIBDIR}/freetype)
set(FREETYPE_INCLUDE_DIRS ${FREETYPE}/include ${FREETYPE}/include/freetype2)
set(FREETYPE_LIBPATH ${FREETYPE}/lib)
set(FREETYPE_LIBRARY freetype)
if(WITH_IMAGE_OPENEXR) if(WITH_IMAGE_OPENEXR)
set(OPENEXR ${LIBDIR}/openexr) find_package(OpenEXR)
set(OPENEXR_INCLUDE_DIR ${OPENEXR}/include)
set(OPENEXR_INCLUDE_DIRS ${OPENEXR_INCLUDE_DIR} ${OPENEXR}/include/OpenEXR)
set(OPENEXR_LIBRARIES
Iex
Half
IlmImf
Imath
IlmThread)
set(OPENEXR_LIBPATH ${OPENEXR}/lib)
endif() endif()
if(WITH_CODEC_FFMPEG) if(WITH_CODEC_FFMPEG)
set(FFMPEG ${LIBDIR}/ffmpeg) set(FFMPEG_FIND_COMPONENTS
set(FFMPEG_INCLUDE_DIRS ${FFMPEG}/include)
set(FFMPEG_LIBRARIES
avcodec avdevice avformat avutil avcodec avdevice avformat avutil
mp3lame swscale x264 xvidcore mp3lame ogg opus swresample swscale
theora theoradec theoraenc theora theoradec theoraenc vorbis vorbisenc
vorbis vorbisenc vorbisfile ogg opus vorbisfile vpx x264 xvidcore)
vpx swresample) find_package(FFmpeg)
set(FFMPEG_LIBPATH ${FFMPEG}/lib)
endif() endif()
if(WITH_IMAGE_OPENJPEG OR WITH_CODEC_FFMPEG) if(WITH_IMAGE_OPENJPEG OR WITH_CODEC_FFMPEG)
# use openjpeg from libdir that is linked into ffmpeg # use openjpeg from libdir that is linked into ffmpeg
set(OPENJPEG ${LIBDIR}/openjpeg) find_package(OpenJPEG)
set(OPENJPEG_INCLUDE_DIRS ${OPENJPEG}/include)
set(OPENJPEG_LIBRARIES ${OPENJPEG}/lib/libopenjp2.a)
endif() endif()
find_library(SYSTEMSTUBS_LIBRARY find_library(SYSTEMSTUBS_LIBRARY
@@ -207,77 +214,49 @@ if(WITH_PYTHON_MODULE OR WITH_PYTHON_FRAMEWORK)
endif() endif()
if(WITH_OPENCOLLADA) if(WITH_OPENCOLLADA)
set(OPENCOLLADA ${LIBDIR}/opencollada) find_package(OpenCOLLADA)
find_library(PCRE_LIBRARIES NAMES pcre HINTS ${LIBDIR}/opencollada/lib)
set(OPENCOLLADA_INCLUDE_DIRS find_library(XML2_LIBRARIES NAMES xml2 HINTS ${LIBDIR}/opencollada/lib)
${LIBDIR}/opencollada/include/COLLADAStreamWriter print_found_status("PCRE" "${PCRE_LIBRARIES}")
${LIBDIR}/opencollada/include/COLLADABaseUtils print_found_status("XML2" "${XML2_LIBRARIES}")
${LIBDIR}/opencollada/include/COLLADAFramework
${LIBDIR}/opencollada/include/COLLADASaxFrameworkLoader
${LIBDIR}/opencollada/include/GeneratedSaxParser
)
set(OPENCOLLADA_LIBPATH ${OPENCOLLADA}/lib)
set(OPENCOLLADA_LIBRARIES
OpenCOLLADASaxFrameworkLoader
-lOpenCOLLADAFramework
-lOpenCOLLADABaseUtils
-lOpenCOLLADAStreamWriter
-lMathMLSolver
-lGeneratedSaxParser
-lbuffer -lftoa -lUTF
)
# PCRE and XML2 are bundled with OpenCollada.
set(PCRE_LIBRARIES pcre)
set(XML2_LIBRARIES xml2)
endif() endif()
if(WITH_SDL) if(WITH_SDL)
set(SDL ${LIBDIR}/sdl) find_package(SDL2)
set(SDL_INCLUDE_DIR ${SDL}/include) set(SDL_INCLUDE_DIR ${SDL2_INCLUDE_DIRS})
set(SDL_LIBRARY SDL2) set(SDL_LIBRARY ${SDL2_LIBRARIES})
set(SDL_LIBPATH ${SDL}/lib)
set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} -framework ForceFeedback") set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} -framework ForceFeedback")
endif() endif()
set(PNG "${LIBDIR}/png") find_package(PNG REQUIRED)
set(PNG_INCLUDE_DIRS "${PNG}/include")
set(PNG_LIBPATH ${PNG}/lib)
set(JPEG "${LIBDIR}/jpeg") find_package(JPEG REQUIRED)
set(JPEG_INCLUDE_DIR "${JPEG}/include")
set(JPEG_LIBPATH ${JPEG}/lib)
if(WITH_IMAGE_TIFF) find_package(TIFF REQUIRED)
set(TIFF ${LIBDIR}/tiff)
set(TIFF_INCLUDE_DIR ${TIFF}/include)
set(TIFF_LIBRARY tiff)
set(TIFF_LIBPATH ${TIFF}/lib)
endif()
if(WITH_BOOST) if(WITH_BOOST)
set(BOOST ${LIBDIR}/boost) set(Boost_NO_BOOST_CMAKE ON)
set(BOOST_INCLUDE_DIR ${BOOST}/include) set(BOOST_ROOT ${LIBDIR}/boost)
set(BOOST_POSTFIX) set(Boost_NO_SYSTEM_PATHS ON)
set(BOOST_LIBRARIES set(_boost_FIND_COMPONENTS date_time filesystem regex system thread wave)
boost_date_time${BOOST_POSTFIX}
boost_filesystem${BOOST_POSTFIX}
boost_regex${BOOST_POSTFIX}
boost_system${BOOST_POSTFIX}
boost_thread${BOOST_POSTFIX}
boost_wave${BOOST_POSTFIX}
)
if(WITH_INTERNATIONAL) if(WITH_INTERNATIONAL)
list(APPEND BOOST_LIBRARIES boost_locale${BOOST_POSTFIX}) list(APPEND _boost_FIND_COMPONENTS locale)
endif() endif()
if(WITH_CYCLES_NETWORK) if(WITH_CYCLES_NETWORK)
list(APPEND BOOST_LIBRARIES boost_serialization${BOOST_POSTFIX}) list(APPEND _boost_FIND_COMPONENTS serialization)
endif() endif()
if(WITH_OPENVDB) if(WITH_OPENVDB)
list(APPEND BOOST_LIBRARIES boost_iostreams${BOOST_POSTFIX}) list(APPEND _boost_FIND_COMPONENTS iostreams)
endif() endif()
set(BOOST_LIBPATH ${BOOST}/lib) find_package(Boost COMPONENTS ${_boost_FIND_COMPONENTS})
set(BOOST_LIBRARIES ${Boost_LIBRARIES})
set(BOOST_INCLUDE_DIR ${Boost_INCLUDE_DIRS})
set(BOOST_DEFINITIONS) set(BOOST_DEFINITIONS)
mark_as_advanced(Boost_LIBRARIES)
mark_as_advanced(Boost_INCLUDE_DIRS)
unset(_boost_FIND_COMPONENTS)
endif() endif()
if(WITH_INTERNATIONAL OR WITH_CODEC_FFMPEG) if(WITH_INTERNATIONAL OR WITH_CODEC_FFMPEG)
@@ -285,10 +264,9 @@ if(WITH_INTERNATIONAL OR WITH_CODEC_FFMPEG)
endif() endif()
if(WITH_OPENIMAGEIO) if(WITH_OPENIMAGEIO)
set(OPENIMAGEIO ${LIBDIR}/openimageio) find_package(OpenImageIO)
set(OPENIMAGEIO_INCLUDE_DIRS ${OPENIMAGEIO}/include) list(APPEND OPENIMAGEIO_LIBRARIES
set(OPENIMAGEIO_LIBRARIES ${BOOST_LIBRARIES}
${OPENIMAGEIO}/lib/libOpenImageIO.a
${PNG_LIBRARIES} ${PNG_LIBRARIES}
${JPEG_LIBRARIES} ${JPEG_LIBRARIES}
${TIFF_LIBRARY} ${TIFF_LIBRARY}
@@ -296,30 +274,19 @@ if(WITH_OPENIMAGEIO)
${OPENJPEG_LIBRARIES} ${OPENJPEG_LIBRARIES}
${ZLIB_LIBRARIES} ${ZLIB_LIBRARIES}
) )
set(OPENIMAGEIO_LIBPATH
${OPENIMAGEIO}/lib
${JPEG_LIBPATH}
${PNG_LIBPATH}
${TIFF_LIBPATH}
${OPENEXR_LIBPATH}
${ZLIB_LIBPATH}
)
set(OPENIMAGEIO_DEFINITIONS "-DOIIO_STATIC_BUILD") set(OPENIMAGEIO_DEFINITIONS "-DOIIO_STATIC_BUILD")
set(OPENIMAGEIO_IDIFF "${LIBDIR}/openimageio/bin/idiff") set(OPENIMAGEIO_IDIFF "${LIBDIR}/openimageio/bin/idiff")
endif() endif()
if(WITH_OPENCOLORIO) if(WITH_OPENCOLORIO)
set(OPENCOLORIO ${LIBDIR}/opencolorio) find_package(OpenColorIO)
set(OPENCOLORIO_INCLUDE_DIRS ${OPENCOLORIO}/include)
set(OPENCOLORIO_LIBRARIES OpenColorIO tinyxml yaml-cpp)
set(OPENCOLORIO_LIBPATH ${OPENCOLORIO}/lib)
endif() endif()
if(WITH_OPENVDB) if(WITH_OPENVDB)
set(OPENVDB ${LIBDIR}/openvdb) find_package(OpenVDB)
set(OPENVDB_INCLUDE_DIRS ${OPENVDB}/include) find_library(BLOSC_LIBRARIES NAMES blosc HINTS ${LIBDIR}/openvdb/lib)
set(OPENVDB_LIBRARIES openvdb blosc) print_found_status("Blosc" "${BLOSC_LIBRARIES}")
set(OPENVDB_LIBPATH ${LIBDIR}/openvdb/lib) list(APPEND OPENVDB_LIBRARIES ${BLOSC_LIBRARIES})
set(OPENVDB_DEFINITIONS) set(OPENVDB_DEFINITIONS)
endif() endif()
@@ -329,41 +296,8 @@ if(WITH_NANOVDB)
endif() endif()
if(WITH_LLVM) if(WITH_LLVM)
set(LLVM_ROOT_DIR ${LIBDIR}/llvm) find_package(LLVM)
if(EXISTS "${LLVM_ROOT_DIR}/bin/llvm-config") if(NOT LLVM_FOUND)
set(LLVM_CONFIG "${LLVM_ROOT_DIR}/bin/llvm-config")
else()
set(LLVM_CONFIG llvm-config)
endif()
execute_process(COMMAND ${LLVM_CONFIG} --version
OUTPUT_VARIABLE LLVM_VERSION
OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND ${LLVM_CONFIG} --prefix
OUTPUT_VARIABLE LLVM_ROOT_DIR
OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND ${LLVM_CONFIG} --includedir
OUTPUT_VARIABLE LLVM_INCLUDE_DIRS
OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND ${LLVM_CONFIG} --libdir
OUTPUT_VARIABLE LLVM_LIBPATH
OUTPUT_STRIP_TRAILING_WHITESPACE)
find_library(LLVM_LIBRARY
NAMES LLVMAnalysis # first of a whole bunch of libs to get
PATHS ${LLVM_LIBPATH})
if(LLVM_LIBRARY AND LLVM_ROOT_DIR AND LLVM_LIBPATH)
if(LLVM_STATIC)
# if static LLVM libraries were requested, use llvm-config to generate
# the list of what libraries we need, and substitute that in the right
# way for LLVM_LIBRARY.
execute_process(COMMAND ${LLVM_CONFIG} --libfiles
OUTPUT_VARIABLE LLVM_LIBRARY
OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REPLACE ".a /" ".a;/" LLVM_LIBRARY ${LLVM_LIBRARY})
else()
set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} -lLLVM-3.4")
endif()
else()
message(FATAL_ERROR "LLVM not found.") message(FATAL_ERROR "LLVM not found.")
endif() endif()
endif() endif()
@@ -469,6 +403,13 @@ if(WITH_GMP)
endif() endif()
endif() endif()
if(EXISTS ${LIBDIR})
without_system_libs_end()
endif()
# ---------------------------------------------------------------------
# Set compiler and linker flags.
set(EXETYPE MACOSX_BUNDLE) set(EXETYPE MACOSX_BUNDLE)
set(CMAKE_C_FLAGS_DEBUG "-fno-strict-aliasing -g") set(CMAKE_C_FLAGS_DEBUG "-fno-strict-aliasing -g")

View File

@@ -86,7 +86,12 @@ endmacro()
# Cycles library dependencies common to all executables # Cycles library dependencies common to all executables
macro(cycles_link_directories) function(cycles_link_directories)
if(APPLE)
# APPLE plaform uses full paths for linking libraries, and avoids link_directories.
return()
endif(APPLE)
if(WITH_OPENCOLORIO) if(WITH_OPENCOLORIO)
link_directories(${OPENCOLORIO_LIBPATH}) link_directories(${OPENCOLORIO_LIBPATH})
endif() endif()
@@ -110,7 +115,7 @@ macro(cycles_link_directories)
${OPENEXR_LIBPATH} ${OPENEXR_LIBPATH}
${OPENJPEG_LIBPATH} ${OPENJPEG_LIBPATH}
) )
endmacro() endfunction()
macro(cycles_target_link_libraries target) macro(cycles_target_link_libraries target)
if(WITH_CYCLES_LOGGING) if(WITH_CYCLES_LOGGING)

View File

@@ -52,7 +52,10 @@ if(NOT WITH_HEADLESS)
endif() endif()
include_directories(${PNG_INCLUDE_DIRS}) include_directories(${PNG_INCLUDE_DIRS})
if(NOT APPLE)
# APPLE plaform uses full paths for linking libraries.
link_directories(${PNG_LIBPATH} ${ZLIB_LIBPATH}) link_directories(${PNG_LIBPATH} ${ZLIB_LIBPATH})
endif(NOT APPLE)
add_executable(datatoc_icon ${SRC}) add_executable(datatoc_icon ${SRC})
setup_platform_linker_flags(datatoc_icon) setup_platform_linker_flags(datatoc_icon)

View File

@@ -73,7 +73,10 @@ endif()
if(WITH_TBB) if(WITH_TBB)
blender_include_dirs(${TBB_INCLUDE_DIRS}) blender_include_dirs(${TBB_INCLUDE_DIRS})
if(NOT APPLE)
# APPLE plaform uses full paths for linking libraries.
link_directories(${LIBDIR}/tbb/lib) link_directories(${LIBDIR}/tbb/lib)
endif()
endif() endif()