FindMonero.cmake added to simply building against Monero

master
moneroexamples 8 years ago
parent 05a7af350a
commit 4fc33137de

@ -8,10 +8,37 @@ project(${PROJECT_NAME})
set(CMAKE_CXX_FLAGS
"${CMAKE_CXX_FLAGS} -std=c++14")
if (WIN32)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wa,-mbig-obj -O3")
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_package(Boost COMPONENTS
system
@ -26,80 +53,12 @@ find_package(Boost COMPONENTS
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)
include_directories(/usr/local/opt/openssl/include)
link_directories(/usr/local/opt/openssl/lib)
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)
add_library(unbound STATIC IMPORTED)
@ -125,55 +84,7 @@ set(SOURCE_FILES
add_executable(${PROJECT_NAME}
${SOURCE_FILES})
# 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)
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)
create_git_version()
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)
@ -196,6 +107,7 @@ set(LIBRARIES
common
mnemonics
epee
easylogging
${Boost_LIBRARIES}
pthread
unbound

@ -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 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
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 latest Monero
## 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
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
# go to home folder
cd ~
The Onion Explorer uses Monero C++ libraries and headers.
Instructions how to download source files and compile Monero,
setup header and library files are presented here:
git clone https://github.com/monero-project/monero
- https://github.com/moneroexamples/compile-monero-09-on-ubuntu-16-04 (Ubuntu 16.04)
- https://github.com/moneroexamples/compile-monero-09-on-arch-linux (Arch Linux)
cd monero/
##### Compile and run
# 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
as follows:
```bash
# go to home folder if still in ~/monero
cd ~
# download the source code
git clone https://github.com/moneroexamples/onion-monero-blockchain-explorer.git
# enter the downloaded sourced code folder
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
mkdir build && cd build
@ -117,7 +123,10 @@ cmake ..
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:
```
@ -138,6 +147,7 @@ Go to your browser: http://127.0.0.1:8081
```
./xmrblocks -h
xmrblocks, start Onion Monero Blockchain Explorer:
-h [ --help ] [=arg(=1)] (=0) produce help message
-t [ --testnet ] [=arg(=1)] (=0) use testnet blockchain
--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
autorefresh
-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
--ssl-crt-file arg A path to crt file for ssl (https)
functionality
--ssl-key-file arg A path to key file for ssl (https)
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)
monero address string
```

@ -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)

@ -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)

@ -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.
Loading…
Cancel
Save