[CMake] Custom command or custom target for jni?

Tyler Roscoe tyler at cryptio.net
Tue Mar 24 12:21:45 EDT 2009


On Tue, Mar 24, 2009 at 04:37:31PM +0100, Jonatan Bijl wrote:
> To compile the native part, a c header file is generated from the java
> class, using the "javah -jni" command. This header file should only be
> generated if:
> 
> It does not exist yet
> 
> The java class changes
> 
>  
> 
> My first attempt was:
> 
> add_custom_command(OUTPUT ${INTERFACE_HEADER_FILE}
>         COMMAND ${JNI_JAVAH} -jni -d ${PROJECT_BINARY_DIR}/include
> ${INTERFACE_JAVA_CLASS}
>         WORKING_DIRECTORY ${COMMON_ROOT_BIN_DIRECTORY}
>        COMMENT "generating jni header file ${INTERFACE_HEADER_FILE}"
>         )
> 
> set_source_files_properties(HelloWorld.c OBJECT_DEPENDS
> ${INTERFACE_HEADER_FILE})
> 
> add_library(HelloWorldNative SHARED HelloWorld.c
> ${INTERFACE_HEADER_FILE})
> 
> cMake however claims there is no rule to make the header file
>
>
>
> I found somebody who used the following:
> 
> add_custom_target(
> 
>         HelloWorldNativeHeader
> 
>         COMMAND ${JNI_JAVAH} -jni -d ${PROJECT_BINARY_DIR}/include
> ${INTERFACE_JAVA_CLASS}
> 
>         WORKING_DIRECTORY ${COMMON_ROOT_BIN_DIRECTORY}
> 
>         COMMENT "generating jni header file ${INTERFACE_HEADER_FILE}"
> 
>         )
> 
> add_library(HelloWorldNative SHARED HelloWorld.c
> ${INTERFACE_HEADER_FILE})
> 
> add_dependencies(HelloWorldNative HelloWorldNativeHeader)
> 

Have you read:

http://www.cmake.org/Wiki/CMake_FAQ#How_can_I_generate_a_source_file_during_the_build.3F

You need both a custom_command and a custom_target. You can use
add_custom_command's DEPENDS argument to insure that the headers are
only regenerated when they are out of date.

hth,
tyler


More information about the CMake mailing list