Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 22 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,21 @@ project(dynalo)
#set(CMAKE_CXX_STANDARD_REQUIRED ON )
#set(CMAKE_CXX_EXTENSIONS OFF)

option(CLEAN_BUILD "Clean build with no warnings allowed" OFF)
message(STATUS "Clean build, warnings are not allowed: " ${CLEAN_BUILD})
option(BUILD_TESTS "Build tests for ${PROJECT_NAME}: " ON)

if (${CLEAN_BUILD})
if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
add_compile_options(/W4 /WX)
elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
add_compile_options(-Wall -Wextra -pedantic -Werror)
else()
# TODO: implement flags for other compilers
message(STATUS "CLEAN_BUILD is not supported for ${CMAKE_CXX_COMPILER_ID}")
endif()
endif()

add_library(${PROJECT_NAME} INTERFACE)
target_include_directories(${PROJECT_NAME} INTERFACE
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
Expand Down Expand Up @@ -58,4 +73,10 @@ install(
DESTINATION "${CONFIG_PACKAGE_INSTALL_LOCATION}"
)

add_subdirectory(test)
get_directory_property(IS_EXCLUDED EXCLUDE_FROM_ALL)

if (NOT IS_EXCLUDED AND BUILD_TESTS)
message(STATUS "Building tests for ${PROJECT_NAME}")
enable_testing()
add_subdirectory(test)
endif()
4 changes: 3 additions & 1 deletion include/dynalo/detail/linux/dynalo.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,9 @@ FunctionSignature* get_function(native::handle lib_handle, const std::string& fu
throw std::runtime_error(std::string("Failed to get [func_name:") + func_name + "]: " + last_error());
}

return reinterpret_cast<FunctionSignature*>(func_ptr);
// TODO: disable optimization for these lines since it is UB
void **intermediate_ptr = reinterpret_cast<void**>(&func_ptr);
return reinterpret_cast<FunctionSignature*>(*intermediate_ptr);
}

}}
4 changes: 3 additions & 1 deletion include/dynalo/detail/windows/dynalo.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,9 @@ FunctionSignature* get_function(native::handle lib_handle, const std::string& fu
throw std::runtime_error(std::string("Failed to get [func_name:") + func_name + "]: " + last_error());
}

return reinterpret_cast<FunctionSignature*>(func_ptr);
// TODO: disable optimization for these lines since it is UB
void **intermediate_ptr = reinterpret_cast<void**>(&func_ptr);
return reinterpret_cast<FunctionSignature*>(*intermediate_ptr);
}

}}
9 changes: 4 additions & 5 deletions test/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.0.0)
#cmake_minimum_required(VERSION 3.0.0)

project(dynalo-test)
# project(dynalo-test)

set(CMAKE_CXX_STANDARD 11 )
set(CMAKE_CXX_STANDARD_REQUIRED ON )
Expand All @@ -13,7 +13,6 @@ add_library(shared SHARED shared.cpp)

add_dependencies(loader shared)

enable_testing()
add_test(NAME all_tests COMMAND
"$<TARGET_FILE:loader>" "$<TARGET_FILE_DIR:shared>" "shared"
add_test(NAME loader COMMAND
"$<TARGET_FILE:loader>" "$<TARGET_FILE:shared>"
)
28 changes: 22 additions & 6 deletions test/loader.cpp
Original file line number Diff line number Diff line change
@@ -1,17 +1,33 @@
#include <dynalo/dynalo.hpp>

#include <cstdint>
#include <iostream>
#include <sstream>

// usage: loader "path/to/shared/lib/dir"
int main(int argc, char* argv[])
{
dynalo::library lib(std::string(argv[1]) + "/" + dynalo::to_native_name("shared"));
if (argc < 2)
{
std::cerr << "No path for a dynamic library was provided.\nUsage: ./loader path_to_dyn_lib" << std::endl;
}
try
{
dynalo::library lib(argv[1]);

auto add_integers = lib.get_function<int32_t(const int32_t, const int32_t)>("add_integers");
auto print_message = lib.get_function<void(const char*)>("print_message");
auto add_integers = lib.get_function<int32_t(const int32_t, const int32_t)>("add_integers");
auto print_message = lib.get_function<void(const char*)>("print_message");

std::ostringstream oss;
oss << "it works: " << add_integers(1, 2);
print_message(oss.str().c_str());
std::ostringstream oss;
oss << "it works: " << add_integers(1, 2);
print_message(oss.str().c_str());

return 0;
}
catch (const std::exception& error)
{
std::cerr << "Test failed: " << error.what() << std::endl;
}

return -1;
}