forked from monero-project/monero
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
9 changed files
with
155 additions
and
661 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,171 +1,193 @@ | ||
OPTION(USE_DEVICE_TREZOR "Trezor support compilation" ON) | ||
OPTION(USE_DEVICE_TREZOR_LIBUSB "Trezor LibUSB compilation" ON) | ||
OPTION(USE_DEVICE_TREZOR_UDP_RELEASE "Trezor UdpTransport in release mode" OFF) | ||
OPTION(USE_DEVICE_TREZOR_DEBUG "Trezor Debugging enabled" OFF) | ||
OPTION(TREZOR_DEBUG "Main trezor debugging switch" OFF) | ||
|
||
# Helper function to fix cmake < 3.6.0 FindProtobuf variables | ||
function(_trezor_protobuf_fix_vars) | ||
if(${CMAKE_VERSION} VERSION_LESS "3.6.0") | ||
foreach(UPPER | ||
PROTOBUF_SRC_ROOT_FOLDER | ||
PROTOBUF_IMPORT_DIRS | ||
PROTOBUF_DEBUG | ||
PROTOBUF_LIBRARY | ||
PROTOBUF_PROTOC_LIBRARY | ||
PROTOBUF_INCLUDE_DIR | ||
PROTOBUF_PROTOC_EXECUTABLE | ||
PROTOBUF_LIBRARY_DEBUG | ||
PROTOBUF_PROTOC_LIBRARY_DEBUG | ||
PROTOBUF_LITE_LIBRARY | ||
PROTOBUF_LITE_LIBRARY_DEBUG | ||
) | ||
if (DEFINED ${UPPER}) | ||
string(REPLACE "PROTOBUF_" "Protobuf_" Camel ${UPPER}) | ||
if (NOT DEFINED ${Camel}) | ||
set(${Camel} ${${UPPER}} PARENT_SCOPE) | ||
endif() | ||
endif() | ||
endforeach() | ||
# Function for setting default options default values via env vars | ||
function(_trezor_default_val val_name val_default) | ||
if(NOT DEFINED ENV{${val_name}}) | ||
set(ENV{${val_name}} ${val_default}) | ||
endif() | ||
endfunction() | ||
|
||
# Define default options via env vars | ||
_trezor_default_val(USE_DEVICE_TREZOR ON) | ||
_trezor_default_val(USE_DEVICE_TREZOR_MANDATORY OFF) | ||
_trezor_default_val(USE_DEVICE_TREZOR_PROTOBUF_TEST ON) | ||
_trezor_default_val(USE_DEVICE_TREZOR_LIBUSB ON) | ||
_trezor_default_val(USE_DEVICE_TREZOR_UDP_RELEASE OFF) | ||
_trezor_default_val(USE_DEVICE_TREZOR_DEBUG OFF) | ||
_trezor_default_val(TREZOR_DEBUG OFF) | ||
|
||
# Main options | ||
OPTION(USE_DEVICE_TREZOR "Trezor support compilation" $ENV{USE_DEVICE_TREZOR}) | ||
OPTION(USE_DEVICE_TREZOR_MANDATORY "Trezor compilation is mandatory, fail build if Trezor support cannot be compiled" $ENV{USE_DEVICE_TREZOR_MANDATORY}) | ||
OPTION(USE_DEVICE_TREZOR_PROTOBUF_TEST "Trezor Protobuf test" $ENV{USE_DEVICE_TREZOR_PROTOBUF_TEST}) | ||
OPTION(USE_DEVICE_TREZOR_LIBUSB "Trezor LibUSB compilation" $ENV{USE_DEVICE_TREZOR_LIBUSB}) | ||
OPTION(USE_DEVICE_TREZOR_UDP_RELEASE "Trezor UdpTransport in release mode" $ENV{USE_DEVICE_TREZOR_UDP_RELEASE}) | ||
OPTION(USE_DEVICE_TREZOR_DEBUG "Trezor Debugging enabled" $ENV{USE_DEVICE_TREZOR_DEBUG}) | ||
OPTION(TREZOR_DEBUG "Main Trezor debugging switch" $ENV{TREZOR_DEBUG}) | ||
|
||
macro(trezor_fatal_msg msg) | ||
if ($ENV{USE_DEVICE_TREZOR_MANDATORY}) | ||
message(FATAL_ERROR | ||
"${msg}\n" | ||
"==========================================================================\n" | ||
"[ERROR] To compile without Trezor support, set USE_DEVICE_TREZOR=OFF. " | ||
"It is possible both via cmake variable and environment variable, e.g., " | ||
"`USE_DEVICE_TREZOR=OFF make release`\n" | ||
"For more information, please check src/device_trezor/README.md\n" | ||
) | ||
else() | ||
message(WARNING | ||
"${msg}\n" | ||
"==========================================================================\n" | ||
"[WARNING] Trezor support cannot be compiled! Skipping Trezor compilation. \n" | ||
"For more information, please check src/device_trezor/README.md\n") | ||
set(USE_DEVICE_TREZOR OFF) | ||
return() # finish this cmake file processing (as this is macro). | ||
endif() | ||
endmacro() | ||
|
||
# Use Trezor master switch | ||
if (USE_DEVICE_TREZOR) | ||
# Protobuf is required to build protobuf messages for Trezor | ||
if(DEPENDS) | ||
include(FindProtobuf OPTIONAL) | ||
find_package(Protobuf) | ||
else() | ||
find_package(PkgConfig REQUIRED) | ||
pkg_check_modules(Protobuf REQUIRED protobuf) | ||
endif() | ||
_trezor_protobuf_fix_vars() | ||
|
||
# Protobuf handling the cache variables set in docker. | ||
if(NOT Protobuf_FOUND AND NOT Protobuf_LIBRARIES AND NOT Protobuf_PROTOC_EXECUTABLE AND NOT Protobuf_INCLUDE_DIR) | ||
message(STATUS "Could not find Protobuf") | ||
elseif(NOT Protobuf_LIBRARIES) | ||
message(STATUS "Protobuf library not found: ${Protobuf_LIBRARIES}") | ||
unset(Protobuf_FOUND) | ||
elseif(NOT Protobuf_PROTOC_EXECUTABLE OR NOT EXISTS "${Protobuf_PROTOC_EXECUTABLE}") | ||
message(STATUS "Protobuf executable not found: ${Protobuf_PROTOC_EXECUTABLE}") | ||
unset(Protobuf_FOUND) | ||
elseif(NOT Protobuf_INCLUDE_DIR OR NOT EXISTS "${Protobuf_INCLUDE_DIR}") | ||
message(STATUS "Protobuf include dir not found: ${Protobuf_INCLUDE_DIR}") | ||
unset(Protobuf_FOUND) | ||
# Look for protobuf-config.cmake, provided by Protobuf | ||
find_package(Protobuf CONFIG) | ||
|
||
if (Protobuf_FOUND) | ||
# https://github.com/protocolbuffers/protobuf/issues/14576 | ||
find_program(Protobuf_PROTOC_EXECUTABLE protoc REQUIRED) | ||
set(Protobuf_LIBRARY protobuf::libprotobuf) # Compatibility with FindProtobuf.cmake | ||
else() | ||
message(STATUS "Protobuf lib: ${Protobuf_LIBRARIES}, inc: ${Protobuf_INCLUDE_DIR}, protoc: ${Protobuf_PROTOC_EXECUTABLE}") | ||
set(Protobuf_INCLUDE_DIRS ${Protobuf_INCLUDE_DIR}) | ||
set(Protobuf_FOUND 1) # override found if all rquired info was provided by variables | ||
# Look for FindProtobuf.cmake, provided by CMake | ||
find_package(Protobuf) | ||
endif() | ||
|
||
# Early fail for optional Trezor support | ||
if (NOT Protobuf_FOUND) | ||
trezor_fatal_msg("Trezor: protobuf library not found") | ||
endif() | ||
|
||
if(TREZOR_DEBUG) | ||
set(USE_DEVICE_TREZOR_DEBUG 1) | ||
message(STATUS "Trezor: debug build enabled") | ||
endif() | ||
|
||
# Compile debugging support (for tests) | ||
if (USE_DEVICE_TREZOR_DEBUG) | ||
add_definitions(-DWITH_TREZOR_DEBUGGING=1) | ||
endif() | ||
else() | ||
message(STATUS "Trezor support disabled by USE_DEVICE_TREZOR") | ||
message(STATUS "Trezor: support disabled by USE_DEVICE_TREZOR") | ||
endif() | ||
|
||
# Protobuf compilation test | ||
if(Protobuf_FOUND AND USE_DEVICE_TREZOR) | ||
if (NOT "$ENV{TREZOR_PYTHON}" STREQUAL "") | ||
set(TREZOR_PYTHON "$ENV{TREZOR_PYTHON}" CACHE INTERNAL "Copied from environment variable TREZOR_PYTHON") | ||
else() | ||
find_package(Python QUIET COMPONENTS Interpreter) # cmake 3.12+ | ||
if(Python_Interpreter_FOUND) | ||
set(TREZOR_PYTHON "${Python_EXECUTABLE}") | ||
endif() | ||
execute_process(COMMAND ${Protobuf_PROTOC_EXECUTABLE} -I "${CMAKE_CURRENT_LIST_DIR}" -I "${Protobuf_INCLUDE_DIR}" "${CMAKE_CURRENT_LIST_DIR}/test-protobuf.proto" --cpp_out ${CMAKE_BINARY_DIR} RESULT_VARIABLE RET OUTPUT_VARIABLE OUT ERROR_VARIABLE ERR) | ||
if(RET) | ||
trezor_fatal_msg("Trezor: Protobuf test generation failed: ${OUT} ${ERR}") | ||
endif() | ||
|
||
if(NOT TREZOR_PYTHON) | ||
find_package(PythonInterp) | ||
if(PYTHONINTERP_FOUND AND PYTHON_EXECUTABLE) | ||
set(TREZOR_PYTHON "${PYTHON_EXECUTABLE}") | ||
endif() | ||
if(ANDROID) | ||
set(CMAKE_TRY_COMPILE_LINKER_FLAGS "${CMAKE_TRY_COMPILE_LINKER_FLAGS} -llog") | ||
set(CMAKE_TRY_COMPILE_LINK_LIBRARIES "${CMAKE_TRY_COMPILE_LINK_LIBRARIES} log") | ||
endif() | ||
|
||
if(NOT TREZOR_PYTHON) | ||
message(STATUS "Trezor: Python not found") | ||
endif() | ||
endif() | ||
if(USE_DEVICE_TREZOR_PROTOBUF_TEST) | ||
if(PROTOBUF_LDFLAGS) | ||
set(PROTOBUF_TRYCOMPILE_LINKER "${PROTOBUF_LDFLAGS}") | ||
else() | ||
set(PROTOBUF_TRYCOMPILE_LINKER "${Protobuf_LIBRARY}") | ||
endif() | ||
|
||
# Protobuf compilation test | ||
if(Protobuf_FOUND AND USE_DEVICE_TREZOR AND TREZOR_PYTHON) | ||
execute_process(COMMAND ${Protobuf_PROTOC_EXECUTABLE} -I "${CMAKE_CURRENT_LIST_DIR}" -I "${Protobuf_INCLUDE_DIR}" "${CMAKE_CURRENT_LIST_DIR}/test-protobuf.proto" --cpp_out ${CMAKE_BINARY_DIR} RESULT_VARIABLE RET OUTPUT_VARIABLE OUT ERROR_VARIABLE ERR) | ||
if(RET) | ||
message(STATUS "Protobuf test generation failed: ${OUT} ${ERR}") | ||
try_compile(Protobuf_COMPILE_TEST_PASSED | ||
"${CMAKE_BINARY_DIR}" | ||
SOURCES | ||
"${CMAKE_BINARY_DIR}/test-protobuf.pb.cc" | ||
"${CMAKE_CURRENT_LIST_DIR}/test-protobuf.cpp" | ||
CMAKE_FLAGS | ||
CMAKE_EXE_LINKER_FLAGS ${CMAKE_TRY_COMPILE_LINKER_FLAGS} | ||
"-DINCLUDE_DIRECTORIES=${Protobuf_INCLUDE_DIR};${CMAKE_BINARY_DIR}" | ||
"-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}" | ||
LINK_LIBRARIES "${PROTOBUF_TRYCOMPILE_LINKER}" ${CMAKE_TRY_COMPILE_LINK_LIBRARIES} | ||
OUTPUT_VARIABLE OUTPUT | ||
) | ||
if(NOT Protobuf_COMPILE_TEST_PASSED) | ||
trezor_fatal_msg("Trezor: Protobuf Compilation test failed: ${OUTPUT}.") | ||
endif() | ||
else () | ||
message(STATUS "Trezor: Protobuf Compilation test skipped, build may fail later") | ||
endif() | ||
endif() | ||
|
||
# Try to build protobuf messages | ||
if(Protobuf_FOUND AND USE_DEVICE_TREZOR AND TREZOR_PYTHON) | ||
set(ENV{PROTOBUF_INCLUDE_DIRS} "${Protobuf_INCLUDE_DIR}") | ||
set(ENV{PROTOBUF_PROTOC_EXECUTABLE} "${Protobuf_PROTOC_EXECUTABLE}") | ||
set(TREZOR_PROTOBUF_PARAMS "") | ||
if (USE_DEVICE_TREZOR_DEBUG) | ||
set(TREZOR_PROTOBUF_PARAMS "--debug") | ||
endif() | ||
|
||
execute_process(COMMAND ${TREZOR_PYTHON} tools/build_protob.py ${TREZOR_PROTOBUF_PARAMS} WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/../src/device_trezor/trezor RESULT_VARIABLE RET OUTPUT_VARIABLE OUT ERROR_VARIABLE ERR) | ||
if(Protobuf_FOUND AND USE_DEVICE_TREZOR) | ||
# .proto files to compile | ||
set(_proto_files "messages.proto" | ||
"messages-common.proto" | ||
"messages-management.proto" | ||
"messages-monero.proto") | ||
if (TREZOR_DEBUG) | ||
list(APPEND _proto_files "messages-debug.proto") | ||
endif () | ||
|
||
set(_proto_include_dir "${CMAKE_CURRENT_LIST_DIR}/../external/trezor-common/protob") | ||
set(_proto_files_absolute) | ||
foreach(file IN LISTS _proto_files) | ||
list(APPEND _proto_files_absolute "${_proto_include_dir}/${file}") | ||
endforeach () | ||
|
||
execute_process(COMMAND ${Protobuf_PROTOC_EXECUTABLE} --cpp_out "${CMAKE_CURRENT_LIST_DIR}/../src/device_trezor/trezor/messages" "-I${_proto_include_dir}" ${_proto_files_absolute} RESULT_VARIABLE RET OUTPUT_VARIABLE OUT ERROR_VARIABLE ERR) | ||
if(RET) | ||
message(WARNING "Trezor protobuf messages could not be regenerated (err=${RET}, python ${PYTHON})." | ||
"OUT: ${OUT}, ERR: ${ERR}." | ||
"Please read src/device_trezor/trezor/tools/README.md") | ||
else() | ||
message(STATUS "Trezor protobuf messages regenerated out: \"${OUT}.\"") | ||
set(DEVICE_TREZOR_READY 1) | ||
add_definitions(-DDEVICE_TREZOR_READY=1) | ||
add_definitions(-DPROTOBUF_INLINE_NOT_IN_HEADERS=0) | ||
trezor_fatal_msg("Trezor: protobuf messages could not be (re)generated (err=${RET}). OUT: ${OUT}, ERR: ${ERR}.") | ||
endif() | ||
|
||
if(CMAKE_BUILD_TYPE STREQUAL "Debug") | ||
add_definitions(-DTREZOR_DEBUG=1) | ||
endif() | ||
message(STATUS "Trezor: protobuf messages regenerated out.") | ||
set(DEVICE_TREZOR_READY 1) | ||
add_definitions(-DDEVICE_TREZOR_READY=1) | ||
add_definitions(-DPROTOBUF_INLINE_NOT_IN_HEADERS=0) | ||
|
||
if(USE_DEVICE_TREZOR_UDP_RELEASE) | ||
add_definitions(-DUSE_DEVICE_TREZOR_UDP_RELEASE=1) | ||
endif() | ||
if(CMAKE_BUILD_TYPE STREQUAL "Debug") | ||
add_definitions(-DTREZOR_DEBUG=1) | ||
endif() | ||
|
||
if (Protobuf_INCLUDE_DIR) | ||
include_directories(${Protobuf_INCLUDE_DIR}) | ||
endif() | ||
if(USE_DEVICE_TREZOR_UDP_RELEASE) | ||
message(STATUS "Trezor: UDP transport enabled (emulator)") | ||
add_definitions(-DUSE_DEVICE_TREZOR_UDP_RELEASE=1) | ||
endif() | ||
|
||
# LibUSB support, check for particular version | ||
# Include support only if compilation test passes | ||
if (USE_DEVICE_TREZOR_LIBUSB) | ||
find_package(LibUSB) | ||
endif() | ||
if (Protobuf_INCLUDE_DIR) | ||
include_directories(${Protobuf_INCLUDE_DIR}) | ||
endif() | ||
|
||
if (LibUSB_COMPILE_TEST_PASSED) | ||
add_definitions(-DHAVE_TREZOR_LIBUSB=1) | ||
if(LibUSB_INCLUDE_DIRS) | ||
include_directories(${LibUSB_INCLUDE_DIRS}) | ||
endif() | ||
endif() | ||
# LibUSB support, check for particular version | ||
# Include support only if compilation test passes | ||
if (USE_DEVICE_TREZOR_LIBUSB) | ||
find_package(LibUSB) | ||
endif() | ||
|
||
set(TREZOR_LIBUSB_LIBRARIES "") | ||
if(LibUSB_COMPILE_TEST_PASSED) | ||
list(APPEND TREZOR_LIBUSB_LIBRARIES ${LibUSB_LIBRARIES} ${LIBUSB_DEP_LINKER}) | ||
message(STATUS "Trezor compatible LibUSB found at: ${LibUSB_INCLUDE_DIRS}") | ||
if (LibUSB_COMPILE_TEST_PASSED) | ||
add_definitions(-DHAVE_TREZOR_LIBUSB=1) | ||
if(LibUSB_INCLUDE_DIRS) | ||
include_directories(${LibUSB_INCLUDE_DIRS}) | ||
endif() | ||
endif() | ||
|
||
if (BUILD_GUI_DEPS) | ||
set(TREZOR_DEP_LIBS "") | ||
set(TREZOR_DEP_LINKER "") | ||
set(TREZOR_LIBUSB_LIBRARIES "") | ||
if(LibUSB_COMPILE_TEST_PASSED) | ||
list(APPEND TREZOR_LIBUSB_LIBRARIES ${LibUSB_LIBRARIES} ${LIBUSB_DEP_LINKER}) | ||
message(STATUS "Trezor: compatible LibUSB found at: ${LibUSB_INCLUDE_DIRS}") | ||
elseif(USE_DEVICE_TREZOR_LIBUSB AND NOT ANDROID) | ||
trezor_fatal_msg("Trezor: LibUSB not found or test failed, please install libusb-1.0.26") | ||
endif() | ||
|
||
if (Protobuf_LIBRARIES) | ||
list(APPEND TREZOR_DEP_LIBS ${Protobuf_LIBRARIES}) | ||
string(APPEND TREZOR_DEP_LINKER " -lprotobuf") | ||
endif() | ||
if (BUILD_GUI_DEPS) | ||
set(TREZOR_DEP_LIBS "") | ||
set(TREZOR_DEP_LINKER "") | ||
|
||
if (TREZOR_LIBUSB_LIBRARIES) | ||
list(APPEND TREZOR_DEP_LIBS ${TREZOR_LIBUSB_LIBRARIES}) | ||
string(APPEND TREZOR_DEP_LINKER " -lusb-1.0 ${LIBUSB_DEP_LINKER}") | ||
endif() | ||
if (Protobuf_LIBRARY) | ||
list(APPEND TREZOR_DEP_LIBS ${Protobuf_LIBRARY}) | ||
string(APPEND TREZOR_DEP_LINKER " -lprotobuf") | ||
endif() | ||
|
||
if (TREZOR_LIBUSB_LIBRARIES) | ||
list(APPEND TREZOR_DEP_LIBS ${TREZOR_LIBUSB_LIBRARIES}) | ||
string(APPEND TREZOR_DEP_LINKER " -lusb-1.0 ${LIBUSB_DEP_LINKER}") | ||
endif() | ||
endif() | ||
endif() | ||
endif() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
Oops, something went wrong.