Skip to content

Commit a59b143

Browse files
committed
Allow building fat binaries for MacOS
1 parent d35cfb2 commit a59b143

6 files changed

Lines changed: 245 additions & 21 deletions

File tree

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,6 @@
55

66
/external-libs/
77
/log_cpp_scratchpad.txt
8+
*.swp
9+
*.log
10+

CMakeLists.txt

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,36 @@ list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
22

33
cmake_minimum_required(VERSION 3.4.1)
44

5+
# if (NOT (${TARGET} STREQUAL CMAKE_HOST_SYSTEM_NAME))
6+
# set(DEPENDS TRUE)
7+
# endif()
8+
9+
project(MoneroCppLibrary)
10+
511
if (WIN32)
612
add_definitions( "-D_GLIBCXX_USE_NANOSLEEP=1" ) # "'sleep_for' is not a member of 'std::this_thread'" in gcc 4.7/4.8
713
add_definitions( "-DWIN32_LEAN_AND_MEAN" )
814
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wa,-mbig-obj -O2 -fPIC -std=c++14 -F/Library/Frameworks -pthread -lcrypto -lcrypt32 -lbcrypt")
915
else()
10-
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -std=c++14 -F/Library/Frameworks -pthread")
16+
if (NOT (${MON_VERSION} MATCHES "linux") AND DEPENDS)
17+
set(CMAKE_CXX_COMPILER_FORCED True)
18+
endif()
19+
message(STATUS "Target inside of cpp cmakelists is ${MON_VERSION}")
20+
if (${MON_VERSION} MATCHES "darwin" AND CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux")
21+
message(STATUS "Cross compiling from Linux to MacOS")
22+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -std=c++14 -F${CMAKE_SOURCE_DIR}/external/monero-project/contrib/depends/${FRAMEWORK_DIR} -pthread")
23+
else()
24+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -std=c++14 -F/Library/Frameworks -pthread")
25+
message(STATUS "Setting default CFLAGS=${CMAKE_CXX_FLAGS}")
26+
endif()
1127
endif()
1228

29+
1330
#SET(CMAKE_C_COMPILER /path/to/c/compiler)
1431
#SET(CMAKE_CXX_COMPILER /path/to/cpp/compiler)
1532
#SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
1633
#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
1734

18-
project(MoneroCppLibrary)
1935

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

32-
set(EXTERNAL_LIBS_DIR ${CMAKE_SOURCE_DIR}/external-libs)
33-
message(STATUS EXTERNAL_LIBS_DIR : ${EXTERNAL_LIBS_DIR})
34-
3548
####################
3649
# Extra libraries
3750
####################
@@ -133,9 +146,8 @@ add_definitions(-DHAVE_HIDAPI)
133146
# Monero
134147
#############
135148

136-
set(MONERO_PROJECT_BUILD "${MONERO_PROJECT}/build/release" CACHE STRING "Monero project build directory")
149+
set(MONERO_PROJECT_BUILD "${CMAKE_SOURCE_DIR}/external-libs/${MON_VERSION}/monero-project/release" CACHE STRING "Monero project build directory")
137150
message(STATUS "Using monero-project build: " ${MONERO_PROJECT_BUILD})
138-
139151
list(APPEND CMAKE_MODULE_PATH "${MONERO_PROJECT}/cmake")
140152

141153
add_library(wallet STATIC IMPORTED)
@@ -180,6 +192,10 @@ else()
180192
endif()
181193
endif()
182194

195+
############
196+
# Misc Libs
197+
############
198+
183199
add_library(rpc_base STATIC IMPORTED)
184200
set_target_properties(rpc_base PROPERTIES IMPORTED_LOCATION
185201
${MONERO_PROJECT_BUILD}/src/rpc/librpc_base.a)
@@ -279,6 +295,7 @@ set(
279295
src/wallet/monero_wallet_full.cpp
280296
)
281297

298+
282299
if (BUILD_LIBRARY)
283300
add_library(monero-cpp SHARED ${LIBRARY_SRC_FILES})
284301

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,8 @@ For example, [monero-java](https://github.com/woodser/monero-java) compiles this
162162
### Linux
163163
164164
1. Clone the project repository if applicable: `git clone --recurse-submodules https://github.com/woodser/monero-cpp.git`
165-
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`
165+
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
166+
python3 ccache doxygen graphviz nettle-dev libevent-dev llvm clang`
166167
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`).
167168
168169
For example, install expat:

bin/build_libmonero_cpp.sh

Lines changed: 202 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,214 @@
1-
#!/bin/sh
1+
#!/bin/bash
2+
3+
CURRENT_ARCH=`uname -m`
4+
CURRENT_OS=`uname -s`
25

3-
# build monero-project dependencies
46
cd ./external/monero-project/ || exit 1
57
git submodule update --init --force || exit 1
68
HOST_NCORES=$(nproc 2>/dev/null || shell nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 1)
7-
if [[ $(uname -s) == "MINGW64_NT"* || $(uname -s) == "MSYS"* ]]; then
9+
if [[ $CURRENT_OS == "MINGW64_NT"* || $CURRENT_OS == "MSYS"* ]]; then
10+
VERSION="${CURRENT_ARCH}-W${bit}-${CURRENT_OS}"
11+
12+
# monero-project
813
bit=$(getconf LONG_BIT)
14+
mkdir -p build/release
915
if [ "$bit" == "64" ]; then
1016
make release-static-win64 -j$HOST_NCORES || exit 1
1117
else
1218
make release-static-win32 -j$HOST_NCORES || exit 1
1319
fi
14-
else
15-
# OS is not windows
20+
mv build/release ../../external-libs/$VERSION/monero-project/
21+
22+
# monero-cpp
23+
cd ../../
24+
mkdir -p build/$CURRENT_ARCH/release &&
25+
cd build/$CURRENT_ARCH/release &&
26+
cmake -DMON_VERSION=$VERSION ../../.. &&
27+
cmake --build . &&
28+
make -j$HOST_NCORES .
29+
30+
elif [ $CURRENT_OS == "Darwin" ]; then
31+
32+
VERSION="${CURRENT_ARCH}-apple-darwin11"
33+
34+
# Build current architecture only.
35+
# monero-project
36+
printf "\nBuilding native release static version of monero-project for ${VERSION}\n"
1637
make release-static -j$HOST_NCORES || exit 1
38+
rm -rf ../../external-libs/$VERSION/monero-project
39+
mkdir -p ../../external-libs/$VERSION/monero-project/ &&
40+
mv build/release ../../external-libs/$VERSION/monero-project/
41+
cd ../..
42+
43+
# monero-cpp
44+
printf "\nBuilding native Monero-cpp for ${VERSION}\n"
45+
rm -rf build/$VERSION/release &&
46+
mkdir -p build/$VERSION/release &&
47+
cd build/$VERSION/release &&
48+
cmake -D MON_VERSION=$VERSION ../../.. &&
49+
cmake --build . &&
50+
make -j$HOST_NCORES .
51+
52+
else
53+
# Running on Linux
54+
# "OS" will be used as if it is called "WRAPPER"
55+
56+
rm -rf build
57+
BUILD_BOTH_ARCHS=0
58+
OS=""
59+
VENDOR=""
60+
61+
if [ "${TARGET}" == "darwin" ]; then
62+
OS="darwin11"
63+
VENDOR="apple"
64+
if [ -z "${ARCH}" ]; then
65+
BUILD_BOTH_ARCHS=1
66+
fi
67+
elif [ "${TARGET}" == "MSYS" ] || [ "${TARGET}" == "MINGW64_NT" ]; then
68+
OS="mingw32"
69+
VENDOR="w64"
70+
else
71+
OS="gnu"
72+
VENDOR="linux"
73+
fi
74+
75+
CPU=""
76+
if [ -n "${ARCH}" ]; then
77+
CPU="${ARCH}"
78+
else
79+
CPU=$CURRENT_ARCH
80+
fi
81+
82+
if [ $BUILD_BOTH_ARCHS == 1 ]; then
83+
# The target is darwin.
84+
printf "\nBuilding both Darwin architectures as a fat library\n"
85+
86+
ARM64_TOOLCHAIN="contrib/depends/aarch64-apple-darwin11/share/toolchain.cmake"
87+
X86_64_TOOLCHAIN="contrib/depends/x86_64-apple-darwin11/share/toolchain.cmake"
88+
89+
if [ -z $SKIP_MP ]; then
90+
printf "\nBuilding compilation dependencies for aarch64 Darwin\n"
91+
CUR_VERSION="aarch64-apple-darwin11"
92+
cd contrib/depends &&
93+
make HOST=$CUR_VERSION -j$HOST_NCORES &&
94+
echo \
95+
"set(FRAMEWORK_DIR \"contrib/depends/$CUR_VERSION/native/SDK/System/Library/Frameworks\")" \
96+
>> ../../$ARM64_TOOLCHAIN &&
97+
cd ../..
98+
99+
# build monero-project
100+
printf "\nBuilding monero-project for aarch64 Darwin\n"
101+
rm -rf build &&
102+
mkdir -p build/release && cd build/release &&
103+
cmake -j$HOST_NCORES -D STATIC=ON -D CMAKE_BUILD_TYPE=Release -D CMAKE_TOOLCHAIN_FILE=../../$ARM64_TOOLCHAIN ../.. && make -j$HOST_NCORES &&
104+
rm -rf ../../../../external-libs/$CUR_VERSION/monero-project
105+
mkdir -p ../../../../external-libs/$CUR_VERSION/monero-project/ &&
106+
cd ../.. && mv build/release ../../external-libs/$CUR_VERSION/monero-project/
107+
108+
# build monero-x64_64
109+
# Make dependencies
110+
printf "\nBuilding compilation dependencies for x86_64 Darwin\n"
111+
CUR_VERSION="x86_64-apple-darwin11"
112+
cd contrib/depends &&
113+
make HOST=$CUR_VERSION -j$HOST_NCORES &&
114+
echo \
115+
"set(FRAMEWORK_DIR \"contrib/depends/$CUR_VERSION/native/SDK/System/Library/Frameworks\")" \
116+
>> ../../$X86_64_TOOLCHAIN &&
117+
cd ../..
118+
119+
# build monero-project
120+
printf "\nBuilding monero-project for x86_64 Darwin\n"
121+
mkdir -p build/release && cd build/release &&
122+
cmake -j$HOST_NCORES -D STATIC=ON -D CMAKE_BUILD_TYPE=Release -D CMAKE_TOOLCHAIN_FILE=../../$X86_64_TOOLCHAIN ../.. &&
123+
make -j$HOST_NCORES &&
124+
rm -rf ../../../../external-libs/$CUR_VERSION/monero-project
125+
mkdir -p ../../../../external-libs/$CUR_VERSION/monero-project/
126+
cd ../.. && mv build/release ../../external-libs/$CUR_VERSION/monero-project/
127+
fi
128+
129+
# Build monero-cpp x86_64
130+
printf "\nBuilding x86_64 monero-cpp for Darwin\n"
131+
cd ../../ &&
132+
rm -rf build/x86_64-apple-darwin11/release &&
133+
rm -rf build/aarch64-apple-darwin11/release &&
134+
rm -rf build/darwin &&
135+
mkdir -p build/x86_64-apple-darwin11/release &&
136+
mkdir -p build/aarch64-apple-darwin11/release &&
137+
mkdir -p build/darwin/release
138+
139+
cd build/x86_64-apple-darwin11/release &&
140+
cmake -j$HOST_NCORES -D MON_VERSION=x86_64-apple-darwin11 -D CMAKE_TOOLCHAIN_FILE=../../../external/monero-project/$X86_64_TOOLCHAIN ../../.. &&
141+
make -j$HOST_NCORES
142+
143+
# Build monero-cpp arm64
144+
printf "\nBuilding aarch64 monero-cpp for Darwin\n"
145+
cd ../../aarch64-apple-darwin11/release &&
146+
cmake -j$HOST_NCORES -D MON_VERSION=aarch64-apple-darwin11 -D CMAKE_TOOLCHAIN_FILE=../../../external/monero-project/$ARM64_TOOLCHAIN ../../.. &&
147+
make -j$HOST_NCORES
148+
149+
# lipo the two builds together
150+
cd ../../..
151+
./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
152+
153+
elif [ $CPU == $CURRENT_ARCH ] && [ $VENDOR == "linux" ]; then
154+
# Fast native build / No Depends
155+
156+
VERSION="${CPU}-linux-gnu"
157+
158+
# Build current architecture only.
159+
# monero-project
160+
printf "\nBuilding native release static version of monero-project for ${VERSION}\n"
161+
make release-static USE_SINGLE_BUILDDIR=1 -j$HOST_NCORES || exit 1
162+
rm -rf ../../external-libs/$VERSION/monero-project
163+
mkdir -p ../../external-libs/$VERSION/monero-project/ &&
164+
mv build/release ../../external-libs/$VERSION/monero-project/
165+
cd ../..
166+
167+
# monero-cpp
168+
printf "\nBuilding native Monero-cpp for ${VERSION}\n"
169+
rm -rf build/$VERSION/release &&
170+
mkdir -p build/$VERSION/release &&
171+
cd build/$VERSION/release &&
172+
cmake -D MON_VERSION=$VERSION ../../.. &&
173+
cmake --build . &&
174+
make -j$HOST_NCORES .
175+
176+
else
177+
# Building 1 architecture for any platform
178+
179+
# "OS" is used as if it is named "WRAPPER"
180+
VERSION="${CPU}-${VENDOR}-${OS}" &&
181+
printf "\nBuilding for ${VERSION}\n"
182+
183+
# Make dependencies.
184+
if [ -z $SKIP_MP ]; then
185+
printf "\nBuilding compilation dependencies\n"
186+
cd contrib/depends &&
187+
make HOST=$VERSION -j$HOST_NCORES &&
188+
if [ $OS == "darwin11" ]; then
189+
echo \
190+
"set(FRAMEWORK_DIR \"contrib/depends/$VERSION/native/SDK/System/Library/Frameworks\")" \
191+
>> $VERSION/share/toolchain.cmake
192+
fi
193+
cd ../..
194+
195+
# Build monero-project
196+
printf "\nBuilding monero-project for ${VERSION}\n"
197+
mkdir -p build/release && cd build/release &&
198+
cmake -j$HOST_NCORES -D STATIC=ON -D CMAKE_BUILD_TYPE=Release -D CMAKE_TOOLCHAIN_FILE=../../contrib/depends/$VERSION/share/toolchain.cmake ../.. &&
199+
make -j$HOST_NCORES &&
200+
rm -rf ../../../../external-libs/$VERSION/monero-project
201+
mkdir -p ../../../../external-libs/$VERSION/monero-project/ &&
202+
cd ../.. && mv build/release ../../external-libs/$VERSION/monero-project/
203+
fi
204+
205+
# Build monero-cpp
206+
printf "\nBuilding monero-cpp for ${VERSION}\n"
207+
rm -rf ../../build/$VERSION/release &&
208+
mkdir -p ../../build/$VERSION/release &&
209+
cd ../../build/$VERSION/release &&
210+
cmake -j$HOST_NCORES -D MON_VERSION=$VERSION -D CMAKE_TOOLCHAIN_FILE=../../../external/monero-project/contrib/depends/$VERSION/share/toolchain.cmake ../../.. &&
211+
make -j$HOST_NCORES
212+
fi
17213
fi
18-
cd ../../
19-
20-
# build libmonero-cpp shared library
21-
mkdir -p build &&
22-
cd build &&
23-
cmake .. &&
24-
cmake --build . &&
25-
make .
214+

bin/clean-depends-sources.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/bin/bash
2+
3+
rm -rf external/monero-project/contrib/depends/sources/*

bin/clean.sh

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#!/bin/bash
2+
3+
rm -rf external-libs/*
4+
rm -rf external/monero-project/build/*
5+
rm -rf external/monero-project/contrib/depends/x86*
6+
rm -rf external/monero-project/contrib/depends/aarch*
7+
rm -rf external/monero-project/contrib/depends/i68*
8+
rm -rf external/monero-project/contrib/depends/work/*
9+
rm -rf external/monero-project/contrib/depends/built/*
10+
rm -rf build/*
11+

0 commit comments

Comments
 (0)