Running a bash command via CMake
Asked Answered
P

1

27

I'm trying to have CMake either run three bash commands or a bash script. However, I can't seem to get it to work.

The bash commands are:

    cd ${CMAKE_SOURCE_DIR}/dependencies/library
    make
    cd ${CMAKE_BINARY_DIR}

Essentially, I would like CMake to build the library in that directory if it does not already exist.

Here's the CMake code I tried:

if(NOT "${CMAKE_SOURCE_DIR}/dependencies/library/lib.o")
   execute_process(COMMAND cd ${CMAKE_SOURCE_DIR}/dependencies/library)
   execute_process(COMMAND make)
   execute_process(COMMAND cd ${CMAKE_BINARY_DIR})
endif(NOT "${CMAKE_SOURCE_DIR}/dependencies/library/lib.o")

However, it's not building anything. What am I doing wrong?

Also, while I'm here asking this: should the third command, to move to the binary folder, be included?

Thanks!

Photoelasticity answered 5/9, 2014 at 14:12 Comment(4)
First of all why aren't You using WORKING_DIRECTORY parameter instead of those cd commands?Something like execute_process(COMMAND make WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/dependencies/library). I suppose, execute_process() calls does not share the same environment. Also, if I were You, I'd check out the add_custom_target() and add_custom_command() for this kind of thing.Wacker
I can't comment on most of what @Wacker said but I can say that I think the detail about execute_process not sharing state is almost certainly accurate. It is incredibly likely that the cd in the first command changes directory only for that process and not for any other ones.Gatling
If you intend to build a third party library, you are probably better off using the ExternalProject module.Cannelloni
Did you check: #37553780 ?Itself
A
38

execute_process() is executed during configure time. But you want this to run at build time, thus add_custom_command() and add_custom_target() is what you're looking for.

In this special case you want to generate an output file, so you should go for add_custom_command() (both are essentially the same, but command produces one or multiple output files, while target does not.

The cmake snippet for this should look something like the following:

add_custom_command(
    OUTPUT ${CMAKE_SOURCE_DIR}/dependencies/library/lib.o
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/dependencies/library
    COMMAND make
)

You then have to add the output file in another target as dependency, and everything should (hopefully) work as expected.

You can also add DEPENDS statements to the add_custom_command() call to rebuild the object file in case some input sources have changed.

Arlina answered 6/9, 2014 at 7:59 Comment(1)
Thanks for pointing this out, I fixed it.Arlina

© 2022 - 2024 — McMap. All rights reserved.