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
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,6 @@

/external-libs/
/log_cpp_scratchpad.txt
*.swp
*.log

45 changes: 31 additions & 14 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,36 @@ list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_CURRENT_SOURCE_DIR}/cmake")

cmake_minimum_required(VERSION 3.4.1)

# if (NOT (${TARGET} STREQUAL CMAKE_HOST_SYSTEM_NAME))
# set(DEPENDS TRUE)
# endif()

project(MoneroCppLibrary)

if (WIN32)
add_definitions( "-D_GLIBCXX_USE_NANOSLEEP=1" ) # "'sleep_for' is not a member of 'std::this_thread'" in gcc 4.7/4.8
add_definitions( "-DWIN32_LEAN_AND_MEAN" )
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wa,-mbig-obj -O2 -fPIC -std=c++14 -F/Library/Frameworks -pthread -lcrypto -lcrypt32 -lbcrypt")
else()
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -std=c++14 -F/Library/Frameworks -pthread")
if (NOT (${MON_VERSION} MATCHES "linux") AND DEPENDS)
set(CMAKE_CXX_COMPILER_FORCED True)
endif()
message(STATUS "Target inside of cpp cmakelists is ${MON_VERSION}")
if (${MON_VERSION} MATCHES "darwin" AND CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux")
message(STATUS "Cross compiling from Linux to MacOS")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -std=c++14 -F${CMAKE_SOURCE_DIR}/external/monero-project/contrib/depends/${FRAMEWORK_DIR} -pthread")
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -std=c++14 -F/Library/Frameworks -pthread")
message(STATUS "Setting default CFLAGS=${CMAKE_CXX_FLAGS}")
endif()
endif()


#SET(CMAKE_C_COMPILER /path/to/c/compiler)
#SET(CMAKE_CXX_COMPILER /path/to/cpp/compiler)
#SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
#SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -std=c++14 -F/Library/Frameworks -pthread -fsanitize=address") # TODO: way to enable sanitize? get runtime error with this on

project(MoneroCppLibrary)

set(BUILD_LIBRARY ON)
set(BUILD_SAMPLE OFF)
Expand All @@ -29,9 +45,6 @@ set(BUILD_TESTS OFF)
set(MONERO_PROJECT "${CMAKE_SOURCE_DIR}/external/monero-project" CACHE STRING "Monero project source directory")
set(MONERO_PROJECT_SRC "${MONERO_PROJECT}/src")

set(EXTERNAL_LIBS_DIR ${CMAKE_SOURCE_DIR}/external-libs)
message(STATUS EXTERNAL_LIBS_DIR : ${EXTERNAL_LIBS_DIR})

####################
# Extra libraries
####################
Expand Down Expand Up @@ -133,9 +146,8 @@ add_definitions(-DHAVE_HIDAPI)
# Monero
#############

set(MONERO_PROJECT_BUILD "${MONERO_PROJECT}/build/release" CACHE STRING "Monero project build directory")
set(MONERO_PROJECT_BUILD "${CMAKE_SOURCE_DIR}/external-libs/${MON_VERSION}/monero-project/release" CACHE STRING "Monero project build directory")
message(STATUS "Using monero-project build: " ${MONERO_PROJECT_BUILD})

list(APPEND CMAKE_MODULE_PATH "${MONERO_PROJECT}/cmake")

add_library(wallet STATIC IMPORTED)
Expand Down Expand Up @@ -180,6 +192,10 @@ else()
endif()
endif()

############
# Misc Libs
############

add_library(rpc_base STATIC IMPORTED)
set_target_properties(rpc_base PROPERTIES IMPORTED_LOCATION
${MONERO_PROJECT_BUILD}/src/rpc/librpc_base.a)
Expand Down Expand Up @@ -279,6 +295,7 @@ set(
src/wallet/monero_wallet_full.cpp
)


if (BUILD_LIBRARY)
add_library(monero-cpp SHARED ${LIBRARY_SRC_FILES})

Expand Down Expand Up @@ -342,13 +359,13 @@ if (BUILD_LIBRARY)
${EXTRA_LIBRARIES}
)

if (WIN32)
target_link_options(monero-cpp PUBLIC "-Wl,--enable-auto-import,--export-all-symbols")
endif()

if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
target_link_options(monero-cpp PRIVATE "-z" "noexecstack")
endif()
if (WIN32)
target_link_options(monero-cpp PUBLIC "-Wl,--enable-auto-import,--export-all-symbols")
endif()
if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
target_link_options(monero-cpp PRIVATE "-z" "noexecstack")
endif()

