diff --git a/3rdparty/alp/CMakeLists.txt b/3rdparty/alp/CMakeLists.txt index 7b2a2e0b..6682442f 100644 --- a/3rdparty/alp/CMakeLists.txt +++ b/3rdparty/alp/CMakeLists.txt @@ -8,6 +8,8 @@ cmake_minimum_required(VERSION 3.13) project(alp CXX) +set(CMAKE_CXX_STANDARD 11) + set(ALP_HDRS njn_approx.hpp njn_doubletype.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index f46407fd..ed92ca08 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -67,6 +67,12 @@ set(DIRENTWIN_URL https://github.com/tronkko/dirent CACHE STRING "Dirent-Windows set(DIRENTWIN_HOME ${EXTERNAL_DEPS}/dirent CACHE PATH "Dirent-Windows interface installation directory") set(CONCURRENTQUEUE_URL https://github.com/cameron314/concurrentqueue CACHE STRING "Concurrent queue library GitHub URL") set(CONCURRENTQUEUE_HOME ${EXTERNAL_DEPS}/concurrentqueue CACHE PATH "Concurrent queue library installation directory") +#set(gflags_DIR ${EXTERNAL_DEPS}/gflags/dist/lib/cmake/gflags CACHE PATH "GFlags library configuration") + +option(ROCKSDB_STATIC "Use static RocksDB library" ON) +option(ZLIB_STATIC "Use static ZLib library" ON) + +option(PORTABLE "Build portable/statically linked executable" ON) option(WITH_MD_LIBRARY "build with MD" ON) if(WIN32 AND MSVC) @@ -84,11 +90,29 @@ if(WIN32 AND MSVC) CMAKE_C_FLAGS_RELWITHDEBINFO) if(${flag_var} MATCHES "/MD") string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") - endif(${flag_var} MATCHES "/MD") + endif() + endforeach(flag_var) + endif() +endif() + +option(WITH_RUNTIME_DEBUG "Build with MDd/MTd on Windows. Ignored on non-Windows" OFF) +if(WIN32 AND MSVC) + if(NOT WITH_RUNTIME_DEBUG) + foreach(flag_var + CMAKE_CXX_FLAGS_DEBUG + CMAKE_C_FLAGS_DEBUG + ) + if(${flag_var} MATCHES "/MDd") + string(REGEX REPLACE "/MDd" "/MD" ${flag_var} "${${flag_var}}") + elseif(${flag_var} MATCHES "/MTd") + string(REGEX REPLACE "/MTd" "/MT" ${flag_var} "${${flag_var}}") + endif() endforeach(flag_var) endif() endif() +message("CMAKE_CXX_FLAGS_DEBUG: ${CMAKE_CXX_FLAGS_DEBUG}") +message("CMAKE_C_FLAGS_DEBUG: ${CMAKE_C_FLAGS_DEBUG}") option(WITH_TESTS "Select whether to build tests" OFF) diff --git a/src/sortmerna/CMakeLists.txt b/src/sortmerna/CMakeLists.txt index f33ede60..9ef8b806 100644 --- a/src/sortmerna/CMakeLists.txt +++ b/src/sortmerna/CMakeLists.txt @@ -12,21 +12,61 @@ set(CMAKE_CXX_STANDARD 14) find_package(Threads REQUIRED) -find_package(RocksDB - REQUIRED +find_package(RocksDB CONFIG REQUIRED PATHS ${ROCKSDB_HOME} NO_DEFAULT_PATH ) -# fix for RocksDBTargets.cmake, which makes both static and shared libraries always dependent on libz.so +if(RocksDB_FOUND) + message("RocksDB package OK") +else() + message("RocksDB package NOK") +endif() + +# +get_target_property(lib RocksDB::rocksdb-shared LOCATION) +message("RocksDB::rocksdb-shared LOCATION: ${lib}") +get_target_property(lib RocksDB::rocksdb-shared LOCATION_DEBUG) +message("RocksDB::rocksdb-shared LOCATION_DEBUG: ${lib}") +get_target_property(lib RocksDB::rocksdb-shared IMPORTED_LOCATION_DEBUG) +message("RocksDB::rocksdb-shared LOCATION_DEBUG: ${lib}") +get_target_property(cfg RocksDB::rocksdb-shared IMPORTED_CONFIGURATIONS) +message("RocksDB::rocksdb-shared IMPORTED_CONFIGURATIONS: ${cfg}") +get_target_property(lib RocksDB::rocksdb-shared IMPORTED_IMPLIB) +message("RocksDB::rocksdb-shared IMPORTED_IMPLIB: ${lib}") + +get_target_property(lib RocksDB::rocksdb LIBRARY_OUTPUT_NAME) +message("RocksDB::rocksdb LIBRARY_OUTPUT_NAME: ${lib}") + + if(ROCKSDB_STATIC) + message("Using Static RocksDB lib") + set(ROCKSDB_LIB RocksDB::rocksdb) + else() + message("Using Shared RocksDB lib") + set(ROCKSDB_LIB RocksDB::rocksdb-shared) + #if(WIN32 AND MSVC) + # set_target_properties(RocksDB::rocksdb-shared PROPERTIES + # IMPORTED_IMPLIB "${ROCKSDB_HOME}/lib/rocksdb-shared.lib" + # ) + #endif() +endif() + +get_property(trans_deps TARGET ${ROCKSDB_LIB} PROPERTY INTERFACE_LINK_LIBRARIES) +message("${ROCKSDB_LIB} transitive link dependencies: ${trans_deps}") + +# fix RocksDBTargets.cmake, which makes both static and shared libraries always dependent on libz.so if(NOT WIN32) if(ZLIB_LIBRARY_RELEASE) + # modify the dependent libraries of the RocksDB::rocksdb target set_target_properties(RocksDB::rocksdb PROPERTIES - INTERFACE_LINK_LIBRARIES "${ZLIB_LIBRARY_RELEASE};-lpthread" + INTERFACE_LINK_LIBRARIES "${ZLIB_LIBRARY_RELEASE};Threads::Threads" ) endif() endif() +get_property(trans_deps TARGET RocksDB::rocksdb PROPERTY INTERFACE_LINK_LIBRARIES) +message("rocksdb transitive link dependencies AFTER modification: ${trans_deps}") + include(FindZLIB) # prevent CONFIG search mode find_package(ZLIB MODULE REQUIRED) @@ -35,6 +75,26 @@ include(FindRapidJson) # prevent CONFIG search mode find_package(RapidJson MODULE REQUIRED) +# set additional compile flags +if(MSVC) +# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi /nologo /EHsc /GS /Gd /GR /GF /fp:precise /Zc:wchar_t /Zc:forScope /errorReport:queue") +# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /FC /d2Zi+ /W4 /wd4127 /wd4800 /wd4996 /wd4351 /wd4100 /wd4204 /wd4324") +else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W -Wextra -Wall -Xlinker -v") # -Xlinker -v / --verbose (linked libraries info) '-Wl,-Map,mapfile.txt' '-Wl,-v' + #set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -v -da -Q") # for segfault + # | | |_show which function is causing the crash. + # | |_dumps the RTL to a file after each stage + # |_show how the program was invoked + #set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -v -da -Q -O0") # for segfault +# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wsign-compare -Wshadow -Wno-unused-parameter -Wno-unused-variable -Woverloaded-virtual -Wnon-virtual-dtor -Wno-missing-field-initializers -Wno-strict-aliasing") +endif() + +#set(MY_OPTS -g -Wall) # using quotes "-g -Wall" throws error +#target_compile_options(smr_objs PUBLIC ${MY_OPTS}) +#target_compile_options(smr_objs PUBLIC "$<$:${MY_OPTS}>") +#target_compile_options(smr_objs PUBLIC "$<$:${MY_OPTS}>") +#set_target_properties(smr_objs PROPERTIES COMPILE_OPTIONS ${MY_OPTS}) + set(SMR_SRCS alignment.cpp bitvector.cpp @@ -63,26 +123,36 @@ set(SMR_SRCS add_library(smr_objs OBJECT ${SMR_SRCS}) target_link_libraries(smr_objs PUBLIC - ZLIB::ZLIB - RocksDB::rocksdb - RapidJSON::RapidJSON alp + ${ROCKSDB_LIB} + RapidJSON::RapidJSON + ZLIB::ZLIB ) if(WIN32) target_include_directories(smr_objs - PRIVATE + PUBLIC ${CMAKE_SOURCE_DIR}/include $ + $ ${DIRENTWIN_HOME}/include ${EXTERNAL_DEPS}/concurrentqueue ) else() - target_include_directories(smr_objs PRIVATE - ${CMAKE_SOURCE_DIR}/include - ${EXTERNAL_DEPS}/concurrentqueue + target_include_directories(smr_objs + PUBLIC + ${CMAKE_SOURCE_DIR}/include + $ + ${EXTERNAL_DEPS}/concurrentqueue ) endif() +get_property(trans_deps TARGET smr_objs PROPERTY INTERFACE_LINK_LIBRARIES) +message("SMR Objects transitive link dependencies: ${trans_deps}") + +get_target_property(COMPILE_OPT smr_objs COMPILE_OPTIONS) +get_target_property(COMPILE_FLG smr_objs COMPILE_FLAGS) +message("SMR Objects COMPILE_OPT: ${COMPILE_OPT} COMPILE_FLG: ${COMPILE_FLG}") + # SMR add_executable(sortmerna main.cpp) if(WIN32) @@ -97,36 +167,33 @@ if(WIN32) smr_objs winapi alp + $ ZLIB::ZLIB - RocksDB::rocksdb + ${ROCKSDB_LIB} RapidJSON::RapidJSON Rpcrt4.lib Cabinet.lib # rocksdb:XPRESS::CreateCompressor,Compress,CloseCompressor,CreateDecompressor,Decompress,CloseDecompressor ) - add_dependencies(sortmerna - winapi - alp - build_version - smr_objs - ) else() target_include_directories(sortmerna PRIVATE ${EXTERNAL_DEPS}/concurrentqueue ${CMAKE_SOURCE_DIR}/include ) + #get_property(rocksdb_trans_deps TARGET RocksDB::rocksdb PROPERTY INTERFACE_LINK_LIBRARIES) + #message("rocksdb_trans_deps: ${rocksdb_trans_deps}") target_link_libraries(sortmerna build_version smr_objs - alp - ZLIB::ZLIB - RocksDB::rocksdb - RapidJSON::RapidJSON - ${CMAKE_THREAD_LIBS_INIT} - ) - add_dependencies(sortmerna - alp - smr_objs - build_version + alp # this is a transitive dependency of smr_objs but the linking fails without it. Why? + $ + ${ROCKSDB_LIB} + ${CMAKE_DL_LIBS} + # the following are all transitive dependencies of smr_objs i.e. no need to link: + # RapidJSON::RapidJSON ZLIB::ZLIB Threads::Threads (rockdb deps) ) + + if(PORTABLE) + target_link_options(sortmerna PRIVATE -static) + endif(PORTABLE) endif() diff --git a/tests/sortmerna/CMakeLists.txt b/tests/sortmerna/CMakeLists.txt index 34d6baac..975304b0 100644 --- a/tests/sortmerna/CMakeLists.txt +++ b/tests/sortmerna/CMakeLists.txt @@ -13,29 +13,32 @@ message("tests PROJECT_BINARY_DIR = ${PROJECT_BINARY_DIR}") message("tests CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}") message("tests CMAKE_CFG_INTDIR = ${CMAKE_CFG_INTDIR}") -set(tests - kvdb +set(TEST_SRCS + kvdb.cpp + #main.cpp ) -include_directories("${CMAKE_SOURCE_DIR}/include" ${CMAKE_SOURCE_DIR}/src/winapi/include) +add_executable(tests ${TEST_SRCS}) +#target_include_directories(tests +#PRIVATE +# ${CMAKE_SOURCE_DIR}/include +# #${CMAKE_SOURCE_DIR}/src/winapi/include +#) +if(WIN32) + target_link_libraries(tests + build_version + alp + smr_objs + winapi + $ + ) +else() + target_link_libraries(tests + build_version + alp + smr_objs + $ + ) +endif() -foreach(test ${tests}) - add_executable("test_${test}" ${test}.cpp $) - if(WIN32) - target_link_libraries( "test_${test}" - alp - z - rocksdb - Rpcrt4.lib - Cabinet.lib - ) - else() - target_link_libraries( "test_${test}" - alp - z - rocksdb - ) - endif() -endforeach() - -add_dependencies(test_kvdb sortmerna) \ No newline at end of file +#add_executable("test_${test}" ${test}.cpp $) \ No newline at end of file