Skip to content

Commit

Permalink
Define and link targets separately
Browse files Browse the repository at this point in the history
  • Loading branch information
adamant-pwn committed Jul 10, 2024
1 parent c29795c commit 1962e01
Show file tree
Hide file tree
Showing 8 changed files with 99 additions and 73 deletions.
14 changes: 11 additions & 3 deletions cmake/SetupHDF5.cmake
Original file line number Diff line number Diff line change
@@ -1,9 +1,18 @@
include(${CMAKE_CURRENT_LIST_DIR}/Util.cmake)

function(setup_hdf5 TARGET_NAME)
function(add_hdf5_to_target TARGET_NAME)
if(NOHDF5)
target_compile_definitions(${TARGET_NAME} PRIVATE NHDF5RH=1)
else()
if(HDF5_COMPILE)
add_dependencies(${TARGET_NAME} hdf5_build)
endif()
link_imported_library(${TARGET_NAME} hdf5 ${HDF5_DIR})
endif()
endfunction()

function(setup_hdf5)
if(NOT NOHDF5)
# print HDF5_DIR
message(STATUS "EXTERNAL_PROJECTS_BUILD_DIR: ${EXTERNAL_PROJECTS_BUILD_DIR}")
message(STATUS "HDF5_DIR: ${HDF5_DIR}")
Expand All @@ -21,12 +30,11 @@ function(setup_hdf5 TARGET_NAME)
# INSTALL_DIR and DCMAKE_INSTALL_PREFIX are ignored by hdf5
INSTALL_COMMAND make install prefix=${HDF5_DIR}
)
add_dependencies(${TARGET_NAME} hdf5_build)
else()
if(NOT HDF5_DIR)
message(FATAL_ERROR "HDF5_COMPILE is OFF, but no dir provided")
endif()
endif()
link_imported_library(${TARGET_NAME} hdf5 ${HDF5_DIR})
define_imported_library(hdf5 ${HDF5_DIR})
endif()
endfunction()
35 changes: 28 additions & 7 deletions cmake/SetupPOD5.cmake
Original file line number Diff line number Diff line change
@@ -1,22 +1,44 @@
include(${CMAKE_CURRENT_LIST_DIR}/Util.cmake)

function(setup_zstd TARGET_NAME)
set(ZSTD_DIR ${EXTERNAL_PROJECTS_BUILD_DIR}/zstd)
function(add_zstd_to_target TARGET_NAME)
set(ZSTD_DIR ${EXTERNAL_PROJECTS_BUILD_DIR}/zstd)
add_dependencies(${TARGET_NAME} zstd_build)
link_imported_library(${TARGET_NAME} zstd ${ZSTD_DIR})
endfunction()

function(setup_zstd)
set(ZSTD_DIR ${EXTERNAL_PROJECTS_BUILD_DIR}/zstd)
ExternalProject_Add(
zstd_build
SOURCE_DIR ${CMAKE_SOURCE_DIR}/extern/zstd/build/cmake
BINARY_DIR ${ZSTD_DIR}/build
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${ZSTD_DIR}
)
add_dependencies(${TARGET_NAME} zstd_build)
link_imported_library(${TARGET_NAME} zstd ${ZSTD_DIR})
define_imported_library(zstd ${ZSTD_DIR})
endfunction()

function(setup_pod5 TARGET_NAME)
function(add_pod5_to_target TARGET_NAME)
if(NOPOD5)
target_compile_definitions(${TARGET_NAME} PRIVATE NPOD5RH=1)
else()
setup_zstd(${TARGET_NAME})
add_zstd_to_target(${TAARGET_NAME})

set(POD5_VERSION "0.2.2")
set(POD5_URLDIR "pod5-${POD5_VERSION}-${CMAKE_SYSTEM_NAME}")
set(POD5_REPO "https://github.com/nanoporetech/pod5-file-format")

resolve_pod5_url()

if(POD5_DOWNLOAD)
add_dependencies(${TARGET_NAME} pod5_download)
endif()
target_link_libraries(${TARGET_NAME} PRIVATE ${POD5_LIBRARIES} zstd)
endif()
endfunction()

function(setup_pod5)
if(NOT NOPOD5)
setup_zstd()

set(POD5_VERSION "0.2.2")
set(POD5_URLDIR "pod5-${POD5_VERSION}-${CMAKE_SYSTEM_NAME}")
Expand Down Expand Up @@ -45,7 +67,6 @@ function(setup_pod5 TARGET_NAME)
endif()
endif()
include_directories(${POD5_DIR}/include)
target_link_libraries(${TARGET_NAME} PRIVATE ${POD5_LIBRARIES} zstd)
endif()
endfunction()

Expand Down
15 changes: 10 additions & 5 deletions cmake/SetupRUClient.cmake
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
include(${CMAKE_CURRENT_LIST_DIR}/Util.cmake)

