Jookia
Jookia

Reputation: 6880

Creating a directory in CMake

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

Upvotes: 216

Views: 155438

Answers (4)

dbz
dbz

Reputation: 421

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

Upvotes: 1

Yevhenii Babichenko
Yevhenii Babichenko

Reputation: 201

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.

Upvotes: 19

Chin Huang
Chin Huang

Reputation: 13790

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})

Upvotes: 373

xStan
xStan

Reputation: 572

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})

Upvotes: 30

Related Questions