Search code examples
cmakeyaml-cpp

Why my <package>-config.cmake have <package>_include_dir and <package>_librairies empty


I am trying to make a cross-platform CMake for my project (Windows and Linux). I need to use external libraries (yaml-cpp). On Linux, I just had to do an apt get and use find_package. But on Windows, I need to append the CMAKE_MODULE_PATH in order for my program to find the yaml-cpp-config.cmake.

So I start by installing yaml-cpp (https://github.com/jbeder/yaml-cpp) with CMake GUI 3.16 and mingw32 (mingw32-make install).

I have tried the library on a hello world project, and it works fine.

cmake_minimum_required(VERSION 3.1)

project (yaml_test)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

message (STATUS "Yaml-cpp include = $ENV{YAML_CPP_INCLUDE_DIR}")
message (STATUS "Yaml-cpp library = $ENV{YAML_CPP_LIBRARIES}")

include_directories ($ENV{YAML_CPP_INCLUDE_DIR})

add_executable(yaml_test main.cpp)

target_link_libraries(yaml_test $ENV{YAML_CPP_LIBRARIES})

But now, I want to include the library in my project and use find_package. But the yaml-cpp-config.cmake looks like this:

# - Config file for the yaml-cpp package
# It defines the following variables
#  YAML_CPP_INCLUDE_DIR - include directory
#  YAML_CPP_LIBRARIES    - libraries to link against

# Compute paths
get_filename_component(YAML_CPP_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
set(YAML_CPP_INCLUDE_DIR "")

# Our library dependencies (contains definitions for IMPORTED targets)
include("${YAML_CPP_CMAKE_DIR}/yaml-cpp-targets.cmake")

# These are IMPORTED targets created by yaml-cpp-targets.cmake
set(YAML_CPP_LIBRARIES "")

The YAML_CPP_INCLUDE_DIR and YAML_CPP_LIBRARIES variables are empty, and even if CMake found yaml-cpp-config.cmake, It doesn't work. So what do I have missing in the installation of yaml-cpp? Should I have set the paths by hand?


Solution

  • The absence of definition of YAML_CPP_INCLUDE_DIR and YAML_CPP_LIBRARIES variables is the issue with the yaml-cpp project which is already reported here.

    Instead of variables described in this config file, use target yaml-cpp:

    add_executable(yaml_test main.cpp)
    # This provides both include directories and libraries.
    target_link_libraries(yaml_test yaml-cpp)
    

    Linking with an IMPORTED target (yaml-cpp in this case) is known as CMake "modern way".