[CMake] CMake generated rule is not recognized by make or dependency order?

Tao Zhang zhangt3 at cs.rpi.edu
Mon Jan 30 19:18:51 EST 2006


I have an executable depends on some nonexisting  files.I use 
ADD_CUSTOM_COMMAND to produce these files. However, make reports "no 
rule" errors even rules are there.  Type "make envC.cpp" directly works 
instead.

The rule in the Makefile:
 
envC.cpp: /home/ship2rr/hdrsfaults.h
    @echo "Building Custom command envC.cpp..."
    /usr/bin/soapcpp2 -x -w -L -n -penv /home/ship2rr/hdrsfaults.h

scheduler: $(scheduler_SRC_OBJS) $(scheduler_EXTERNAL_OBJS) 
$(scheduler_DEPEND_LIBS)
    @echo "Building executable /home/ship2rr/test/scheduler..."
    c++  -fPIC  $(scheduler_SRC_OBJS) $(scheduler_EXTERNAL_OBJS)   -o 
/home/ship2rr/test/scheduler ...

Here is output from make:

Reading makefiles...
Reading makefile `Makefile'...
Reading makefile `cmake.depends' (search path) (no ~ expansion)...
Updating goal targets....
Considering target file `scheduler'.
 File `scheduler' does not exist.
  Considering target file `/home/ship2rr/test/scheduler'.
   File `/home/ship2rr/test/scheduler' does not exist.
    Considering target file `envC.o'.
     File `envC.o' does not exist.
      Considering target file `/home/ship2rr/test/envC.cpp'.
       File `/home//ship2rr/test/envC.cpp' does not exist.
       Finished prerequisites of target file `/home/ship2rr/test/envC.cpp'.
      Must remake target `/home/seePort/ship2rr/test/envC.cpp'.
make: *** No rule to make target `/home/ship2rr/test/envC.cpp', needed 
by `envC.o'.  Stop.

Here is my CMakeLists.txt
###############################################
PROJECT (SEEPORT_SCHEDULER)

SET (SOAP_OBJS ... # here are some soap files)
SET (KALMAN_OBJS .. # here are some cpp files)
SET(GSOAP /usr/bin/soapcpp2)
SET(GSFLAGS -x -w -L -n)
...
 
# the first seven (7) cpp files do not exist
ADD_EXECUTABLE(scheduler envC.cpp ssServer.cpp ssC.cpp psClient.cpp 
psC.cpp tsClient.cpp tsC.cpp
${PROJECT_SOURCE_DIR}/schedMain.cpp ${SOAP_OBJS} ${KALMAN_OBJS}
)

???????????????????????????????????????????????????
# these target will generate those nonexisting files
ADD_CUSTOM_TARGET(ptzTarget ALL ${GSOAP} ${GSFLAGS} 
${PROJECT_SOURCE_DIR}/ptzsvc.h)
ADD_CUSTOM_TARGET(schTarget ALL ${GSOAP} ${GSFLAGS} 
${PROJECT_SOURCE_DIR}/schedsvc.h)
ADD_CUSTOM_TARGET(thrTarget ALL ${GSOAP} ${GSFLAGS} 
${PROJECT_SOURCE_DIR}/threatsvc.hh)
ADD_CUSTOM_TARGET(envcTarget ALL ${GSOAP} ${GSFLAGS} 
${PROJECT_SOURCE_DIR}/hdrsfaults.h)

ADD_DEPENDENCIES(scheduler ptzTarget schTarget thrTarget envcTaret)
??????????????????????????????????????????????????

SET_SOURCE_FILES_PROPERTIES(pfile envC.cpp ssServer.cpp ssC.cpp 
psClient.cpp psC.cpp tsClient.cpp tsC.cpp
PROPERTIES GENERATED TRUE)

# show one out of six ADD_CUSTOM_COMMAND
FOREACH(pfile psC.cpp psClient.cpp psServer.cpp)
    ADD_CUSTOM_COMMAND(OUTPUT ${pfile}
    COMMAND ${GSOAP}
    ARGS ${GSFLAGS} ${PROJECT_SOURCE_DIR}/ptzsvc.h
    DEPENDS ${PROJECT_SOURCE_DIR}/ptzsvc.h)
ENDFOREACH(pfile)
####################################################
 

My questions are:
A) Is this a bug of cmake or how can I correct it to make it work?

B) If I use ADD_CUSTOM_TARGET and ADD_DEPENDENCIES as showed between 
question marks, it will not work. It still compiles encV.cpp first 
instead of producing custom-defined targets. However, if I manually move 
$(scheduler_DEPEND_LIBS) before $(scheduler_SRC_OBJS) in the above 
second rule,
it works. How can I make sure my custome-defined targets be built first 
or is there a method to specify the order of dependencies?

Thank,

Tao



More information about the CMake mailing list