P.P
P.P

Reputation: 121397

Compile headers for errors using cmake

Background

I have a number of headers as part of a library (call it A) and are also used externally from other libraries (call it C).

I'd like to compile as part A's compilation to ensure the headers are self-contained. (Currently, this involves compiling C and if there are issues, re-compile A & make a new release).

Question

What's the best way to compile headers and discard the results? I am only interested in their successful compilation.

I am thinking of copy and rename them as cpp files (it's a C++ project) and then create a library out of them to check errors. But is there a simpler solution?

My aim is to the command-line equivalent of

g++ [compile_flags] -c header.hpp

and check for errors but not interested in the produced files.

I'd like something that works with cmake 3.13.5 (or older).

Thanks

Upvotes: 0

Views: 430

Answers (1)

Tobias Ribizel
Tobias Ribizel

Reputation: 5421

Since I ran into the same question recently, let me show the solution I went with:

When you list the header files in your target's sources and only use relative paths below the current path (i.e. no .. in the paths), you can use a function like the following to compile a separate cpp file for each hpp file.

function(check_headers target)
    # build object library used to "compile" the headers
    add_library(${target}_headers OBJECT)
    target_link_libraries(${target}_headers PRIVATE ${target})
    target_include_directories(${target}_headers PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}")
    # add a proxy source file for each header in the target source list
    get_target_property(TARGET_SOURCES ${target} SOURCES)
    foreach(TARGET_SOURCE ${TARGET_SOURCES})
        if ("${TARGET_SOURCE}" MATCHES ".*\.hpp$")
            set(HEADER_SOURCEFILE "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_SOURCE}.cpp")
            file(WRITE "${HEADER_SOURCEFILE}" "#include \"${TARGET_SOURCE}\"")
            target_sources(${target}_headers PRIVATE "${HEADER_SOURCEFILE}")
        endif()
    endforeach()
endfunction()

It adds an object library that compiles each header file in the given target.

Upvotes: 2

Related Questions