Search code examples
urldownloadcmakeeasylogging++

cmake: Download easylogging++ and use sources directly


I would like to download easylogging++ package, extract the content and then directly use easylogging++.h and easylogging++.cc in my sources.

I started with this:

ExternalProject_Add(
        easyloggingpp
        PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/downloads
        URL https://github.com/muflihun/easyloggingpp/archive/v9.96.4.tar.gz
        INSTALL_COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/external/easyloggingpp && cp src/easyloggingpp-9.96.4/src/* ${CMAKE_CURRENT_BINARY_DIR}/external/easyloggingpp/)
include_directories(${CMAKE_CURRENT_BINARY_DIR}/external/easyloggingpp) 
set(easylogging ${CMAKE_CURRENT_BINARY_DIR}/external/easyloggingpp/easylogging++.cc)

..

add_dependencies(myproject easyloggingpp)

This creates downloads/ directory in my project, but it's empty and no files appear in external/ directory, even the directory itself is not created.

How can I achieve downloading this package and directly merging its sources with mine? I would like to achieve something similar to bazel's new_http_archive.


Solution

  • It seems that ExternalProject_Add is not for the use case I am trying to implement. It looks like the download is only executed during compilation step, not the configuration step. That's a bummer.

    I was able to achieve similar result by coding this manually and it works fairly well:

    file(MAKE_DIRECTORY downloads external)
    
    ################################################################################
    # Easylogging++
    ################################################################################
    if(EXISTS "external/easyloggingpp")
    else()
    file(MAKE_DIRECTORY external/easyloggingpp)
    file(DOWNLOAD
            https://github.com/muflihun/easyloggingpp/archive/v9.96.4.zip
            downloads/easyloggingpp.zip)
    execute_process(COMMAND unzip downloads/easyloggingpp.zip -d downloads)
    file(GLOB easyloggingpp_files downloads/easyloggingpp-9.96.4/src/easylogging++.*)
    file(COPY ${easyloggingpp_files} DESTINATION external/easyloggingpp)
    endif()
    
    include_directories(external/easyloggingpp)
    set(easyloggingpp external/easyloggingpp/easylogging++.cc)
    

    This works perfectly fine for me and I adtually understand what is happening during the process. The cool things are that cmake . step doesn't download unless it is necessary.