Cyril
Cyril

Reputation: 563

During build, how to create a directory for a file which is generated by some COMMAND?

I'm writing a custom command in CMake to convert a file to binary format at build time. However, the tool I'm using requires directory for a file to be pre-existed; it doesn't create a directory automatically.

Currently my CMake macro looks like this:

MACRO(ConvertToBinary _name)
    ADD_CUSTOM_COMMAND(
        OUTPUT ${CMAKE_BINARY_DIR}/${_name}.bin
        COMMAND ${EXE_DIR}/toBinary -i ${CMAKE_CURRENT_SOURCE_DIR}/${_name} -o ${CMAKE_BINARY_DIR}/${_name}.bin
        DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${_name}
    )
ENDMACRO(ConvertToBinary)

This macro doesn't work for _name parameter equal, e.g., to "test/sample.txt", because the tool is run with test/ folder under ${CMAKE_BINARY_DIR} being not existed.

How to create the directory before the tool, generating the file, is run?


I have tried to overcome the problem by pre-creating the file (and directory) with the help of CMake. So the tool will be run with the directory created, and can override the output file. I have tried the following:

MACRO(ConvertToBinary _name)
    ADD_CUSTOM_COMMAND(
        OUTPUT ${CMAKE_BINARY_DIR}/${_name}.bin
        FILE(WRITE ${CMAKE_BINARY_DIR}/${_name}.bin "Dummy")
        COMMAND ${EXE_DIR}/toBinary -i ${CMAKE_CURRENT_SOURCE_DIR}/${_name} -o ${CMAKE_BINARY_DIR}/${_name}.bin
        DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${_name}
    )
ENDMACRO(ConvertToBinary)

But it did not work. I can't find information on how to create file at build time with CMake, so any help is appreciated.

Upvotes: 3

Views: 3429

Answers (1)

Tsyvarev
Tsyvarev

Reputation: 65928

In CMake you may extract directory component of the file and create this directory.

Below code can be used for a tool, which generates a file but doesn't create directory for it.

# Assume some tool generates file '${file}', but don't create directory for it.
#
# Extract directory component for a file
get_filename_component(_dir ${file} DIRECTORY)
add_custom_command(OUTPUT ${file}
    COMMAND ${CMAKE_COMMAND} -E make_directory ${_dir} # Create output directory
    COMMAND <tool-which-generates-file> ... ${file}
)

See also that question about ways for create a directory in CMake.

Upvotes: 4

Related Questions