INSTALL(FILES src/daemon/monero_daemon.h
src/daemon/monero_daemon_model.h
Expand Down
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,8 @@ For example, [monero-java](https://github.com/woodser/monero-java) compiles this
### Linux

1. Clone the project repository if applicable: `git clone --recurse-submodules https://github.com/woodser/monero-cpp.git`
2. Update dependencies: `sudo apt update && sudo apt install build-essential cmake pkg-config libssl-dev libzmq3-dev libunbound-dev libsodium-dev libunwind8-dev liblzma-dev libreadline6-dev libexpat1-dev libpgm-dev qttools5-dev-tools libhidapi-dev libusb-1.0-0-dev libprotobuf-dev protobuf-compiler libudev-dev libboost-chrono-dev libboost-date-time-dev libboost-filesystem-dev libboost-locale-dev libboost-program-options-dev libboost-regex-dev libboost-serialization-dev libboost-system-dev libboost-thread-dev python3 ccache doxygen graphviz nettle-dev libevent-dev`
2. Update dependencies: `sudo apt update && sudo apt install build-essential cmake pkg-config libssl-dev libzmq3-dev libsodium-dev libunwind8-dev liblzma-dev libreadline6-dev libexpat1-dev libpgm-dev qttools5-dev-tools libhidapi-dev libusb-1.0-0-dev libprotobuf-dev protobuf-compiler libudev-dev libboost-chrono-dev libboost-date-time-dev libboost-filesystem-dev libboost-locale-dev libboost-program-options-dev libboost-regex-dev libboost-serialization-dev libboost-system-dev libboost-thread-dev
python3 ccache doxygen graphviz nettle-dev libevent-dev llvm clang`
3. Follow instructions to install [unbound](https://unbound.docs.nlnetlabs.nl/en/latest/getting-started/installation.html) for Linux to your home directory (e.g. `~/unbound-1.19.0`).

For example, install expat:
Expand Down
236 changes: 218 additions & 18 deletions bin/build_libmonero_cpp.sh
Original file line number Diff line number Diff line change
@@ -1,25 +1,225 @@
#!/bin/sh
#!/bin/bash

CURRENT_ARCH=`uname -m`
CURRENT_OS=`uname -s`

# build monero-project dependencies
cd ./external/monero-project/ || exit 1
git submodule update --init --force || exit 1
HOST_NCORES=$(nproc 2>/dev/null || shell nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 1)
if [[ $(uname -s) == "MINGW64_NT"* || $(uname -s) == "MSYS"* ]]; then
bit=$(getconf LONG_BIT)
if [ "$bit" == "64" ]; then
make release-static-win64 -j$HOST_NCORES || exit 1
else
make release-static-win32 -j$HOST_NCORES || exit 1
if [[ $CURRENT_OS == "MINGW64_NT"* || $CURRENT_OS == "MSYS"* ]]; then
VERSION="${CURRENT_ARCH}-W${bit}-${CURRENT_OS}"

# monero-project
if [ -z $SKIP_MP ]; then
bit=$(getconf LONG_BIT)
rm -rf build/release
rm -rf ../../external-libs/$VERSION/monero-project/
mkdir ../../external-libs/$VERSION/monero-project/
if [ "$bit" == "64" ]; then
make release-static-win64 -j$HOST_NCORES || exit 1
else
make release-static-win32 -j$HOST_NCORES || exit 1
fi
mv build/release ../../external-libs/$VERSION/monero-project/
fi

# monero-cpp
cd ../../
rm -rf build/$CURRENT_ARCH/release
mkdir -p build/$CURRENT_ARCH/release &&
cd build/$CURRENT_ARCH/release &&
cmake -DMON_VERSION=$VERSION ../../.. &&
cmake --build . &&
make -j$HOST_NCORES .

elif [ $CURRENT_OS == "Darwin" ]; then

VERSION="${CURRENT_ARCH}-apple-darwin11"

# Build current architecture only.
# monero-project
if [ -z $SKIP_MP ]; then
printf "\nBuilding native release static version of monero-project for ${VERSION}\n"
rm -rf build/release
make release-static -j$HOST_NCORES || exit 1
rm -rf ../../external-libs/$VERSION/monero-project
mkdir -p ../../external-libs/$VERSION/monero-project/ &&
mv build/release ../../external-libs/$VERSION/monero-project/
fi

# monero-cpp
cd ../..
printf "\nBuilding native Monero-cpp for ${VERSION}\n"
rm -rf build/$VERSION/release &&
mkdir -p build/$VERSION/release &&
cd build/$VERSION/release &&
cmake -D MON_VERSION=$VERSION ../../.. &&
cmake --build .

else
# OS is not windows
make release-static -j$HOST_NCORES || exit 1
# Running on Linux
# "OS" will be used as if it is called "WRAPPER"

rm -rf build
BUILD_BOTH_ARCHS=0
OS=""
VENDOR=""

if [ "${TARGET}" == "darwin" ]; then
OS="darwin11"
VENDOR="apple"
if [ -z "${ARCH}" ]; then
BUILD_BOTH_ARCHS=1
fi
elif [ "${TARGET}" == "MSYS" ] || [ "${TARGET}" == "MINGW64_NT" ]; then
OS="mingw32"
VENDOR="w64"
else
OS="gnu"
VENDOR="linux"
fi

CPU=""
if [ -n "${ARCH}" ]; then
CPU="${ARCH}"
else
CPU=$CURRENT_ARCH
fi

if [ $BUILD_BOTH_ARCHS == 1 ]; then
# The target is darwin.
printf "\nBuilding both Darwin architectures as a fat library\n"

ARM64_TOOLCHAIN="contrib/depends/aarch64-apple-darwin11/share/toolchain.cmake"
X86_64_TOOLCHAIN="contrib/depends/x86_64-apple-darwin11/share/toolchain.cmake"

if [ -z $SKIP_MP ]; then
printf "\nBuilding compilation dependencies for aarch64 Darwin\n"
CUR_VERSION="aarch64-apple-darwin11"
cd contrib/depends &&
rm -rf "${CUR_VERSION}"
make HOST=$CUR_VERSION -j$HOST_NCORES &&
echo \
"set(FRAMEWORK_DIR \"contrib/depends/$CUR_VERSION/native/SDK/System/Library/Frameworks\")" \
>> ../../$ARM64_TOOLCHAIN &&
cd ../..

# build monero-project
printf "\nBuilding monero-project for aarch64 Darwin\n"
rm -rf build &&
mkdir -p build/release && cd build/release &&
cmake -j$HOST_NCORES -D STATIC=ON -D CMAKE_BUILD_TYPE=Release -D CMAKE_TOOLCHAIN_FILE=../../$ARM64_TOOLCHAIN ../.. && make -j$HOST_NCORES &&
rm -rf ../../../../external-libs/$CUR_VERSION/monero-project
mkdir -p ../../../../external-libs/$CUR_VERSION/monero-project/ &&
cd ../.. && mv build/release ../../external-libs/$CUR_VERSION/monero-project/

# build monero-x64_64
# Make dependencies
printf "\nBuilding compilation dependencies for x86_64 Darwin\n"
CUR_VERSION="x86_64-apple-darwin11"
cd contrib/depends &&
rm -rf "${CUR_VERSION}"
make HOST=$CUR_VERSION -j$HOST_NCORES &&
echo \
"set(FRAMEWORK_DIR \"contrib/depends/$CUR_VERSION/native/SDK/System/Library/Frameworks\")" \
>> ../../$X86_64_TOOLCHAIN &&
cd ../..

# build monero-project
printf "\nBuilding monero-project for x86_64 Darwin\n"
rm -rf build/release && mkdir -p build/release && cd build/release &&
cmake -j$HOST_NCORES -D STATIC=ON -D CMAKE_BUILD_TYPE=Release -D CMAKE_TOOLCHAIN_FILE=../../$X86_64_TOOLCHAIN ../.. &&
make -j$HOST_NCORES &&
rm -rf ../../../../external-libs/$CUR_VERSION/monero-project
mkdir -p ../../../../external-libs/$CUR_VERSION/monero-project/
cd ../.. && mv build/release ../../external-libs/$CUR_VERSION/monero-project/
fi

# Build monero-cpp x86_64
printf "\nBuilding x86_64 monero-cpp for Darwin\n"
cd ../../ &&
rm -rf build/x86_64-apple-darwin11/release &&
rm -rf build/aarch64-apple-darwin11/release &&
rm -rf build/darwin &&
mkdir -p build/x86_64-apple-darwin11/release &&
mkdir -p build/aarch64-apple-darwin11/release &&
mkdir -p build/darwin/release

cd build/x86_64-apple-darwin11/release &&
cmake -j$HOST_NCORES -D MON_VERSION=x86_64-apple-darwin11 -D CMAKE_TOOLCHAIN_FILE=../../../external/monero-project/$X86_64_TOOLCHAIN ../../.. &&
make -j$HOST_NCORES

# Build monero-cpp arm64
printf "\nBuilding aarch64 monero-cpp for Darwin\n"
cd ../../aarch64-apple-darwin11/release &&
cmake -j$HOST_NCORES -D MON_VERSION=aarch64-apple-darwin11 -D CMAKE_TOOLCHAIN_FILE=../../../external/monero-project/$ARM64_TOOLCHAIN ../../.. &&
make -j$HOST_NCORES

# lipo the two builds together
cd ../../..
./external/monero-project/contrib/depends/${CURRENT_ARCH}-apple-darwin11/native/bin/${CURRENT_ARCH}-apple-darwin11-lipo -create -output build/darwin/release/libmonero-cpp.dylib build/x86_64-apple-darwin11/release/libmonero-cpp.dylib build/aarch64-apple-darwin11/release/libmonero-cpp.dylib

elif [ $CPU == $CURRENT_ARCH ] && [ $VENDOR == "linux" ]; then
# Fast native build / No Depends

VERSION="${CPU}-linux-gnu"

# Build current architecture only.
# monero-project
printf "\nBuilding native release static version of monero-project for ${VERSION}\n"
rm -rf build/release
make release-static USE_SINGLE_BUILDDIR=1 -j$HOST_NCORES || exit 1
rm -rf ../../external-libs/$VERSION/monero-project
mkdir -p ../../external-libs/$VERSION/monero-project/ &&
mv build/release ../../external-libs/$VERSION/monero-project/
cd ../..

# monero-cpp
printf "\nBuilding native Monero-cpp for ${VERSION}\n"
rm -rf build/$VERSION/release &&
mkdir -p build/$VERSION/release &&
cd build/$VERSION/release &&
cmake -D MON_VERSION=$VERSION ../../.. &&
cmake --build . &&
make -j$HOST_NCORES .

else
# Building 1 architecture for any platform

# "OS" is used as if it is named "WRAPPER"
VERSION="${CPU}-${VENDOR}-${OS}" &&
printf "\nBuilding for ${VERSION}\n"

# Make dependencies.
if [ -z $SKIP_MP ]; then
printf "\nBuilding compilation dependencies\n"
cd contrib/depends &&
rm -rf "${VERSION}"
make HOST=$VERSION -j$HOST_NCORES &&
if [ $OS == "darwin11" ]; then
echo \
"set(FRAMEWORK_DIR \"contrib/depends/$VERSION/native/SDK/System/Library/Frameworks\")" \
>> $VERSION/share/toolchain.cmake
fi
cd ../..

# Build monero-project
printf "\nBuilding monero-project for ${VERSION}\n"
rm -rf build/release && mkdir -p build/release && cd build/release &&
cmake -j$HOST_NCORES -D STATIC=ON -D CMAKE_BUILD_TYPE=Release -D CMAKE_TOOLCHAIN_FILE=../../contrib/depends/$VERSION/share/toolchain.cmake ../.. &&
make -j$HOST_NCORES &&
rm -rf ../../../../external-libs/$VERSION/monero-project
mkdir -p ../../../../external-libs/$VERSION/monero-project/ &&
cd ../.. && mv build/release ../../external-libs/$VERSION/monero-project/
fi

# Build monero-cpp
printf "\nBuilding monero-cpp for ${VERSION}\n"
rm -rf ../../build/$VERSION/release &&
mkdir -p ../../build/$VERSION/release &&
cd ../../build/$VERSION/release &&
cmake -j$HOST_NCORES -D MON_VERSION=$VERSION -D CMAKE_TOOLCHAIN_FILE=../../../external/monero-project/contrib/depends/$VERSION/share/toolchain.cmake ../../.. &&
make -j$HOST_NCORES
fi
fi
cd ../../

# build libmonero-cpp shared library
mkdir -p build &&
cd build &&
cmake .. &&
cmake --build . &&
make .

3 changes: 3 additions & 0 deletions bin/clean-depends-sources.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/bin/bash

rm -rf external/monero-project/contrib/depends/sources/*
11 changes: 11 additions & 0 deletions bin/clean.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#!/bin/bash

rm -rf external-libs/*
rm -rf external/monero-project/build/*
rm -rf external/monero-project/contrib/depends/x86*
rm -rf external/monero-project/contrib/depends/aarch*
rm -rf external/monero-project/contrib/depends/i68*
rm -rf external/monero-project/contrib/depends/work/*
rm -rf external/monero-project/contrib/depends/built/*
rm -rf build/*