function(setup_ruclient TARGET_NAME)
function(add_ruclient_to_target TARGET_NAME)
if(RUCLIENT_ENABLED)
set_target_properties(${TARGET_NAME} PROPERTIES CXX_STANDARD 20)
target_compile_definitions(${TARGET_NAME} PRIVATE RUCLIENT_ENABLED)
target_sources(${TARGET_NAME} PRIVATE rawhash_ruclient.cpp)
add_dependencies(${TARGET_NAME} ruclient_build)
endif()
endfunction()

function(setup_ruclient)
if(RUCLIENT_ENABLED)
set_target_properties(${TARGET_NAME} PROPERTIES CXX_STANDARD 20)
target_compile_definitions(${TARGET_NAME} PRIVATE RUCLIENT_ENABLED)
target_sources(${TARGET_NAME} PRIVATE rawhash_ruclient.cpp)
if(NOT RUCLIENT_DIR)
override_cached(RUCLIENT_DIR ${EXTERNAL_PROJECTS_BUILD_DIR}/ruclient)
endif()
Expand All @@ -15,7 +21,6 @@ function(setup_ruclient TARGET_NAME)
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=${RUCLIENT_DIR}
)
add_dependencies(${TARGET_NAME} ruclient_build)
include_directories(${RUCLIENT_DIR}/include)
message(STATUS "ruclient enabled")
else()
Expand Down
18 changes: 18 additions & 0 deletions cmake/SetupRawHashLikeTarget.cmake
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@
include(${CMAKE_CURRENT_LIST_DIR}/SetupRUClient.cmake)
include(${CMAKE_CURRENT_LIST_DIR}/SetupPOD5.cmake)
include(${CMAKE_CURRENT_LIST_DIR}/SetupHDF5.cmake)
include(${CMAKE_CURRENT_LIST_DIR}/SetupSLOW5.cmake)
include(${CMAKE_CURRENT_LIST_DIR}/SetupTFLite.cmake)

setup_pod5()
setup_ruclient()
setup_hdf5()
setup_slow5()
setup_tflite()

function(setup_rawhashlike_target TARGET_NAME)
# if(PYBINDING)
# message(FATAL_ERROR "Building with Python binding support is not implemented")
Expand Down Expand Up @@ -77,4 +89,10 @@ function(setup_rawhashlike_target TARGET_NAME)
PROFILERH=1
)
endif()

add_pod5_to_target(${TARGET_NAME})
add_hdf5_to_target(${TARGET_NAME})
add_slow5_to_target(${TARGET_NAME})
add_tflite_to_target(${TARGET_NAME})
add_ruclient_to_target(${TARGET_NAME})
endfunction()
14 changes: 11 additions & 3 deletions cmake/SetupSLOW5.cmake
Original file line number Diff line number Diff line change
@@ -1,9 +1,18 @@
include(${CMAKE_CURRENT_LIST_DIR}/Util.cmake)

function(setup_slow5 TARGET_NAME)
function(add_slow5_to_target TARGET_NAME)
if(NOSLOW5)
target_compile_definitions(${TARGET_NAME} PRIVATE NSLOW5RH=1)
else()
if(SLOW5_COMPILE)
add_dependencies(${TARGET_NAME} slow5_build)
endif()
link_imported_library(${TARGET_NAME} slow5 ${SLOW5_DIR})
endif()
endfunction()

function(setup_slow5)
if(NOT NOSLOW5)
set(SLOW5_SOURCE_DIR ${CMAKE_SOURCE_DIR}/extern/slow5lib)
if(SLOW5_COMPILE)
if(NOT SLOW5_DIR)
Expand All @@ -19,13 +28,12 @@ function(setup_slow5 TARGET_NAME)
&& ${CMAKE_COMMAND} -E rename ${SLOW5_DIR}/libslow5.so ${SLOW5_DIR}/lib/libslow5.so
)
message(STATUS "Current dir: ${CMAKE_CURRENT_BINARY_DIR}")
add_dependencies(${TARGET_NAME} slow5_build)
else()
if(NOT SLOW5_DIR)
message(FATAL_ERROR "SLOW5_COMPILE is OFF, but no dir provided")
endif()
endif()
message(STATUS "Using slow5 from ${SLOW5_DIR}")
link_imported_library(${TARGET_NAME} slow5 ${SLOW5_DIR})
define_imported_library(slow5 ${SLOW5_DIR})
endif()
endfunction()
7 changes: 5 additions & 2 deletions cmake/SetupTFLite.cmake
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
include(${CMAKE_CURRENT_LIST_DIR}/Util.cmake)

function(setup_tflite TARGET_NAME)
function(add_tflite_to_target TARGET_NAME)
target_link_libraries(${TARGET_NAME} PRIVATE tensorflow-lite)
endfunction()

function(setup_tflite)
set(TF_SOURCE_DIR ${CMAKE_SOURCE_DIR}/extern/tensorflow)
add_subdirectory(${TF_SOURCE_DIR}/tensorflow/lite ${EXTERNAL_PROJECTS_BUILD_DIR}/tflite EXCLUDE_FROM_ALL)
include_directories(${TF_SOURCE_DIR})
target_link_libraries(${TARGET_NAME} PRIVATE tensorflow-lite)
endfunction()
10 changes: 8 additions & 2 deletions cmake/Util.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,22 @@ function(override_cached name value)
set(${name} ${value} CACHE ${type} ${doc_string} FORCE)
endfunction()


