From 28f95eb001a47056287c8adf07c2638746ad8e48 Mon Sep 17 00:00:00 2001 From: me0wmix Date: Thu, 21 Jan 2016 11:18:26 -0700 Subject: [PATCH 1/7] OpenBSD support for Monero. --- CMakeLists.txt | 21 ++++++++++++++++----- contrib/epee/include/console_handler.h | 7 +++++++ src/blockchain_db/berkeleydb/db_bdb.cpp | 4 +++- src/common/int-util.h | 2 ++ src/crypto/crypto.cpp | 2 +- src/crypto/oaes_lib.c | 12 ++++++------ src/crypto/slow-hash.c | 2 +- src/crypto/tree-hash.c | 2 +- tests/performance_tests/performance_utils.h | 4 ++-- tests/unit_tests/slow_memmem.cpp | 4 ++-- 10 files changed, 41 insertions(+), 19 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 64b9f3e62..07ccc7197 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -139,12 +139,16 @@ elseif(CMAKE_SYSTEM_NAME MATCHES "DragonFly.*|FreeBSD") set(FREEBSD TRUE) endif() -# TODO: check bsdi, NetBSD, OpenBSD, to see if they need the same FreeBSD changes +# Check if we're on OpenBSD. Compile with gcc 4.9 from packages. +# Use "env CC=egcc CXX=eg++ CPP=ecpp make release-static-64" or similar. +if(CMAKE_SYSTEM_NAME MATCHES "kOpenBSD.*|OpenBSD.*") + set(OPENBSD TRUE) +endif() + +# TODO: check bsdi, NetBSD, to see if they need the same FreeBSD changes # # elseif(CMAKE_SYSTEM_NAME MATCHES "kNetBSD.*|NetBSD.*") # set(NETBSD TRUE) -# elseif(CMAKE_SYSTEM_NAME MATCHES "kOpenBSD.*|OpenBSD.*") -# set(OPENBSD TRUE) # elseif(CMAKE_SYSTEM_NAME MATCHES ".*BSDI.*") # set(BSDI TRUE) @@ -385,11 +389,18 @@ else() endif() endif() + if(OPENBSD) + # This works around some bugs in the gcc 4.9 package as well as forces Boost to use the multithreaded libs + set(CMAKE_AR "ar") + set(CMAKE_RANLIB "ranlib") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") + endif() + set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${DEBUG_FLAGS}") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${DEBUG_FLAGS}") set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} ${RELEASE_FLAGS}") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${RELEASE_FLAGS}") - if(STATIC AND NOT APPLE AND NOT FREEBSD) + if(STATIC AND NOT APPLE AND NOT FREEBSD AND NOT OPENBSD) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++") endif() endif() @@ -421,7 +432,7 @@ endif() include_directories(SYSTEM ${Boost_INCLUDE_DIRS}) if(MINGW) set(EXTRA_LIBRARIES mswsock;ws2_32;iphlpapi) -elseif(APPLE OR FREEBSD) +elseif(APPLE OR FREEBSD OR OPENBSD) set(EXTRA_LIBRARIES "") elseif(NOT MSVC) find_library(RT rt) diff --git a/contrib/epee/include/console_handler.h b/contrib/epee/include/console_handler.h index 685f0cc7b..5c63556ae 100644 --- a/contrib/epee/include/console_handler.h +++ b/contrib/epee/include/console_handler.h @@ -33,6 +33,9 @@ #include #include #include +#ifdef __OpenBSD__ +#include +#endif namespace epee { @@ -129,7 +132,11 @@ namespace epee bool wait_stdin_data() { #if !defined(WIN32) + #ifdef __OpenBSD__ + int stdin_fileno = fileno(stdin); + #else int stdin_fileno = ::fileno(stdin); + #endif while (m_run.load(std::memory_order_relaxed)) { diff --git a/src/blockchain_db/berkeleydb/db_bdb.cpp b/src/blockchain_db/berkeleydb/db_bdb.cpp index 1ccb6be12..02fdaba2f 100644 --- a/src/blockchain_db/berkeleydb/db_bdb.cpp +++ b/src/blockchain_db/berkeleydb/db_bdb.cpp @@ -783,9 +783,11 @@ void BlockchainBDB::open(const std::string& filename, const int db_flags) m_env->set_lk_max_locks(DB_MAX_LOCKS); m_env->set_lk_max_lockers(DB_MAX_LOCKS); m_env->set_lk_max_objects(DB_MAX_LOCKS); - + + #ifndef __OpenBSD__ //OpenBSD's DB package is too old to support this feature if(m_auto_remove_logs) m_env->log_set_config(DB_LOG_AUTO_REMOVE, 1); + #endif // last parameter left 0, files will be created with default rw access m_env->open(filename.c_str(), db_env_open_flags, 0); diff --git a/src/common/int-util.h b/src/common/int-util.h index 45ee5ef70..e9eddee9c 100644 --- a/src/common/int-util.h +++ b/src/common/int-util.h @@ -137,6 +137,7 @@ static inline uint32_t div128_32(uint64_t dividend_hi, uint64_t dividend_lo, uin static inline uint32_t ident32(uint32_t x) { return x; } static inline uint64_t ident64(uint64_t x) { return x; } +#ifndef __OpenBSD__ static inline uint32_t swap32(uint32_t x) { x = ((x & 0x00ff00ff) << 8) | ((x & 0xff00ff00) >> 8); return (x << 16) | (x >> 16); @@ -146,6 +147,7 @@ static inline uint64_t swap64(uint64_t x) { x = ((x & 0x0000ffff0000ffff) << 16) | ((x & 0xffff0000ffff0000) >> 16); return (x << 32) | (x >> 32); } +#endif #if defined(__GNUC__) #define UNUSED __attribute__((unused)) diff --git a/src/crypto/crypto.cpp b/src/crypto/crypto.cpp index 1e39a8b04..fa7b1b580 100644 --- a/src/crypto/crypto.cpp +++ b/src/crypto/crypto.cpp @@ -41,7 +41,7 @@ #include "crypto.h" #include "hash.h" -#ifndef __FreeBSD__ +#if !defined(__FreeBSD__) && !defined(__OpenBSD__) #include #else #include diff --git a/src/crypto/oaes_lib.c b/src/crypto/oaes_lib.c index c86b8caa0..7fbe96e4c 100644 --- a/src/crypto/oaes_lib.c +++ b/src/crypto/oaes_lib.c @@ -37,13 +37,13 @@ static const char _NR[] = { #include #include -// Both OS X and FreeBSD don't need malloc.h -#if !defined(__APPLE__) && !defined(__FreeBSD__) +// OS X, FreeBSD, and OpenBSD don't need malloc.h +#if !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__OpenBSD__) #include #endif -// FreeBSD also doesn't need timeb.h -#ifndef __FreeBSD__ +// FreeBSD, and OpenBSD also don't need timeb.h +#if !defined(__FreeBSD__) && !defined(__OpenBSD__) #include #else #include @@ -470,7 +470,7 @@ OAES_RET oaes_sprintf( #ifdef OAES_HAVE_ISAAC static void oaes_get_seed( char buf[RANDSIZ + 1] ) { - #ifndef __FreeBSD__ + #if !defined(__FreeBSD__) && !defined(__OpenBSD__) struct timeb timer; struct tm *gmTimer; char * _test = NULL; @@ -502,7 +502,7 @@ static void oaes_get_seed( char buf[RANDSIZ + 1] ) #else static uint32_t oaes_get_seed(void) { - #ifndef __FreeBSD__ + #if !defined(__FreeBSD__) && !defined(__OpenBSD__) struct timeb timer; struct tm *gmTimer; char * _test = NULL; diff --git a/src/crypto/slow-hash.c b/src/crypto/slow-hash.c index 544083fb0..903a3792f 100644 --- a/src/crypto/slow-hash.c +++ b/src/crypto/slow-hash.c @@ -421,7 +421,7 @@ void slow_hash_allocate_state(void) hp_state = (uint8_t *) VirtualAlloc(hp_state, MEMORY, MEM_LARGE_PAGES | MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); #else -#if defined(__APPLE__) || defined(__FreeBSD__) +#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) hp_state = mmap(0, MEMORY, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, 0, 0); #else diff --git a/src/crypto/tree-hash.c b/src/crypto/tree-hash.c index e90b23841..7a128e4b0 100644 --- a/src/crypto/tree-hash.c +++ b/src/crypto/tree-hash.c @@ -34,7 +34,7 @@ #include "hash-ops.h" -#ifndef __FreeBSD__ +#if !defined(__FreeBSD__) && !defined(__OpenBSD__) #include #else #include diff --git a/tests/performance_tests/performance_utils.h b/tests/performance_tests/performance_utils.h index fc9f8612d..ba2b71740 100644 --- a/tests/performance_tests/performance_utils.h +++ b/tests/performance_tests/performance_utils.h @@ -40,7 +40,7 @@ void set_process_affinity(int core) { -#if defined (__APPLE__) || defined(__FreeBSD__) +#if defined (__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) return; #elif defined(BOOST_WINDOWS) DWORD_PTR mask = 1; @@ -62,7 +62,7 @@ void set_process_affinity(int core) void set_thread_high_priority() { -#if defined(__APPLE__) || defined(__FreeBSD__) +#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) return; #elif defined(BOOST_WINDOWS) ::SetPriorityClass(::GetCurrentProcess(), HIGH_PRIORITY_CLASS); diff --git a/tests/unit_tests/slow_memmem.cpp b/tests/unit_tests/slow_memmem.cpp index 8da58eaf4..a14e01885 100644 --- a/tests/unit_tests/slow_memmem.cpp +++ b/tests/unit_tests/slow_memmem.cpp @@ -35,8 +35,8 @@ #include #include "gtest/gtest.h" -// Both OS X and FreeBSD don't need malloc.h -#if !defined(__APPLE__) && !defined(__FreeBSD__) +// OS X, FreeBSD, and OpenBSD don't need malloc.h +#if !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__OpenBSD__) #include #endif From c965bf4a7c105e385a940eb38c07dc5b052287d0 Mon Sep 17 00:00:00 2001 From: me0wmix Date: Thu, 21 Jan 2016 11:34:02 -0700 Subject: [PATCH 2/7] Added/corrected OpenBSD build instructions. --- CMakeLists.txt | 3 +-- README.md | 10 ++++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 07ccc7197..809ab35ff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -139,8 +139,7 @@ elseif(CMAKE_SYSTEM_NAME MATCHES "DragonFly.*|FreeBSD") set(FREEBSD TRUE) endif() -# Check if we're on OpenBSD. Compile with gcc 4.9 from packages. -# Use "env CC=egcc CXX=eg++ CPP=ecpp make release-static-64" or similar. +# Check if we're on OpenBSD. See the README.md for build instructions. if(CMAKE_SYSTEM_NAME MATCHES "kOpenBSD.*|OpenBSD.*") set(OPENBSD TRUE) endif() diff --git a/README.md b/README.md index ecd57e596..b1eceb390 100644 --- a/README.md +++ b/README.md @@ -162,6 +162,16 @@ The project can be built from scratch by following instructions for Unix and Lin We expect to add Monero into the ports tree in the near future, which will aid in managing installations using ports or packages. +### On OpenBSD: + +This has been tested on OpenBSD 5.8. + +You will need to add a few packages to your system. "pkg_add db cmake gcc gcc-libs miniupnpc gtest doxygen graphviz". + +The Boost package has a bug that will prevent librpc.a from building correctly. In order to fix this, you will have to Build boost yourself from scratch. Follow the directions here (under "Building Boost"): https://github.com/bitcoin/bitcoin/blob/master/doc/build-openbsd.md You will have to add the serialize, datetime, and regex modules when building as they are needed by Monero. + +To build: "env CC=egcc CXX=eg++ CPP=ecpp DEVELOPER_LOCAL_TOOLS=1 BOOST_ROOT=/path/to/the/boost/you/built make" (You may optionally build it statically by using the correct target.) + ## Building Documentation Monero developer documentation uses Doxygen, and is currently a work-in-progress. From efc771d682a9937a7963703c64ae782eaf941df4 Mon Sep 17 00:00:00 2001 From: me0wmix Date: Thu, 21 Jan 2016 11:36:25 -0700 Subject: [PATCH 3/7] Corrected formatting on OpenBSD instructions --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b1eceb390..9a3f45b72 100644 --- a/README.md +++ b/README.md @@ -168,9 +168,12 @@ This has been tested on OpenBSD 5.8. You will need to add a few packages to your system. "pkg_add db cmake gcc gcc-libs miniupnpc gtest doxygen graphviz". -The Boost package has a bug that will prevent librpc.a from building correctly. In order to fix this, you will have to Build boost yourself from scratch. Follow the directions here (under "Building Boost"): https://github.com/bitcoin/bitcoin/blob/master/doc/build-openbsd.md You will have to add the serialize, datetime, and regex modules when building as they are needed by Monero. +The Boost package has a bug that will prevent librpc.a from building correctly. In order to fix this, you will have to Build boost yourself from scratch. Follow the directions here (under "Building Boost"): +https://github.com/bitcoin/bitcoin/blob/master/doc/build-openbsd.md +You will have to add the serialize, datetime, and regex modules when building as they are needed by Monero. -To build: "env CC=egcc CXX=eg++ CPP=ecpp DEVELOPER_LOCAL_TOOLS=1 BOOST_ROOT=/path/to/the/boost/you/built make" (You may optionally build it statically by using the correct target.) +To build: "env CC=egcc CXX=eg++ CPP=ecpp DEVELOPER_LOCAL_TOOLS=1 BOOST_ROOT=/path/to/the/boost/you/built make" +You may optionally build it statically by using the correct target. ## Building Documentation From 82ecb3f0884f151f3a72862fa3bea43296f510b7 Mon Sep 17 00:00:00 2001 From: me0wmix Date: Thu, 21 Jan 2016 11:37:54 -0700 Subject: [PATCH 4/7] More formatting fixes to instructions --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9a3f45b72..cbee82c67 100644 --- a/README.md +++ b/README.md @@ -170,9 +170,11 @@ You will need to add a few packages to your system. "pkg_add db cmake gcc gcc-li The Boost package has a bug that will prevent librpc.a from building correctly. In order to fix this, you will have to Build boost yourself from scratch. Follow the directions here (under "Building Boost"): https://github.com/bitcoin/bitcoin/blob/master/doc/build-openbsd.md -You will have to add the serialize, datetime, and regex modules when building as they are needed by Monero. + +You will have to add the serialize, datetime, and regex modules to Boost when building as they are needed by Monero. To build: "env CC=egcc CXX=eg++ CPP=ecpp DEVELOPER_LOCAL_TOOLS=1 BOOST_ROOT=/path/to/the/boost/you/built make" + You may optionally build it statically by using the correct target. ## Building Documentation From 34ebfe39cde8f476417b0a69634eff4be073179a Mon Sep 17 00:00:00 2001 From: me0wmix Date: Fri, 22 Jan 2016 20:27:01 -0700 Subject: [PATCH 5/7] Last fixups in the Cmake stuff and better default build instruction --- CMakeLists.txt | 9 +-------- README.md | 4 +--- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 809ab35ff..c032bbee0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -382,19 +382,12 @@ else() set(RELEASE_FLAGS "${RELEASE_FLAGS} -ffat-lto-objects") endif() # Since gcc 4.9 the LTO format is non-standard (slim), so we need the gcc-specific ar and ranlib binaries - if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9.0)) + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9.0) AND NOT OPENBSD) set(CMAKE_AR "gcc-ar") set(CMAKE_RANLIB "gcc-ranlib") endif() endif() - if(OPENBSD) - # This works around some bugs in the gcc 4.9 package as well as forces Boost to use the multithreaded libs - set(CMAKE_AR "ar") - set(CMAKE_RANLIB "ranlib") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") - endif() - set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${DEBUG_FLAGS}") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${DEBUG_FLAGS}") set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} ${RELEASE_FLAGS}") diff --git a/README.md b/README.md index cbee82c67..4fc756f08 100644 --- a/README.md +++ b/README.md @@ -173,9 +173,7 @@ https://github.com/bitcoin/bitcoin/blob/master/doc/build-openbsd.md You will have to add the serialize, datetime, and regex modules to Boost when building as they are needed by Monero. -To build: "env CC=egcc CXX=eg++ CPP=ecpp DEVELOPER_LOCAL_TOOLS=1 BOOST_ROOT=/path/to/the/boost/you/built make" - -You may optionally build it statically by using the correct target. +To build: "env CC=egcc CXX=eg++ CPP=ecpp DEVELOPER_LOCAL_TOOLS=1 BOOST_ROOT=/path/to/the/boost/you/built make release-static-64" ## Building Documentation From a6794e2e3a9fad9d89c4cfbecca12ccc03b9eb2f Mon Sep 17 00:00:00 2001 From: me0wmix Date: Sun, 24 Jan 2016 17:55:22 -0700 Subject: [PATCH 6/7] Instructions updated to include g++ package and omit optional packages --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4fc756f08..11d215614 100644 --- a/README.md +++ b/README.md @@ -166,14 +166,16 @@ We expect to add Monero into the ports tree in the near future, which will aid i This has been tested on OpenBSD 5.8. -You will need to add a few packages to your system. "pkg_add db cmake gcc gcc-libs miniupnpc gtest doxygen graphviz". +You will need to add a few packages to your system. `pkg_add db cmake gcc gcc-libs g++ miniupnpc gtest`. + +The doxygen and graphviz packages are optional and require the xbase set. The Boost package has a bug that will prevent librpc.a from building correctly. In order to fix this, you will have to Build boost yourself from scratch. Follow the directions here (under "Building Boost"): https://github.com/bitcoin/bitcoin/blob/master/doc/build-openbsd.md -You will have to add the serialize, datetime, and regex modules to Boost when building as they are needed by Monero. +You will have to add the serialization, date_time, and regex modules to Boost when building as they are needed by Monero. -To build: "env CC=egcc CXX=eg++ CPP=ecpp DEVELOPER_LOCAL_TOOLS=1 BOOST_ROOT=/path/to/the/boost/you/built make release-static-64" +To build: 'env CC=egcc CXX=eg++ CPP=ecpp DEVELOPER_LOCAL_TOOLS=1 BOOST_ROOT=/path/to/the/boost/you/built make release-static-64' ## Building Documentation From 64f4cd965ff1ebe23cb6eabf07debb5b7f463d27 Mon Sep 17 00:00:00 2001 From: me0wmix Date: Sun, 24 Jan 2016 18:00:22 -0700 Subject: [PATCH 7/7] My markdown-fu sucks :P --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 11d215614..bd4b66878 100644 --- a/README.md +++ b/README.md @@ -175,7 +175,7 @@ https://github.com/bitcoin/bitcoin/blob/master/doc/build-openbsd.md You will have to add the serialization, date_time, and regex modules to Boost when building as they are needed by Monero. -To build: 'env CC=egcc CXX=eg++ CPP=ecpp DEVELOPER_LOCAL_TOOLS=1 BOOST_ROOT=/path/to/the/boost/you/built make release-static-64' +To build: `env CC=egcc CXX=eg++ CPP=ecpp DEVELOPER_LOCAL_TOOLS=1 BOOST_ROOT=/path/to/the/boost/you/built make release-static-64` ## Building Documentation