Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make CMAKE find specific version of lib curl on OSX?

Question is: How do I get CMAKE to set/make the CURL_INCLUDE_DIR be "/usr/local/Cellar/curl/7.75.0/include/"?

No matter what I do, CMAKE only finds the Xcode lib version/location.

My CMAKE file contains:

set(CURL_ROOT_DIR /usr/local/Cellar/curl/7.75.0/include/)
find_package(curl REQUIRED)
message(STATUS ">>> CURL Dir Found: " ${CURL_INCLUDE_DIR})

No matter what I've tried, the above CMAKE code will result in a "CURL_INCLUDE_DIR" of

"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include

Note, utilizing "include(findcurl)" instead of "find_package(curl REQUIRED)" gives same result.

I've resorted to adding

set(CMAKE_CXX_FLAGS "-I/usr/local/Cellar/curl/7.57.0/include -L/usr/local/Cellar/curl/7.57.0/lib")

to get CMAKE to actually utilize the lib version/location that I want. Is there a better way that I'm failing to figure out?

like image 636
Xandrix Avatar asked Sep 17 '25 04:09

Xandrix


1 Answers

The cmake FindCURL module (at least in the version I have, 3.5.1) does not make reference to CURL_ROOT_DIR anywhere, so I don't believe setting that variable will have any effect.

In fact the FindCURL module is really quite basic and doesn't offer any means for customising where to look, which means it will be looking only in "standard" paths (eg /usr/lib, /usr/local/lib etc)

You can, however, use find_library which takes a PATHS argument.

set(CURL_PATH "/usr/local/Cellar/curl/7.75.0")

find_library(
        LIB_CURL
        NAMES
            curl
        PATHS 
            ${CURL_PATH}/lib)

At this point you will have a variable ${LIB_CURL} which points to the location of libcurl

Link against the library and set the include path:

You can then just link against ${LIB_CURL} directly, and manually specify the include path for your target too, such as:

add_executable(
        foo
        main.cpp)

target_link_libraries(
        foo
        ${LIB_CURL})

target_include_directories(
        foo
        SYSTEM 
        PRIVATE "${CURL_PATH}/include")

IMPORTED library target:

Another option, if you want to be fancy, is to create an IMPORTED library target using ${LIB_CURL}, and set the INTERFACE_INCLUDE_DIRECTORIES on that target, so consumers get the include path set automatically.

add_library(
        libcurl 
        IMPORTED)

set_target_properties(
        libcurl 
        PROPERTIES 
            IMPORTED_LOCATION "${LIB_CURL}")

set_target_properties(
        libcurl 
        PROPERTIES
            INTERFACE_INCLUDE_DIRECTORIES "${CURL_PATH}/include")

Now you will just be able to link against target libcurl directly, and your app will automatically have its include paths updated

add_executable(
        foo 
        main.cpp)

target_link_libraries(
        foo
        libcurl)
like image 128
Steve Lorimer Avatar answered Sep 18 '25 17:09

Steve Lorimer