[CMake] EXECUTABLE_OUTPUT_PATH is not just deprecated, it's harmful!

Eric Noulard eric.noulard at gmail.com
Thu Feb 19 17:17:23 EST 2009


2009/2/19 kent williams <nkwmailinglists at gmail.com>:
> So we have a big program (well a couple of them Brains2 and Brains3),
> and a bunch of 'unbundled' programs (BRAINSFit, BRAINSDemonWarp,
> BRAINSTracer etc..).
>
> We use SVN to add the 'unbundled' programs as subdirectories of our
> BRAINS svn checkout.
>
> So our CMakeLists.txt files in our unbundled programs MUST work
> properly as a standalone build, or as a sub-directory of BRAINS.
>
> We've done this, at the cost of some slight added complexity in the
> unbundled CMakeLists.txt.  But one thing has REALLY been kicking my
> butt since CMake 2.6 -- they each set EXECUTABLE_OUTPUT_PATH, relative
> to their own CMAKE_CURRENT_BINARY_DIR
>
> The problem? If you're running standalone, everything's fine. If
> you're building inside the BRAINS tree, though, the LAST
> CMakeLists.txt file in the directory tree that sets
> EXECUTABLE_OUTPUT_PATH wins, and consequently executable files end up
> unexpected places.

May be each project shouldn't set
XXXX_OUTPUT_PATH unconditionnally but using something like:

IF(NOT XXXX_OUTPUT_PATH)
    SET(XXXX_OUTPUT_PATH "/my/favorite/place")
ENDIF(NOT XXXX_OUTPUT_PATH)

this way the higher level CMakeLists.txt should drive the sub-project?
(to be tested though)

> So I've had to go through and change everywhere that variable occurs
> with CMAKE_RUNTIME_OUTPUT_DIRECTORY, and replace LIBRARY_OUTPUT_PATH
> with CMAKE_LIBRARY_OUTPUT_DIRECTORY.
>
> Now, ideally, you should be able set those CMAKE_*_OUTPUT_DIRECTORY
> variables in your top level Makefile, and then the path properties for
> targets are set, and everybody's happy.
>
> But this isn't the case with, for example ADD_TEST.  ADD_TEST will
> search for the named executable in a number of places, but not,
> apparently, in CMAKE_RUNTIME_OUTPUT_DIRECTORY.  So you must do your
> add test like this
>
> add_test(gumby ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/gumbyTest args)

Kind of ugly, I would say.
I would say that this may be due to the fact that ADD_TEST may accept
test executable which are not TARGET. Doc says:

"Exename can be either an executable built by this project
  or an arbitrary executable   on the system"

moreover:
"The test will be run with the current
       working directory set to the CMakeList.txt files corresponding
       directory in the binary tree."


I would have expected that ctest finds the executable **anywhere**
if this executable is a target built by CMake (in the same project)
however it doesn't seems to be the case.

May be it's worth a feature request? or a bug report?

> So I guess the question is this -- how should I manage this issue?

Currently I would say enforce xxxx_OUTPUT_USAGE policy for
the concerned project.

-- 
Erk


More information about the CMake mailing list