From f8eac707003be954c0852e855a52fa3c612660da Mon Sep 17 00:00:00 2001
From: Markus Pilman <markus.pilman@snowflake.net>
Date: Fri, 4 May 2018 15:35:27 -0700
Subject: [PATCH] Fixed C bindings DLLEXPORT and Java bindings

---
 bindings/c/CMakeLists.txt      |  13 ++-
 bindings/java/CMakeLists.txt   | 140 +++++++++++++++++++++++++++++++++
 bindings/python/CMakeLists.txt |  53 +++++++++++++
 3 files changed, 203 insertions(+), 3 deletions(-)
 create mode 100644 bindings/java/CMakeLists.txt
 create mode 100644 bindings/python/CMakeLists.txt

diff --git a/bindings/c/CMakeLists.txt b/bindings/c/CMakeLists.txt
index 859a2eed96..b6269e72fb 100644
--- a/bindings/c/CMakeLists.txt
+++ b/bindings/c/CMakeLists.txt
@@ -29,11 +29,18 @@ add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/foundationdb/fdb_c_options
   COMMENT "Generate C options")
 add_custom_target(fdb_c_options DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/foundationdb/fdb_c_options.g.h)
 
-add_library(fdb_c SHARED ${FDB_C_SRCS})
+include(GenerateExportHeader)
+
+add_library(fdb_c SHARED ${FDB_C_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/fdb_c.g.S)
 add_dependencies(fdb_c fdb_c_generated fdb_c_options)
 target_link_libraries(fdb_c PUBLIC fdbclient)
-target_include_directories(fdb_c PUBLIC ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/foundationdb)
-
+target_include_directories(fdb_c PUBLIC
+  ${CMAKE_CURRENT_BINARY_DIR}
+  ${CMAKE_CURRENT_SOURCE_DIR}
+  ${CMAKE_CURRENT_BINARY_DIR}/foundationdb)
+# TODO: re-enable once the old vcxproj-based build system is removed.
+#generate_export_header(fdb_c EXPORT_MACRO_NAME "DLLEXPORT"
+#  EXPORT_FILE_NAME ${CMAKE_CURRENT_BINARY_DIR}/foundationdb/fdb_c_export.h)
 install(TARGETS fdb_c DESTINATION lib64 COMPONENT clients)
 install(FILES foundationdb/fdb_c.h ${CMAKE_CURRENT_BINARY_DIR}/foundationdb/fdb_c_options.g.h ${CMAKE_SOURCE_DIR}/fdbclient/vexillographer/fdb.options
   DESTINATION include/foundationdb COMPONENT clients)
diff --git a/bindings/java/CMakeLists.txt b/bindings/java/CMakeLists.txt
new file mode 100644
index 0000000000..1c90a1889c
--- /dev/null
+++ b/bindings/java/CMakeLists.txt
@@ -0,0 +1,140 @@
+set(JAVA_BINDING_SRCS
+  src/main/com/apple/foundationdb/async/AsyncIterable.java
+  src/main/com/apple/foundationdb/async/AsyncIterator.java
+  src/main/com/apple/foundationdb/async/AsyncUtil.java
+  src/main/com/apple/foundationdb/async/Cancellable.java
+  src/main/com/apple/foundationdb/async/CloneableException.java
+  src/main/com/apple/foundationdb/async/CloseableAsyncIterator.java
+  src/main/com/apple/foundationdb/async/package-info.java
+  src/main/com/apple/foundationdb/Cluster.java
+  src/main/com/apple/foundationdb/Database.java
+  src/main/com/apple/foundationdb/directory/Directory.java
+  src/main/com/apple/foundationdb/directory/DirectoryAlreadyExistsException.java
+  src/main/com/apple/foundationdb/directory/DirectoryException.java
+  src/main/com/apple/foundationdb/directory/DirectoryLayer.java
+  src/main/com/apple/foundationdb/directory/DirectoryMoveException.java
+  src/main/com/apple/foundationdb/directory/DirectoryPartition.java
+  src/main/com/apple/foundationdb/directory/DirectorySubspace.java
+  src/main/com/apple/foundationdb/directory/DirectoryUtil.java
+  src/main/com/apple/foundationdb/directory/DirectoryVersionException.java
+  src/main/com/apple/foundationdb/directory/MismatchedLayerException.java
+  src/main/com/apple/foundationdb/directory/NoSuchDirectoryException.java
+  src/main/com/apple/foundationdb/directory/package-info.java
+  src/main/com/apple/foundationdb/directory/PathUtil.java
+  src/main/com/apple/foundationdb/FDB.java
+  src/main/com/apple/foundationdb/FDBDatabase.java
+  src/main/com/apple/foundationdb/FDBTransaction.java
+  src/main/com/apple/foundationdb/FutureCluster.java
+  src/main/com/apple/foundationdb/FutureDatabase.java
+  src/main/com/apple/foundationdb/FutureKey.java
+  src/main/com/apple/foundationdb/FutureResult.java
+  src/main/com/apple/foundationdb/FutureResults.java
+  src/main/com/apple/foundationdb/FutureStrings.java
+  src/main/com/apple/foundationdb/FutureVersion.java
+  src/main/com/apple/foundationdb/FutureVoid.java
+  src/main/com/apple/foundationdb/JNIUtil.java
+  src/main/com/apple/foundationdb/KeySelector.java
+  src/main/com/apple/foundationdb/KeyValue.java
+  src/main/com/apple/foundationdb/LocalityUtil.java
+  src/main/com/apple/foundationdb/NativeFuture.java
+  src/main/com/apple/foundationdb/NativeObjectWrapper.java
+  src/main/com/apple/foundationdb/OptionConsumer.java
+  src/main/com/apple/foundationdb/OptionsSet.java
+  src/main/com/apple/foundationdb/package-info.java
+  src/main/com/apple/foundationdb/Range.java
+  src/main/com/apple/foundationdb/RangeQuery.java
+  src/main/com/apple/foundationdb/RangeResult.java
+  src/main/com/apple/foundationdb/RangeResultInfo.java
+  src/main/com/apple/foundationdb/RangeResultSummary.java
+  src/main/com/apple/foundationdb/ReadTransaction.java
+  src/main/com/apple/foundationdb/ReadTransactionContext.java
+  src/main/com/apple/foundationdb/subspace/package-info.java
+  src/main/com/apple/foundationdb/subspace/Subspace.java
+  src/main/com/apple/foundationdb/Transaction.java
+  src/main/com/apple/foundationdb/TransactionContext.java
+  src/main/com/apple/foundationdb/tuple/ByteArrayUtil.java
+  src/main/com/apple/foundationdb/tuple/IterableComparator.java
+  src/main/com/apple/foundationdb/tuple/package-info.java
+  src/main/com/apple/foundationdb/tuple/Tuple.java
+  src/main/com/apple/foundationdb/tuple/TupleUtil.java
+  src/main/com/apple/foundationdb/tuple/Versionstamp.java)
+
+set(JAVA_TESTS_SRCS
+  src/test/com/apple/foundationdb/test/AbstractTester.java
+  src/test/com/apple/foundationdb/test/AsyncDirectoryExtension.java
+  src/test/com/apple/foundationdb/test/AsyncStackTester.java
+  src/test/com/apple/foundationdb/test/BlockingBenchmark.java
+  src/test/com/apple/foundationdb/test/ConcurrentGetSetGet.java
+  src/test/com/apple/foundationdb/test/Context.java
+  src/test/com/apple/foundationdb/test/ContinuousSample.java
+  src/test/com/apple/foundationdb/test/DirectoryExtension.java
+  src/test/com/apple/foundationdb/test/DirectoryOperation.java
+  src/test/com/apple/foundationdb/test/DirectoryTest.java
+  src/test/com/apple/foundationdb/test/DirectoryUtil.java
+  src/test/com/apple/foundationdb/test/Example.java
+  src/test/com/apple/foundationdb/test/Instruction.java
+  src/test/com/apple/foundationdb/test/IterableTest.java
+  src/test/com/apple/foundationdb/test/LocalityTests.java
+  src/test/com/apple/foundationdb/test/ParallelRandomScan.java
+  src/test/com/apple/foundationdb/test/PerformanceTester.java
+  src/test/com/apple/foundationdb/test/RangeTest.java
+  src/test/com/apple/foundationdb/test/RYWBenchmark.java
+  src/test/com/apple/foundationdb/test/SerialInsertion.java
+  src/test/com/apple/foundationdb/test/SerialIteration.java
+  src/test/com/apple/foundationdb/test/SerialTest.java
+  src/test/com/apple/foundationdb/test/Stack.java
+  src/test/com/apple/foundationdb/test/StackEntry.java
+  src/test/com/apple/foundationdb/test/StackOperation.java
+  src/test/com/apple/foundationdb/test/StackTester.java
+  src/test/com/apple/foundationdb/test/StackUtils.java
+  src/test/com/apple/foundationdb/test/TesterArgs.java
+  src/test/com/apple/foundationdb/test/TestResult.java
+  src/test/com/apple/foundationdb/test/TupleTest.java
+  src/test/com/apple/foundationdb/test/VersionstampSmokeTest.java
+  src/test/com/apple/foundationdb/test/WatchTest.java
+  src/test/com/apple/foundationdb/test/WhileTrueTest.java)
+
+set(GENERATED_JAVA_DIR ${CMAKE_CURRENT_BINARY_DIR}/src/main/com/foundationdb)
+file(MAKE_DIRECTORY ${GENERATED_JAVA_DIR})
+
+set(GENERATED_JAVA_FILES
+  ${GENERATED_JAVA_DIR}/ClusterOptions.java
+  ${GENERATED_JAVA_DIR}/ConflictRangeType.java
+  ${GENERATED_JAVA_DIR}/DatabaseOptions.java
+  ${GENERATED_JAVA_DIR}/MutationType.java
+  ${GENERATED_JAVA_DIR}/NetworkOptions.java
+  ${GENERATED_JAVA_DIR}/StreamingMode.java
+  ${GENERATED_JAVA_DIR}/TransactionOptions.java
+  ${GENERATED_JAVA_DIR}/FDBException.java)
+
+add_custom_command(OUTPUT ${GENERATED_JAVA_FILES}
+  COMMAND ${MONO_EXECUTABLE} ${VEXILLOGRAPHER_EXE} ${CMAKE_SOURCE_DIR}/fdbclient/vexillographer/fdb.options java ${GENERATED_JAVA_DIR}
+  DEPENDS ${CMAKE_SOURCE_DIR}/fdbclient/vexillographer/fdb.options vexillographer
+  COMMENT "Generate Java options")
+add_custom_target(fdb_java_options DEPENDS ${GENERATED_JAVA_DIR}/StreamingMode.java)
+
+set(SYSTEM_NAME "linux")
+if (APPLE)
+  set(SYSTEM_NAME "osx")
+endif()
+
+add_library(fdb_java SHARED fdbJNI.cpp)
+message(DEBUG ${JNI_INCLUDE_DIRS})
+message(DEBUG ${JNI_LIBRARIES})
+target_include_directories(fdb_java PRIVATE ${JNI_INCLUDE_DIRS})
+# libfdb_java.so is loaded by fdb-java.jar and doesn't need to depened on jvm shared libraries.
+target_link_libraries(fdb_java PRIVATE fdb_c)
+set_target_properties(fdb_java PROPERTIES
+  LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib/${SYSTEM_NAME}/amd64/)
+
+set(CMAKE_JAVA_COMPILE_FLAGS "-source" "1.8" "-target" "1.8")
+set(CMAKE_JNI_TARGET TRUE)
+set(JAR_VERSION "${FDB_MAJOR}.${FDB_MINOR}.${FDB_REVISION}")
+add_jar(fdb-java ${JAVA_BINDING_SRCS} ${GENERATED_JAVA_FILES}
+  OUTPUT_DIR ${PROJECT_BINARY_DIR}/lib)
+add_dependencies(fdb-java fdb_java_options fdb_java)
+add_jar(foundationdb-tests SOURCES ${JAVA_TESTS_SRCS} INCLUDE_JARS fdb-java)
+add_dependencies(foundationdb-tests fdb_java_options)
+
+install_jar(fdb-java DESTINATION share/java COMPONENT clients)
+install(TARGETS fdb_java DESTINATION lib64 COMPONENT clients)
diff --git a/bindings/python/CMakeLists.txt b/bindings/python/CMakeLists.txt
new file mode 100644
index 0000000000..4a1040d238
--- /dev/null
+++ b/bindings/python/CMakeLists.txt
@@ -0,0 +1,53 @@
+set(SRCS
+  fdb/__init__.py
+  fdb/directory_impl.py
+  fdb/impl.py
+  fdb/locality.py
+  fdb/six.py
+  fdb/subspace_impl.py
+  fdb/tuple.py)
+
+if(APPLE)
+  list(APPEND SRCS fdb/libfdb_c.dylib.pth)
+else()
+  list(APPEND SRCS fdb/libfdb_c.so.pth)
+endif()
+
+set(out_files "")
+foreach(src ${SRCS})
+  get_filename_component(dirname ${src} DIRECTORY)
+  get_filename_component(extname ${src} EXT)
+  add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/bindings/python/${src}
+	COMMAND mkdir -p ${PROJECT_BINARY_DIR}/bindings/python/${dirname}
+	COMMAND cp ${src} ${PROJECT_BINARY_DIR}/bindings/python/${dirname}/
+	DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${src}
+	WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+	COMMENT "copy ${src}")
+  set(out_files "${out_files};${PROJECT_BINARY_DIR}/bindings/python/${src}")
+  if(${extname} STREQUAL ".py")
+    add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/bindings/python/${src}c
+      COMMAND python -m py_compile ${PROJECT_BINARY_DIR}/bindings/python/${src}
+      DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${src} ${CMAKE_CURRENT_BINARY_DIR}/${src}
+      WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/bindings/python/${dirname}
+      COMMENT "compile ${src}")
+    set(out_files "${out_files};${PROJECT_BINARY_DIR}/bindings/python/${src}c")
+  endif()
+endforeach()
+add_custom_target(python_binding ALL DEPENDS ${out_files})
+
+file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/bindings/python/fdb)
+set(options_file ${PROJECT_BINARY_DIR}/bindings/python/fdb/fdboptions.py)
+add_custom_command(OUTPUT ${options_file} ${options_file}c
+  COMMAND ${MONO_EXECUTABLE} ${VEXILLOGRAPHER_EXE} ${CMAKE_SOURCE_DIR}/fdbclient/vexillographer/fdb.options python ${options_file}
+  COMMAND python -m py_compile ${options_file}
+  DEPENDS ${PROJECT_SOURCE_DIR}/fdbclient/vexillographer/fdb.options vexillographer
+  COMMENT "Generate Python options")
+add_custom_target(fdb_python_options DEPENDS
+  ${options_file}
+  ${PROJECT_SOURCE_DIR}/fdbclient/vexillographer/fdb.options
+  vexillographer)
+
+add_dependencies(python_binding fdb_python_options)
+
+set(out_files "${out_files};${options_file};${options_file}c")
+install(FILES ${out_files} DESTINATION lib64/python2.6/site-packages/fdb COMPONENT clients)