219

In CMake, I want to create a directory if it doesn't already exist. How can I do this?

4 Answers 4

375

When do you want to create the directory?

At build system generation

To create a directory when CMake generates the build system,

file(MAKE_DIRECTORY ${directory})

At build time

In the add_custom_command() command (which adds a custom build rule to the generated build system), and the add_custom_target() command (which adds a target with no output so it will always be built), you specify the commands to execute at build time. Create a directory by executing the command ${CMAKE_COMMAND} -E make_directory. For example:

add_custom_target(build-time-make-directory ALL
    COMMAND ${CMAKE_COMMAND} -E make_directory ${directory})

At install time

To create a directory at install time,

install(DIRECTORY DESTINATION ${directory})
Sign up to request clarification or add additional context in comments.

2 Comments

cmake -E is not a recognized flag.
30

To create a directory at install time,

install(DIRECTORY DESTINATION ${directory})

These will both run at configure time:

file(MAKE_DIRECTORY ${directory})
execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${directory})

To create during the build, use a custom target:

add_custom_target(mytargetname ALL COMMAND ${CMAKE_COMMAND} -E make_directory ${directory})

Comments

20

In addition to Chin Huang's reply, you can also do this at build time with add_custom_command:

add_custom_command(TARGET ${target_name} PRE_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory ${directory})

You can also change the moment, when your directory is created with PRE_BUILD | PRE_LINK | POST_BUILD parameters.

Comments

1

In my case, to create a directory at install time, it was necessary to specify the COMPONENT_NAME:

install (DIRECTORY 
    COMPONENT  ${COMPONENT_NAME}
    DESTINATION "/Logs" 
)

I hope this can be useful for someone

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.