FindMonero.cmake added to simply building against Monero

This commit is contained in:
moneroexamples 2017-04-18 13:10:09 +08:00
parent 05a7af350a
commit 4fc33137de
8 changed files with 200 additions and 1675 deletions

View File

@ -8,10 +8,37 @@ project(${PROJECT_NAME})
set(CMAKE_CXX_FLAGS set(CMAKE_CXX_FLAGS
"${CMAKE_CXX_FLAGS} -std=c++14") "${CMAKE_CXX_FLAGS} -std=c++14")
if (WIN32) if (WIN32)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wa,-mbig-obj -O3") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wa,-mbig-obj -O3")
endif() endif()
if (NOT MONERO_DIR)
set(MONERO_DIR ~/monero)
endif()
message(STATUS MONERO_DIR ": ${MONERO_DIR}")
set(MONERO_SOURCE_DIR ${MONERO_DIR}
CACHE PATH "Path to the root directory for Monero")
# set location of monero build tree
set(MONERO_BUILD_DIR ${MONERO_SOURCE_DIR}/build/release/
CACHE PATH "Path to the build directory for Monero")
set(MY_CMAKE_DIR "${CMAKE_CURRENT_LIST_DIR}/cmake"
CACHE PATH "The path to the cmake directory of the current project")
list(APPEND CMAKE_MODULE_PATH "${MY_CMAKE_DIR}")
set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "${MONERO_BUILD_DIR}"
CACHE PATH "Add Monero directory for library searching")
include(MyUtils)
find_package(Monero)
# find boost # find boost
find_package(Boost COMPONENTS find_package(Boost COMPONENTS
system system
@ -26,80 +53,12 @@ find_package(Boost COMPONENTS
REQUIRED) REQUIRED)
# set location of monero static libraries
set(MONERO_LIBS_DIR
/opt/monero-dev/libs)
# set location of moneroheaders
set(MONERO_HEADERS_DIR
/opt/monero-dev/headers)
# include monero headers
include_directories(
${MONERO_HEADERS_DIR}/src
${MONERO_HEADERS_DIR}/external
${MONERO_HEADERS_DIR}/build
${MONERO_HEADERS_DIR}/contrib/epee/include
${MONERO_HEADERS_DIR}/external/easylogging++
${MONERO_HEADERS_DIR}/external/db_drivers/liblmdb)
if(APPLE) if(APPLE)
include_directories(/usr/local/opt/openssl/include) include_directories(/usr/local/opt/openssl/include)
link_directories(/usr/local/opt/openssl/lib) link_directories(/usr/local/opt/openssl/lib)
endif() endif()
# get individual monero static libraries
# that are needed in this project
add_library(common STATIC IMPORTED)
set_property(TARGET common PROPERTY IMPORTED_LOCATION ${MONERO_LIBS_DIR}/libcommon.a)
add_library(blocks STATIC IMPORTED)
set_property(TARGET blocks PROPERTY IMPORTED_LOCATION ${MONERO_LIBS_DIR}/libblocks.a)
add_library(cryptoxmr STATIC IMPORTED)
set_property(TARGET cryptoxmr
PROPERTY IMPORTED_LOCATION ${MONERO_LIBS_DIR}/libcrypto.a)
add_library(cryptonote_basic STATIC IMPORTED)
set_property(TARGET cryptonote_basic
PROPERTY IMPORTED_LOCATION ${MONERO_LIBS_DIR}/libcryptonote_basic.a)
add_library(cryptonote_core STATIC IMPORTED)
set_property(TARGET cryptonote_core
PROPERTY IMPORTED_LOCATION ${MONERO_LIBS_DIR}/libcryptonote_core.a)
add_library(cryptonote_protocol STATIC IMPORTED)
set_property(TARGET cryptonote_protocol
PROPERTY IMPORTED_LOCATION ${MONERO_LIBS_DIR}/libcryptonote_protocol.a)
add_library(daemonizer STATIC IMPORTED)
set_property(TARGET daemonizer
PROPERTY IMPORTED_LOCATION ${MONERO_LIBS_DIR}/libdaemonizer.a)
add_library(mnemonics STATIC IMPORTED)
set_property(TARGET mnemonics
PROPERTY IMPORTED_LOCATION ${MONERO_LIBS_DIR}/libmnemonics.a)
add_library(epee STATIC IMPORTED)
set_property(TARGET epee
PROPERTY IMPORTED_LOCATION ${MONERO_LIBS_DIR}/libepee.a)
add_library(blockchain_db STATIC IMPORTED)
set_property(TARGET blockchain_db
PROPERTY IMPORTED_LOCATION ${MONERO_LIBS_DIR}/libblockchain_db.a)
add_library(lmdb STATIC IMPORTED)
set_property(TARGET lmdb
PROPERTY IMPORTED_LOCATION ${MONERO_LIBS_DIR}/liblmdb.a)
add_library(ringct STATIC IMPORTED)
set_property(TARGET ringct
PROPERTY IMPORTED_LOCATION ${MONERO_LIBS_DIR}/libringct.a)
add_library(wallet STATIC IMPORTED)
set_property(TARGET wallet
PROPERTY IMPORTED_LOCATION ${MONERO_LIBS_DIR}/libwallet.a)
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin" OR WIN32) if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin" OR WIN32)
add_library(unbound STATIC IMPORTED) add_library(unbound STATIC IMPORTED)
@ -125,55 +84,7 @@ set(SOURCE_FILES
add_executable(${PROJECT_NAME} add_executable(${PROJECT_NAME}
${SOURCE_FILES}) ${SOURCE_FILES})
# Get the current working branch create_git_version()
execute_process(
COMMAND git rev-parse --abbrev-ref HEAD
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE GIT_BRANCH
OUTPUT_STRIP_TRAILING_WHITESPACE
)
# http://xit0.org/2013/04/cmake-use-git-branch-and-commit-details-in-project/
# Get the latest abbreviated commit hash of the working branch
execute_process(
COMMAND git log -1 --format=%h
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE GIT_COMMIT_HASH
OUTPUT_STRIP_TRAILING_WHITESPACE
)
# Get the date and time of last commit
execute_process(
COMMAND git log -1 --format=%cd --date=short
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE GIT_COMMIT_DATETIME
OUTPUT_STRIP_TRAILING_WHITESPACE
)
configure_file(
${CMAKE_SOURCE_DIR}/src/version.h.in
${CMAKE_BINARY_DIR}/gen/version.h
)
include_directories(${CMAKE_BINARY_DIR}/gen)
macro(configure_files srcDir destDir)
message(STATUS "Configuring directory ${destDir}")
make_directory(${destDir})
file(GLOB templateFiles RELATIVE ${srcDir} ${srcDir}/*)
foreach(templateFile ${templateFiles})
set(srcTemplatePath ${srcDir}/${templateFile})
if(NOT IS_DIRECTORY ${srcTemplatePath})
message(STATUS "Configuring file ${templateFile}")
configure_file(
${srcTemplatePath}
${destDir}/${templateFile}
@ONLY)
endif(NOT IS_DIRECTORY ${srcTemplatePath})
endforeach(templateFile)
endmacro(configure_files)
configure_files(${CMAKE_CURRENT_SOURCE_DIR}/src/templates ${CMAKE_CURRENT_BINARY_DIR}/templates) configure_files(${CMAKE_CURRENT_SOURCE_DIR}/src/templates ${CMAKE_CURRENT_BINARY_DIR}/templates)
configure_files(${CMAKE_CURRENT_SOURCE_DIR}/src/templates/css ${CMAKE_CURRENT_BINARY_DIR}/templates/css) configure_files(${CMAKE_CURRENT_SOURCE_DIR}/src/templates/css ${CMAKE_CURRENT_BINARY_DIR}/templates/css)
@ -196,6 +107,7 @@ set(LIBRARIES
common common
mnemonics mnemonics
epee epee
easylogging
${Boost_LIBRARIES} ${Boost_LIBRARIES}
pthread pthread
unbound unbound

View File

@ -74,39 +74,45 @@ The key features of the Onion Monero Blockchain Explorer are:
- the only explorer allowing to inspect encrypted key images file and output files. - the only explorer allowing to inspect encrypted key images file and output files.
- the only explorer able to estimate possible spendings based on address and viewkey. - the only explorer able to estimate possible spendings based on address and viewkey.
## Prerequisite ## Compilation on Ubuntu 16.04
Instruction for Monero 0.10.3 compilation and Monero headers and libraries setup are ##### Compile latest Monero
as shown here:
- [Compile Monero on Ubuntu 16.04 x64](https://github.com/moneroexamples/compile-monero-09-on-ubuntu-16-04)
- [lmdbcpp-monero](https://github.com/moneroexamples/lmdbcpp-monero.git) (optional)
## Compile and run the explorer Download and compile Monero recent monero realease into your home folder:
##### Monero headers and libraries setup ```bash
# first install monero dependecines
sudo apt update
The Onion Explorer uses Monero C++ libraries and headers. sudo apt install git build-essential cmake libboost-all-dev miniupnpc libunbound-dev graphviz doxygen libunwind8-dev pkg-config libssl-dev libcurl4-openssl-dev libgtest-dev
Instructions how to download source files and compile Monero,
setup header and library files are presented here:
- https://github.com/moneroexamples/compile-monero-09-on-ubuntu-16-04 (Ubuntu 16.04) # go to home folder
- https://github.com/moneroexamples/compile-monero-09-on-arch-linux (Arch Linux) cd ~
##### Compile and run git clone https://github.com/monero-project/monero
cd monero/
# checkout last monero version
git checkout -b v0.10.3.1
make
```
##### Compile and run the explorer
Once the Monero is compiled and setup, the explorer can be downloaded and compiled Once the Monero is compiled and setup, the explorer can be downloaded and compiled
as follows: as follows:
```bash ```bash
# go to home folder if still in ~/monero
cd ~
# download the source code # download the source code
git clone https://github.com/moneroexamples/onion-monero-blockchain-explorer.git git clone https://github.com/moneroexamples/onion-monero-blockchain-explorer.git
# enter the downloaded sourced code folder # enter the downloaded sourced code folder
cd onion-monero-blockchain-explorer cd onion-monero-blockchain-explorer
# make ~/Downloads forlder if you dont have it
# time zone library that explorer is using, puts there
# its database of time zone offsets
# make a build folder and enter it # make a build folder and enter it
mkdir build && cd build mkdir build && cd build
@ -117,7 +123,10 @@ cmake ..
make make
``` ```
When compilation finishes executable `xmrblocks` should be created. When compilation finishes executable `xmrblocks` should be created. Before running
please make sure that `~/Downloads` folder exists and is writable.
Time zone library that explorer is using, puts there
its database of time zone offsets
To run it: To run it:
``` ```
@ -138,6 +147,7 @@ Go to your browser: http://127.0.0.1:8081
``` ```
./xmrblocks -h ./xmrblocks -h
xmrblocks, start Onion Monero Blockchain Explorer:
-h [ --help ] [=arg(=1)] (=0) produce help message -h [ --help ] [=arg(=1)] (=0) produce help message
-t [ --testnet ] [=arg(=1)] (=0) use testnet blockchain -t [ --testnet ] [=arg(=1)] (=0) use testnet blockchain
--enable-pusher [=arg(=1)] (=0) enable pushing signed tx --enable-pusher [=arg(=1)] (=0) enable pushing signed tx
@ -149,11 +159,15 @@ Go to your browser: http://127.0.0.1:8081
enable users to have the index page on enable users to have the index page on
autorefresh autorefresh
-p [ --port ] arg (=8081) default port -p [ --port ] arg (=8081) default port
--no-blocks-on-index arg (=10) number of last blocks to be shown on
index page
-b [ --bc-path ] arg path to lmdb blockchain -b [ --bc-path ] arg path to lmdb blockchain
--ssl-crt-file arg A path to crt file for ssl (https) --ssl-crt-file arg A path to crt file for ssl (https)
functionality functionality
--ssl-key-file arg A path to key file for ssl (https) --ssl-key-file arg A path to key file for ssl (https)
functionality functionality
-c [ --custom-db-path ] arg path to the custom lmdb database used
for searching things
-d [ --deamon-url ] arg (=http:://127.0.0.1:18081) -d [ --deamon-url ] arg (=http:://127.0.0.1:18081)
monero address string monero address string
``` ```

87
cmake/FindMonero.cmake Normal file
View File

@ -0,0 +1,87 @@
#------------------------------------------------------------------------------
# CMake helper for the majority of the cpp-ethereum modules.
#
# This module defines
# Monero_XXX_LIBRARIES, the libraries needed to use ethereum.
# Monero_FOUND, If false, do not try to use ethereum.
#
# File addetped from cpp-ethereum
#
# The documentation for cpp-ethereum is hosted at http://cpp-ethereum.org
#
# ------------------------------------------------------------------------------
# This file is part of cpp-ethereum.
#
# cpp-ethereum is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# cpp-ethereum is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>
#
# (c) 2014-2016 cpp-ethereum contributors.
#------------------------------------------------------------------------------
set(LIBS common;blocks;cryptonote_basic;cryptonote_core;
cryptonote_protocol;daemonizer;mnemonics;epee;lmdb;
blockchain_db;ringct;wallet)
set(Xmr_INCLUDE_DIRS "${CPP_MONERO_DIR}")
# if the project is a subset of main cpp-ethereum project
# use same pattern for variables as Boost uses
foreach (l ${LIBS})
string(TOUPPER ${l} L)
find_library(Xmr_${L}_LIBRARY
NAMES ${l}
PATHS ${CMAKE_LIBRARY_PATH}
PATH_SUFFIXES "/src/${l}" "/external/db_drivers/lib${l}" "/lib" "/src/crypto" "/contrib/epee/src"
NO_DEFAULT_PATH
)
set(Xmr_${L}_LIBRARIES ${Xmr_${L}_LIBRARY})
message(STATUS FindMonero " Xmr_${L}_LIBRARIES ${Xmr_${L}_LIBRARY}")
add_library(${l} STATIC IMPORTED)
set_property(TARGET ${l} PROPERTY IMPORTED_LOCATION ${Xmr_${L}_LIBRARIES})
endforeach()
if (EXISTS ${MONERO_BUILD_DIR}/external/unbound/libunbound.a)
add_library(unbound STATIC IMPORTED)
set_property(TARGET unbound PROPERTY IMPORTED_LOCATION ${MONERO_BUILD_DIR}/external/unbound/libunbound.a)
endif()
if (EXISTS ${MONERO_BUILD_DIR}/src/crypto/libcrypto.a)
add_library(cryptoxmr STATIC IMPORTED)
set_property(TARGET cryptoxmr
PROPERTY IMPORTED_LOCATION ${MONERO_BUILD_DIR}/src/crypto/libcrypto.a)
endif()
if (EXISTS ${MONERO_BUILD_DIR}/external/easylogging++/libeasylogging.a)
add_library(easylogging STATIC IMPORTED)
set_property(TARGET easylogging
PROPERTY IMPORTED_LOCATION ${MONERO_BUILD_DIR}/external/easylogging++/libeasylogging.a)
endif()
message(STATUS ${MONERO_SOURCE_DIR}/build)
# include monero headers
include_directories(
${MONERO_SOURCE_DIR}/src
${MONERO_SOURCE_DIR}/external
${MONERO_SOURCE_DIR}/build
${MONERO_SOURCE_DIR}/external/easylogging++
${MONERO_SOURCE_DIR}/contrib/epee/include
${MONERO_SOURCE_DIR}/external/db_drivers/liblmdb)

52
cmake/MyUtils.cmake Normal file
View File

@ -0,0 +1,52 @@
macro(configure_files srcDir destDir)
message(STATUS "Configuring directory ${destDir}")
make_directory(${destDir})
file(GLOB templateFiles RELATIVE ${srcDir} ${srcDir}/*)
foreach(templateFile ${templateFiles})
set(srcTemplatePath ${srcDir}/${templateFile})
if(NOT IS_DIRECTORY ${srcTemplatePath})
message(STATUS "Configuring file ${templateFile}")
configure_file(
${srcTemplatePath}
${destDir}/${templateFile}
@ONLY)
endif(NOT IS_DIRECTORY ${srcTemplatePath})
endforeach(templateFile)
endmacro(configure_files)
macro(create_git_version)
# Get the current working branch
execute_process(
COMMAND git rev-parse --abbrev-ref HEAD
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE GIT_BRANCH
OUTPUT_STRIP_TRAILING_WHITESPACE
)
# http://xit0.org/2013/04/cmake-use-git-branch-and-commit-details-in-project/
# Get the latest abbreviated commit hash of the working branch
execute_process(
COMMAND git log -1 --format=%h
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE GIT_COMMIT_HASH
OUTPUT_STRIP_TRAILING_WHITESPACE
)
# Get the date and time of last commit
execute_process(
COMMAND git log -1 --format=%cd --date=short
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE GIT_COMMIT_DATETIME
OUTPUT_STRIP_TRAILING_WHITESPACE
)
configure_file(
${CMAKE_SOURCE_DIR}/src/version.h.in
${CMAKE_BINARY_DIR}/gen/version.h
)
include_directories(${CMAKE_BINARY_DIR}/gen)
endmacro(create_git_version)

View File

@ -1,155 +0,0 @@
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
3e9Hhw5mAjphnBXqRqq4GVlHfLk=

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.