|
From: <ai...@us...> - 2009-09-16 04:06:56
|
Revision: 10414
http://plplot.svn.sourceforge.net/plplot/?rev=10414&view=rev
Author: airwin
Date: 2009-09-16 04:06:46 +0000 (Wed, 16 Sep 2009)
Log Message:
-----------
Implemented a new building method for OCaml bindings following encouragement
and advice from Hez. However, if you do use -DOCAML_NEW_BUILD=ON to try this
new method, you will find that ocaml examples do not build with a Unbound
module Plplot error. In other words, this new method needs work from Hez
(probably on what is linked) to get it to work completely. For now
OCAML_NEW_BUILD is OFF by default.
Modified Paths:
--------------
trunk/bindings/ocaml/CMakeLists.txt
Modified: trunk/bindings/ocaml/CMakeLists.txt
===================================================================
--- trunk/bindings/ocaml/CMakeLists.txt 2009-09-15 18:22:02 UTC (rev 10413)
+++ trunk/bindings/ocaml/CMakeLists.txt 2009-09-16 04:06:46 UTC (rev 10414)
@@ -22,70 +22,201 @@
if(ENABLE_ocaml)
- option(OCAML_EXPERIMENTAL_BUILD "Try experimental OCaml build?" OFF)
- if(OCAML_EXPERIMENTAL_BUILD)
- #experimental CMake logic to build ocaml bindings for PLplot.
- set(camlidl_GENERATED_SOURCE
- ${CMAKE_CURRENT_BINARY_DIR}/plplot_core.h
- ${CMAKE_CURRENT_BINARY_DIR}/plplot_core.ml
- ${CMAKE_CURRENT_BINARY_DIR}/plplot_core.mli
- ${CMAKE_CURRENT_BINARY_DIR}/plplot_core_stubs.c
- )
- # file must occur in the directory where
- # the output files are generated.
- add_custom_command(
- OUTPUT
- ${CMAKE_CURRENT_BINARY_DIR}/plplot_core.idl
-# ${CMAKE_CURRENT_BINARY_DIR}/plplot_impl.c
- COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/plplot_core.idl ${CMAKE_CURRENT_BINARY_DIR}/plplot_core.idl
-# COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/plplot_impl.c ${CMAKE_CURRENT_BINARY_DIR}/plplot_impl.c
- DEPENDS
- ${CMAKE_CURRENT_SOURCE_DIR}/plplot_core.idl
-# ${CMAKE_CURRENT_SOURCE_DIR}/plplot_impl.c
- )
+ option(OCAML_NEW_BUILD "Try new detailed OCaml build method?" OFF)
+ if(OCAML_NEW_BUILD)
- add_custom_command(
- OUTPUT ${camlidl_GENERATED_SOURCE}
- COMMAND camlidl -header -I ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/plplot_core.idl
- DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/plplot_core.idl
- WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
- )
+ #Detailed CMake logic to build ocaml bindings for PLplot.
+ set(camlidl_GENERATED_SOURCE
+ ${CMAKE_CURRENT_BINARY_DIR}/plplot_core.h
+ ${CMAKE_CURRENT_BINARY_DIR}/plplot_core.ml
+ ${CMAKE_CURRENT_BINARY_DIR}/plplot_core.mli
+ ${CMAKE_CURRENT_BINARY_DIR}/plplot_core_stubs.c
+ )
- add_custom_command(
- OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/plplot_core_stubs.o
- COMMAND ocamlc -verbose -c ${CMAKE_CURRENT_BINARY_DIR}/plplot_core_stubs.c
- DEPENDS
- ${CMAKE_CURRENT_BINARY_DIR}/plplot_core_stubs.c
- WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
- )
+ add_custom_command(
+ OUTPUT
+ ${CMAKE_CURRENT_BINARY_DIR}/plplot_core.idl
+ ${camlidl_GENERATED_SOURCE}
+ # camlidl source file must be in ${CMAKE_CURRENT_BINARY_DIR}.
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/plplot_core.idl ${CMAKE_CURRENT_BINARY_DIR}/plplot_core.idl
+ COMMAND camlidl -header -I ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/plplot_core.idl
+ DEPENDS
+ ${CMAKE_CURRENT_SOURCE_DIR}/plplot_core.idl
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ )
- add_custom_command(
- OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/plplot_impl.o
- COMMAND ocamlc -verbose -ccopt -I${CMAKE_SOURCE_DIR}/include -ccopt -I${CMAKE_BINARY_DIR}/include -ccopt -I${CMAKE_SOURCE_DIR}/lib/qsastime -c ${CMAKE_CURRENT_SOURCE_DIR}/plplot_impl.c
- DEPENDS
- ${CMAKE_CURRENT_SOURCE_DIR}/plplot_impl.c
- WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
- )
+ add_custom_command(
+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/plplot_core_stubs.o
+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/plplot_impl.o
+ ${CMAKE_CURRENT_BINARY_DIR}/dllplplot_stubs.so
+ ${CMAKE_CURRENT_BINARY_DIR}/libplplot_stubs.a
+ COMMAND ocamlc -verbose -c ${CMAKE_CURRENT_BINARY_DIR}/plplot_core_stubs.c
+ COMMAND ocamlc -verbose -ccopt -I${CMAKE_SOURCE_DIR}/include -ccopt -I${CMAKE_BINARY_DIR}/include -ccopt -I${CMAKE_SOURCE_DIR}/lib/qsastime -c ${CMAKE_CURRENT_SOURCE_DIR}/plplot_impl.c
+ COMMAND ocamlmklib -v -o plplot_stubs -L${CAMLIDL_LIB_DIR} -lcamlidl -L${CMAKE_BINARY_DIR}/src -dllpath ${CMAKE_BINARY_DIR}/src -lplplot${LIB_TAG} ${CMAKE_CURRENT_BINARY_DIR}/plplot_core_stubs.o ${CMAKE_CURRENT_BINARY_DIR}/plplot_impl.o
+ DEPENDS
+ ${CMAKE_CURRENT_BINARY_DIR}/plplot_core_stubs.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/plplot_impl.c
+ plplot${LIB_TAG}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ )
+ add_custom_target(target_lib_plplot_stubs
+ DEPENDS
+ ${CMAKE_CURRENT_BINARY_DIR}/dllplplot_stubs.so
+ ${CMAKE_CURRENT_BINARY_DIR}/libplplot_stubs.a
+ )
- add_custom_command(
- OUTPUT
- ${CMAKE_CURRENT_BINARY_DIR}/dllplplot_stubs.so
- ${CMAKE_CURRENT_BINARY_DIR}/libplplot_stubs.a
- COMMAND ocamlmklib -v -o plplot_stubs -L${CAMLIDL_LIB_DIR} -dllpath ${CAMLIDL_LIB_DIR} -lcamlidl -lcamlrun_shared -L${CMAKE_BINARY_DIR}/src -dllpath ${CMAKE_BINARY_DIR}/src -lplplot${LIB_TAG} ${CMAKE_CURRENT_BINARY_DIR}/plplot_core_stubs.o ${CMAKE_CURRENT_BINARY_DIR}/plplot_impl.o
- DEPENDS
- ${CMAKE_CURRENT_BINARY_DIR}/plplot_core_stubs.o
- ${CMAKE_CURRENT_BINARY_DIR}/plplot_impl.o
- plplot${LIB_TAG}
- WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
- )
+ add_custom_command(
+ OUTPUT
+ ${CMAKE_CURRENT_BINARY_DIR}/plplot_core.cmi
+ ${CMAKE_CURRENT_BINARY_DIR}/plplot.mli
+ ${CMAKE_CURRENT_BINARY_DIR}/plplot.cmi
+ COMMAND ocamlc -verbose -c ${CMAKE_CURRENT_BINARY_DIR}/plplot_core.mli
+ # ocamlc *.mli source file must be in ${CMAKE_CURRENT_BINARY_DIR}.
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/plplot.mli ${CMAKE_CURRENT_BINARY_DIR}/plplot.mli
+ COMMAND ocamlc -verbose -c ${CMAKE_CURRENT_BINARY_DIR}/plplot.mli
+ DEPENDS
+ ${CMAKE_CURRENT_BINARY_DIR}/plplot_core.mli
+ ${CMAKE_CURRENT_SOURCE_DIR}/plplot.mli
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ )
+ add_custom_target(target_plplot_core_cmi
+ DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/plplot_core.cmi
+ )
- add_custom_target(experimental DEPENDS
- ${CMAKE_CURRENT_BINARY_DIR}/dllplplot_stubs.so
- ${CMAKE_CURRENT_BINARY_DIR}/libplplot_stubs.a
- )
- #end of experiment
- else(OCAML_EXPERIMENTAL_BUILD)
+ add_custom_command(
+ OUTPUT
+ ${CMAKE_CURRENT_BINARY_DIR}/plplot_core.cmo
+ ${CMAKE_CURRENT_BINARY_DIR}/plplot_core.cmx
+ ${CMAKE_CURRENT_BINARY_DIR}/plplot_core.o
+ ${CMAKE_CURRENT_BINARY_DIR}/plplot.ml
+ ${CMAKE_CURRENT_BINARY_DIR}/plplot.cmo
+ ${CMAKE_CURRENT_BINARY_DIR}/plplot.cmx
+ ${CMAKE_CURRENT_BINARY_DIR}/plplot.o
+ COMMAND ocamlc -verbose -c ${CMAKE_CURRENT_BINARY_DIR}/plplot_core.ml
+ COMMAND ocamlopt -verbose -c ${CMAKE_CURRENT_BINARY_DIR}/plplot_core.ml
+ # ocamlc and ocamlopt *.ml source file must be in
+ # ${CMAKE_CURRENT_BINARY_DIR}.
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/plplot.ml ${CMAKE_CURRENT_BINARY_DIR}/plplot.ml
+ COMMAND ocamlc -verbose -c ${CMAKE_CURRENT_BINARY_DIR}/plplot.ml
+ COMMAND ocamlopt -verbose -c ${CMAKE_CURRENT_BINARY_DIR}/plplot.ml
+ DEPENDS
+ ${CMAKE_CURRENT_BINARY_DIR}/plplot_core.ml
+ ${CMAKE_CURRENT_SOURCE_DIR}/plplot.ml
+ ${CMAKE_CURRENT_BINARY_DIR}/plplot_core.cmi
+ ${CMAKE_CURRENT_BINARY_DIR}/plplot.cmi
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ )
+ add_custom_target(target_plplot_core_cmo
+ DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/plplot_core.cmo
+ )
+ add_custom_command(
+ OUTPUT
+ ${CMAKE_CURRENT_BINARY_DIR}/plplot.cma
+ ${CMAKE_CURRENT_BINARY_DIR}/plplot.cmxa
+ ${CMAKE_CURRENT_BINARY_DIR}/plplot.a
+ COMMAND ocamlc -verbose -a -custom -ccopt -L${CMAKE_CURRENT_BINARY_DIR} -cclib -lplplot_stubs -ccopt -L${CMAKE_BINARY_DIR}/src -cclib -lplplot${LIB_TAG} -o ${CMAKE_CURRENT_BINARY_DIR}/plplot.cma ${CMAKE_CURRENT_BINARY_DIR}/plplot_core.cmo ${CMAKE_CURRENT_BINARY_DIR}/plplot.cmo
+# COMMAND ocamlc -verbose -a -custom -o ${CMAKE_CURRENT_BINARY_DIR}/plplot.cma ${CMAKE_CURRENT_BINARY_DIR}/plplot_core.cmo ${CMAKE_CURRENT_BINARY_DIR}/plplot.cmo
+ COMMAND ocamlopt -verbose -a -ccopt -L${CMAKE_CURRENT_BINARY_DIR} -cclib -lplplot_stubs -ccopt -L${CMAKE_BINARY_DIR}/src -cclib -lplplot${LIB_TAG} -o ${CMAKE_CURRENT_BINARY_DIR}/plplot.cmxa ${CMAKE_CURRENT_BINARY_DIR}/plplot_core.cmx ${CMAKE_CURRENT_BINARY_DIR}/plplot.cmx
+ DEPENDS
+ ${CMAKE_CURRENT_BINARY_DIR}/plplot_core.cmo
+ ${CMAKE_CURRENT_BINARY_DIR}/plplot.cmo
+ ${CMAKE_CURRENT_BINARY_DIR}/plplot_core.cmx
+ ${CMAKE_CURRENT_BINARY_DIR}/plplot.cmx
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ )
+ add_custom_target(target_plplot_cma
+ DEPENDS
+ ${CMAKE_CURRENT_BINARY_DIR}/plplot.cma
+ ${CMAKE_CURRENT_BINARY_DIR}/plplot.cmxa
+ )
+
+ # These targets depend on common files in their respective
+ # file-dependency chains. Therefore, to avoid screwing up parallel
+ # builds must serialize with target depends.
+ add_dependencies(target_plplot_core_cmi target_lib_plplot_stubs)
+ add_dependencies(target_plplot_core_cmo target_plplot_core_cmi)
+ add_dependencies(target_plplot_cma target_plplot_core_cmo)
+
+ # Basic build done, now trying to finish up by adapting bits
+ # and pieces of old build procedure below.
+
+ # Configure the META file
+ # Configure pkg-config *.pc file corresponding to plplot.cma
+ if(PKG_CONFIG_EXECUTABLE)
+ if(LIB_TAG)
+ set(PC_PRECISION "double")
+ else(LIB_TAG)
+ set(PC_PRECISION "single")
+ endif(LIB_TAG)
+ # Each list element must consist of a colon-separated string with the
+ # following fields which are parsed out in the foreach loop below and
+ # used to configure the corresponding pkg-config *.pc file.
+ # BINDING - ENABLE_${BINDING} keeps track of whether a
+ # binding has been enabled (ON) or not (OFF).
+ # Also, ${BINDING} used to determine PC_FILE_SUFFIX
+ # which helps to determine name of configured
+ # *.pc file.
+ # PC_SHORT_NAME - Used in *.pc NAME: field
+ # PC_LONG_NAME - Used in *.pc Description: field
+ # PC_LIBRARY_NAME - Used in *.pc Libs: field
+ # Also used to determine PC_LINK_FLAGS and
+ # PC_COMPILE_FLAGS used in *.pc Libs: and Cflags:
+ # fields.
+ set(PC_DATA "ocaml:::plplot${LIB_TAG}")
+
+ string(REGEX REPLACE "^(.*):.*:.*:.*$" "\\1" BINDING ${PC_DATA})
+ set(PC_FILE_SUFFIX "-${BINDING}")
+ set(PC_REQUIRES "plplot${LIB_TAG}")
+ string(REGEX REPLACE "^.*:(.*):.*:.*$" "\\1" PC_SHORT_NAME ${PC_DATA})
+ string(REGEX REPLACE "^.*:.*:(.*):.*$" "\\1" PC_LONG_NAME ${PC_DATA})
+ string(REGEX REPLACE "^.*:.*:.*:(.*)$" "\\1" PC_LIBRARY_NAME ${PC_DATA})
+ set(PC_LINK_FLAGS "${lib${PC_LIBRARY_NAME}_LINK_FLAGS}")
+ set(PC_COMPILE_FLAGS "${lib${PC_LIBRARY_NAME}_COMPILE_FLAGS}")
+ set(PC_LINK_FLAGS "-l${PC_LIBRARY_NAME} ${PC_LINK_FLAGS}")
+ set(PC_CONFIGURED_FILE
+ ${CMAKE_BINARY_DIR}/pkgcfg/plplot${LIB_TAG}${PC_FILE_SUFFIX}.pc
+ )
+ configure_file(
+ ${CMAKE_SOURCE_DIR}/pkgcfg/plplot-template.pc.cmake
+ ${PC_CONFIGURED_FILE}
+ @ONLY
+ )
+ install(FILES ${PC_CONFIGURED_FILE} DESTINATION ${PKG_CONFIG_DIR})
+ configure_file(META.cmake ${CMAKE_CURRENT_BINARY_DIR}/META)
+ endif(PKG_CONFIG_EXECUTABLE)
+
+ add_custom_target(plplot_ocaml ALL)
+ add_dependencies(plplot_ocaml target_plplot_cma)
+
+ # Need to keep track of file dependencies since this is a custom target.
+ set_property(GLOBAL PROPERTY FILES_plplot_ocaml
+ ${CMAKE_CURRENT_BINARY_DIR}/plplot.cma
+ ${CMAKE_CURRENT_BINARY_DIR}/plplot.cmxa
+ ${CMAKE_CURRENT_BINARY_DIR}/plplot.a
+ )
+
+ set(OCAML_FULL_INSTALL_FILES
+ plplot.cma
+ plplot.cmxa
+ plplot.a
+ plplot.cmi
+ libplplot_stubs.a
+ plplot.mli
+ )
+
+ # Most files go in the plplot subdirectory
+ install(FILES ${OCAML_FULL_INSTALL_FILES} ${CMAKE_CURRENT_BINARY_DIR}/META
+ DESTINATION ${OCAML_INSTALL_DIR}/plplot
+ )
+
+ # Shared library stubs go in stublibs
+ install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${OCAML_BUILD_DIR}/dllplplot_stubs.so
+ DESTINATION ${OCAML_INSTALL_DIR}/stublibs
+ )
+
+ else(OCAML_NEW_BUILD)
+
set(SOURCE_LIST
libplplot_stubs.clib
plplot_h
@@ -249,6 +380,6 @@
ADDITIONAL_MAKE_CLEAN_FILES
${OCAML_BUILD_DIR}
)
- endif(OCAML_EXPERIMENTAL_BUILD)
+ endif(OCAML_NEW_BUILD)
endif(ENABLE_ocaml)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|