function(link_imported_library TARGET_NAME LIB_NAME LIB_DIR)
add_library(${LIB_NAME} SHARED IMPORTED)
file(MAKE_DIRECTORY ${LIB_DIR}/include)
set_target_properties(${LIB_NAME} PROPERTIES
IMPORTED_LOCATION ${LIB_DIR}/lib/lib${LIB_NAME}.so
INTERFACE_INCLUDE_DIRECTORIES ${LIB_DIR}/include
)
target_link_libraries(${TARGET_NAME} PRIVATE ${LIB_NAME})
endfunction()


function(define_imported_library LIB_NAME LIB_DIR)
add_library(${LIB_NAME} SHARED IMPORTED)
file(MAKE_DIRECTORY ${LIB_DIR}/include)
endfunction()


function(check_directory_exists_and_non_empty DIR)
if(NOT EXISTS ${DIR})
message(FATAL_ERROR "Directory ${DIR} does not exist.")
Expand Down
59 changes: 8 additions & 51 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -34,62 +34,19 @@ set(EXTERNAL_PROJECTS_BUILD_DIR ${CMAKE_BINARY_DIR}/extern) # default build dire
file(MAKE_DIRECTORY ${EXTERNAL_PROJECTS_BUILD_DIR})
message(STATUS "External projects build directory: ${EXTERNAL_PROJECTS_BUILD_DIR}")

include(../cmake/SetupCCacheMold.cmake)
include(../cmake/SetupRawHashLikeTarget.cmake)
include(../cmake/SetupRUClient.cmake)
include(../cmake/SetupPOD5.cmake)
include(../cmake/SetupHDF5.cmake)
include(../cmake/SetupSLOW5.cmake)
include(../cmake/SetupTFLite.cmake)
include(${CMAKE_SOURCE_DIR}/cmake/SetupCCacheMold.cmake)
include(${CMAKE_SOURCE_DIR}/cmake/SetupRawHashLikeTarget.cmake)

set(CMAKE_VERBOSE_MAKEFILE TRUE CACHE BOOL "verbose makefile" FORCE) # print compilation commands

enable_ccache()
set_alternate_linker(mold)

# todo: currently can only compile rawhash2 or the below, not both
# this happens because functions like setup_hdf5 define the hdf5 target and the relationship to the target name
# rather than doing it separately
set(build_cli ON)
add_executable(rawhash2 main.cpp)
setup_rawhashlike_target(rawhash2)

if (build_cli)
message(STATUS "Building CLI")

set(TARGET_NAME rawhash2)
add_executable(${TARGET_NAME} main.cpp)
setup_rawhashlike_target(${TARGET_NAME})
setup_pod5(${TARGET_NAME})
setup_ruclient(${TARGET_NAME})
setup_hdf5(${TARGET_NAME})
setup_slow5(${TARGET_NAME})
setup_tflite(${TARGET_NAME})
add_library(rawhash2_wrapper SHARED rawhash_wrapper.cpp rawhash_wrapper.hpp)
setup_rawhashlike_target(rawhash2_wrapper)

else()
message(STATUS "Building shared library")

# set(TARGET_NAME rawhash2_wrapper_example)
# add_executable(${TARGET_NAME} wrapper_example.cpp rawhash_wrapper.cpp rawhash_wrapper.hpp)
set(TARGET_NAME rawhash2_wrapper)
add_library(${TARGET_NAME} SHARED rawhash_wrapper.cpp rawhash_wrapper.hpp)
setup_rawhashlike_target(${TARGET_NAME})
setup_pod5(${TARGET_NAME})
setup_ruclient(${TARGET_NAME})
setup_hdf5(${TARGET_NAME})
setup_slow5(${TARGET_NAME})
setup_tflite(${TARGET_NAME})

set(TARGET_NAME rawhash2_usinglib)
add_executable(${TARGET_NAME} wrapper_example.cpp)
target_link_libraries(${TARGET_NAME} PRIVATE rawhash2_wrapper)
# setup_rawhashlike_target(${TARGET_NAME})
# # setup_pod5(${TARGET_NAME})
# target_compile_definitions(${TARGET_NAME} PRIVATE NPOD5RH=1) # todo: workaround
# setup_ruclient(${TARGET_NAME})
# setup_hdf5(${TARGET_NAME})
# setup_slow5(${TARGET_NAME})
# setup_tflite(${TARGET_NAME})
endif()


# setup_pod5()
# add_pod5_to_target(${TARGET_NAME})
add_executable(rawhash2_usinglib wrapper_example.cpp)
target_link_libraries(rawhash2_usinglib PRIVATE rawhash2_wrapper)

0 comments on commit 1962e01

Please sign in to comment.