diff --git a/.travis.yml b/.travis.yml index fef84a473a..745859a576 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,7 +40,6 @@ matrix: - libsparsehash-dev sources: - ubuntu-toolchain-r-test - before_script: ./gradlew script: ./cppbuild/cppbuild - env: COMPILER=g++-7 @@ -54,7 +53,6 @@ matrix: - libsparsehash-dev sources: - ubuntu-toolchain-r-test - before_script: ./gradlew script: ./cppbuild/cppbuild - env: COMPILER=g++-8 @@ -68,7 +66,6 @@ matrix: - libsparsehash-dev sources: - ubuntu-toolchain-r-test - before_script: ./gradlew script: ./cppbuild/cppbuild - env: COMPILER=clang++-4.0 @@ -84,7 +81,6 @@ matrix: sources: - ubuntu-toolchain-r-test - llvm-toolchain-trusty-4.0 - before_script: ./gradlew script: ./cppbuild/cppbuild - env: COMPILER=clang++-5.0 @@ -100,7 +96,6 @@ matrix: sources: - ubuntu-toolchain-r-test - llvm-toolchain-trusty-5.0 - before_script: ./gradlew script: ./cppbuild/cppbuild - env: COMPILER=clang++-6.0 @@ -116,14 +111,12 @@ matrix: sources: - ubuntu-toolchain-r-test - llvm-toolchain-trusty-6.0 - before_script: ./gradlew script: ./cppbuild/cppbuild - env: COMPILER=clang++ language: c++ compiler: clang os: osx - before_script: ./gradlew script: ./cppbuild/cppbuild before_cache: diff --git a/CMakeLists.txt b/CMakeLists.txt index 96b8205570..f2780cc842 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,26 +25,44 @@ project("sbe" VERSION "${SBE_VERSION_NUMERIC}") include(ExternalProject) include(CheckLibraryExists) -enable_testing() +if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}) + set(STANDALONE_BUILD TRUE) +endif() + +option(SBE_TESTS "Enable tests" ${STANDALONE_BUILD}) +option(SBE_BUILD_SAMPLES "Enable building the sample projects" ${STANDALONE_BUILD}) +option(SBE_BUILD_BENCHMARKS "Enable building the benchmarks" ${STANDALONE_BUILD}) + +unset(STANDALONE_BUILD) + +if(SBE_TESTS) + enable_testing() +endif() # default built type is Release if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build" FORCE) endif(NOT CMAKE_BUILD_TYPE) -ExternalProject_Add( - gtest - URL ${CMAKE_CURRENT_SOURCE_DIR}/sbe-tool/src/test/lib/gtest-1.7.0.zip - URL_MD5 2d6ec8ccdf5c46b05ba54a9fd1d130d7 - INSTALL_COMMAND "" - LOG_CONFIGURE ON - LOG_BUILD ON -) - -ExternalProject_Get_Property(gtest source_dir) -set(GTEST_SOURCE_DIR ${source_dir}) -ExternalProject_Get_Property(gtest binary_dir) -set(GTEST_BINARY_DIR ${binary_dir}) +if(SBE_TESTS) + set(SBE_THIRDPARTY_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/thirdparty") + + ExternalProject_Add( + gtest + URL ${CMAKE_CURRENT_SOURCE_DIR}/sbe-tool/src/test/lib/gtest-1.7.0.zip + URL_MD5 2d6ec8ccdf5c46b05ba54a9fd1d130d7 + PREFIX "${SBE_THIRDPARTY_BINARY_DIR}/gtest" + BUILD_BYPRODUCTS "${SBE_THIRDPARTY_BINARY_DIR}/gtest/src/gtest-build/${CMAKE_CFG_INTDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}gtest${CMAKE_STATIC_LIBRARY_SUFFIX};${SBE_THIRDPARTY_BINARY_DIR}/gtest/src/gtest-build/${CMAKE_CFG_INTDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}gtest_main${CMAKE_STATIC_LIBRARY_SUFFIX}" + INSTALL_COMMAND "" + LOG_CONFIGURE ON + LOG_BUILD ON + ) + + ExternalProject_Get_Property(gtest source_dir) + set(GTEST_SOURCE_DIR ${source_dir}) + ExternalProject_Get_Property(gtest binary_dir) + set(GTEST_BINARY_DIR ${binary_dir}) +endif() find_package(Threads) @@ -55,16 +73,16 @@ if(UNIX) endif() if(APPLE) - # -Wall doesn't enable everything we want to see - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wsign-compare") - add_definitions(-DDarwin) + # -Wall doesn't enable everything we want to see + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wsign-compare") + add_definitions(-DDarwin) elseif(MSVC) - add_definitions(-DWIN32) + add_definitions(-DWIN32) set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd /Od /Zi") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT") else() - add_definitions(-D_GNU_SOURCE) + add_definitions(-D_GNU_SOURCE) endif() set(LIBPREFIX "${CMAKE_STATIC_LIBRARY_PREFIX}") @@ -75,25 +93,51 @@ set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/lib") set(SBE_JAR "${CMAKE_CURRENT_SOURCE_DIR}/sbe-all/build/libs/sbe-all-${SBE_VERSION_TXT}.jar") if(EXISTS "${SBE_JAR}") - message("latest SBE jar found: ${SBE_JAR}") + message("latest SBE jar found: ${SBE_JAR}") else() - message(FATAL_ERROR "could not find latest SBE jar in ${CMAKE_CURRENT_SOURCE_DIR}/sbe-all/build/libs") + message("Generating SBE jar") + execute_process( + COMMAND ./gradlew build -x check -x javadoc --info --stacktrace :sbe-all:build + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + ) endif() +file(GLOB_RECURSE SBE_SOURCES + "${CMAKE_CURRENT_SOURCE_DIR}/sbe-tool/src/main/java/*.java" +) + +add_custom_command(OUTPUT ${SBE_JAR} + COMMAND ./gradlew build -x check -x javadoc --info --stacktrace :sbe-all:build + DEPENDS ${SBE_SOURCES} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT "Generating SBE jar" +) + +add_custom_target(sbe-jar + DEPENDS ${SBE_JAR} +) + set(CODEC_TARGET_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated") set(CODEC_SCHEMA_DIR "${CMAKE_CURRENT_SOURCE_DIR}/sbe-tool/src/test/resources") set(CODEC_PERF_SCHEMA_DIR "${CMAKE_CURRENT_SOURCE_DIR}/sbe-benchmarks/src/main/resources") set(CODEC_EXAMPLES_SCHEMA_DIR "${CMAKE_CURRENT_SOURCE_DIR}/sbe-samples/src/main/resources") include_directories( - ${GTEST_SOURCE_DIR}/include - ${CMAKE_CURRENT_SOURCE_DIR}/sbe-tool/src/main/cpp - ${CODEC_TARGET_DIR} + ${GTEST_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/sbe-tool/src/main/cpp + ${CODEC_TARGET_DIR} ) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/sbe-tool/src/main/cpp) -add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/sbe-tool/src/test/cpp) -add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/sbe-samples/src/main/cpp) -add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/sbe-benchmarks/src/main/cpp) -add_dependencies(sbe ir_codecs) +if(SBE_TESTS) + add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/sbe-tool/src/test/cpp) +endif() + +if(SBE_BUILD_SAMPLES) + add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/sbe-samples/src/main/cpp) +endif() + +if(SBE_BUILD_BENCHMARKS) + add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/sbe-benchmarks/src/main/cpp) +endif() diff --git a/README.md b/README.md index c1d8ca24f0..c4a96f8426 100644 --- a/README.md +++ b/README.md @@ -74,10 +74,6 @@ NOTE: Linux, Mac OS, and Windows only for the moment. See [FAQ](https://github.com/real-logic/simple-binary-encoding/wiki/Frequently-Asked-Questions). Windows builds have been tested with Visual Studio Express 12. -First build using Gradle to generate the SBE jar. - - $ ./gradlew - For convenience, a script is provided that does a full clean, build, and test of all targets as a Release build. $ ./cppbuild/cppbuild diff --git a/sbe-benchmarks/src/main/cpp/CMakeLists.txt b/sbe-benchmarks/src/main/cpp/CMakeLists.txt index eee7a1ee4c..cadc41051d 100644 --- a/sbe-benchmarks/src/main/cpp/CMakeLists.txt +++ b/sbe-benchmarks/src/main/cpp/CMakeLists.txt @@ -19,27 +19,27 @@ find_package(Java REQUIRED) CHECK_LIBRARY_EXISTS(rt clock_gettime "time.h" HAVE_CLOCK_GETTIME_RT) if (CMAKE_BUILD_TYPE STREQUAL "Release") - message("Build type(${CMAKE_BUILD_TYPE}): perf tests turning OFF bounds checks") - add_definitions(-DNDEBUG) - add_definitions(-DSBE_NO_BOUNDS_CHECK) + message("Build type(${CMAKE_BUILD_TYPE}): perf tests turning OFF bounds checks") + add_definitions(-DNDEBUG) + add_definitions(-DSBE_NO_BOUNDS_CHECK) else () - message("Build type(${CMAKE_BUILD_TYPE}): perf tests turning ON bounds checks") + message("Build type(${CMAKE_BUILD_TYPE}): perf tests turning ON bounds checks") endif () set(SRCS_BENCHLET_MAIN benchlet-main.cpp) set(GENERATED_CODECS - ${CODEC_TARGET_DIR}/uk_co_real_logic_sbe_examples_car - ${CODEC_TARGET_DIR}/uk_co_real_logic_sbe_samples_fix + ${CODEC_TARGET_DIR}/uk_co_real_logic_sbe_examples_car + ${CODEC_TARGET_DIR}/uk_co_real_logic_sbe_samples_fix ) set(SBE_CAR_SCHEMA ${CODEC_PERF_SCHEMA_DIR}/car.xml) set(SBE_MD_SCHEMA ${CODEC_PERF_SCHEMA_DIR}/fix-message-samples.xml) add_custom_command( - OUTPUT ${GENERATED_CODECS} - DEPENDS ${SBE_CAR_SCHEMA} ${SBE_MD_SCHEMA} - COMMAND ${Java_JAVA_EXECUTABLE} -Dsbe.output.dir=${CODEC_TARGET_DIR} -Dsbe.target.language="cpp" -jar ${SBE_JAR} ${SBE_CAR_SCHEMA} ${SBE_MD_SCHEMA} + OUTPUT ${GENERATED_CODECS} + DEPENDS ${SBE_CAR_SCHEMA} ${SBE_MD_SCHEMA} sbe-jar ${SBE_JAR} + COMMAND ${Java_JAVA_EXECUTABLE} -Dsbe.output.dir=${CODEC_TARGET_DIR} -Dsbe.target.language="cpp" -jar ${SBE_JAR} ${SBE_CAR_SCHEMA} ${SBE_MD_SCHEMA} ) add_custom_target(perf_codecs DEPENDS ${GENERATED_CODECS}) @@ -49,6 +49,6 @@ add_dependencies(benchlet-sbe-md-runner perf_codecs) add_dependencies(benchlet-sbe-car-runner perf_codecs) if (HAVE_CLOCK_GETTIME_RT) - target_link_libraries(benchlet-sbe-md-runner rt) - target_link_libraries(benchlet-sbe-car-runner rt) + target_link_libraries(benchlet-sbe-md-runner rt) + target_link_libraries(benchlet-sbe-car-runner rt) endif (HAVE_CLOCK_GETTIME_RT) diff --git a/sbe-samples/src/main/cpp/CMakeLists.txt b/sbe-samples/src/main/cpp/CMakeLists.txt index a4eb48da3b..8125e56458 100644 --- a/sbe-samples/src/main/cpp/CMakeLists.txt +++ b/sbe-samples/src/main/cpp/CMakeLists.txt @@ -17,15 +17,15 @@ find_package(Java REQUIRED) set(GENERATED_CODECS - ${CODEC_TARGET_DIR}/baseline + ${CODEC_TARGET_DIR}/baseline ) set(EXAMPLES_SCHEMA ${CODEC_EXAMPLES_SCHEMA_DIR}/example-schema.xml) add_custom_command( - OUTPUT ${GENERATED_CODECS} - DEPENDS ${EXAMPLES_SCHEMA} - COMMAND ${Java_JAVA_EXECUTABLE} -Dsbe.output.dir=${CODEC_TARGET_DIR} -Dsbe.generate.ir="true" -Dsbe.target.language="cpp" -jar ${SBE_JAR} ${EXAMPLES_SCHEMA} + OUTPUT ${GENERATED_CODECS} + DEPENDS ${EXAMPLES_SCHEMA} sbe-jar ${SBE_JAR} + COMMAND ${Java_JAVA_EXECUTABLE} -Dsbe.output.dir=${CODEC_TARGET_DIR} -Dsbe.generate.ir="true" -Dsbe.target.language="cpp" -jar ${SBE_JAR} ${EXAMPLES_SCHEMA} ) add_custom_target(examples_codecs DEPENDS ${GENERATED_CODECS}) diff --git a/sbe-tool/src/main/cpp/CMakeLists.txt b/sbe-tool/src/main/cpp/CMakeLists.txt index e7e132ff1c..44aa7361f4 100644 --- a/sbe-tool/src/main/cpp/CMakeLists.txt +++ b/sbe-tool/src/main/cpp/CMakeLists.txt @@ -14,17 +14,43 @@ # limitations under the License. # +file(GLOB_RECURSE CODECS + "uk_co_real_logic_sbe_ir_generated/*.h" +) + find_package(Java REQUIRED) -add_custom_target( - ir_codecs +if(NOT(CODECS)) + execute_process( + COMMAND + ${Java_JAVA_EXECUTABLE} + "-Dsbe.output.dir=${CMAKE_CURRENT_SOURCE_DIR}" + "-Dsbe.target.language=CPP" + "-jar" "${SBE_JAR}" + "../resources/sbe-ir.xml" + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + ) + + file(GLOB_RECURSE CODECS + "uk_co_real_logic_sbe_ir_generated/*.h" + ) +endif() + +add_custom_command(OUTPUT ${CODECS} + COMMAND ${Java_JAVA_EXECUTABLE} "-Dsbe.output.dir=${CMAKE_CURRENT_SOURCE_DIR}" "-Dsbe.target.language=CPP" "-jar" "${SBE_JAR}" "../resources/sbe-ir.xml" - WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" - COMMENT "Generate IR codecs" + DEPENDS ${SBE_JAR} sbe-jar "../resources/sbe-ir.xml" + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + COMMENT "Generate IR codecs" +) + +add_custom_target( + ir_codecs + DEPENDS ${CODECS} ) set(HEADERS @@ -37,3 +63,5 @@ set(HEADERS ) add_library(sbe STATIC ${HEADERS} dummy.cpp) + +add_dependencies(sbe ir_codecs) diff --git a/sbe-tool/src/test/cpp/CMakeLists.txt b/sbe-tool/src/test/cpp/CMakeLists.txt index 36118f2536..40073c2deb 100644 --- a/sbe-tool/src/test/cpp/CMakeLists.txt +++ b/sbe-tool/src/test/cpp/CMakeLists.txt @@ -44,6 +44,7 @@ set(GENERATED_CODECS add_custom_command( OUTPUT ${GENERATED_CODECS} DEPENDS ${CODE_GENERATION_SCHEMA} ${CODE_GENERATION_SCHEMA_CPP} ${COMPOSITE_OFFSETS_SCHEMA} ${MESSAGE_BLOCK_LENGTH_TEST} + sbe-jar ${SBE_JAR} COMMAND ${Java_JAVA_EXECUTABLE} -Dsbe.output.dir=${CODEC_TARGET_DIR} -Dsbe.generate.ir="true" -Dsbe.target.language="cpp" -jar ${SBE_JAR} ${CODE_GENERATION_SCHEMA}