cmake: Download easylogging++ and use sources directly

797 Views Asked by At

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.

1

There are 1 best solutions below

0
On BEST ANSWER

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.