mirror of
https://github.com/monero-project/monero.git
synced 2025-08-01 01:08:47 -04:00
blocks: use auto-generated .c files instead of 'LD -r -b binary'
This commit is contained in:
parent
215651cbb3
commit
02d3ef7bda
17 changed files with 113 additions and 185 deletions
|
@ -26,20 +26,23 @@
|
|||
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
if(APPLE)
|
||||
add_library(blocks STATIC blockexports.c)
|
||||
set_target_properties(blocks PROPERTIES LINKER_LANGUAGE C)
|
||||
else()
|
||||
if(LINUX_32)
|
||||
add_custom_command(OUTPUT blocks.o MAIN_DEPENDENCY blocks.dat COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && ${CMAKE_LINKER} -m elf_i386 ${LD_RAW_FLAGS} -r -b binary -o ${CMAKE_CURRENT_BINARY_DIR}/blocks.o blocks.dat)
|
||||
add_custom_command(OUTPUT testnet_blocks.o MAIN_DEPENDENCY testnet_blocks.dat COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && ${CMAKE_LINKER} -m elf_i386 ${LD_RAW_FLAGS} -r -b binary -o ${CMAKE_CURRENT_BINARY_DIR}/testnet_blocks.o testnet_blocks.dat)
|
||||
add_custom_command(OUTPUT stagenet_blocks.o MAIN_DEPENDENCY stagenet_blocks.dat COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && ${CMAKE_LINKER} -m elf_i386 ${LD_RAW_FLAGS} -r -b binary -o ${CMAKE_CURRENT_BINARY_DIR}/stagenet_blocks.o stagenet_blocks.dat)
|
||||
else()
|
||||
add_custom_command(OUTPUT blocks.o MAIN_DEPENDENCY blocks.dat COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && ${CMAKE_LINKER} ${LD_RAW_FLAGS} -r -b binary -o ${CMAKE_CURRENT_BINARY_DIR}/blocks.o blocks.dat)
|
||||
add_custom_command(OUTPUT testnet_blocks.o MAIN_DEPENDENCY testnet_blocks.dat COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && ${CMAKE_LINKER} ${LD_RAW_FLAGS} -r -b binary -o ${CMAKE_CURRENT_BINARY_DIR}/testnet_blocks.o testnet_blocks.dat)
|
||||
add_custom_command(OUTPUT stagenet_blocks.o MAIN_DEPENDENCY stagenet_blocks.dat COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && ${CMAKE_LINKER} ${LD_RAW_FLAGS} -r -b binary -o ${CMAKE_CURRENT_BINARY_DIR}/stagenet_blocks.o stagenet_blocks.dat)
|
||||
endif()
|
||||
add_library(blocks STATIC blocks.o testnet_blocks.o stagenet_blocks.o blockexports.c)
|
||||
set_target_properties(blocks PROPERTIES LINKER_LANGUAGE C)
|
||||
endif()
|
||||
set(GENERATED_SOURCES "")
|
||||
|
||||
foreach(BLOB_NAME checkpoints testnet_blocks stagenet_blocks)
|
||||
set(OUTPUT_C_SOURCE "generated_${BLOB_NAME}.c")
|
||||
list(APPEND GENERATED_SOURCES ${OUTPUT_C_SOURCE})
|
||||
set(INPUT_DAT_FILE "${BLOB_NAME}.dat")
|
||||
add_custom_command(
|
||||
OUTPUT ${OUTPUT_C_SOURCE}
|
||||
MAIN_DEPENDENCY ${INPUT_DAT_FILE}
|
||||
COMMAND
|
||||
cd ${CMAKE_CURRENT_BINARY_DIR} &&
|
||||
echo "'#include\t<stddef.h>'" > ${OUTPUT_C_SOURCE} &&
|
||||
echo -n "'const\tunsigned\tchar\t${BLOB_NAME}[]={'" >> ${OUTPUT_C_SOURCE} &&
|
||||
od -v -An -w1 -tu1 ${CMAKE_CURRENT_SOURCE_DIR}/${INPUT_DAT_FILE} | sed -e "':a;N;$$!ba;s/\\n/,/g'" >> ${OUTPUT_C_SOURCE} &&
|
||||
echo "'};'" >> ${OUTPUT_C_SOURCE} &&
|
||||
echo "'const\tsize_t\t${BLOB_NAME}_len\t=\tsizeof(${BLOB_NAME});'" >> ${OUTPUT_C_SOURCE}
|
||||
)
|
||||
endforeach()
|
||||
|
||||
add_library(blocks STATIC blocks.cpp ${GENERATED_SOURCES})
|
||||
|
|
|
@ -1,87 +0,0 @@
|
|||
#include <stddef.h>
|
||||
|
||||
#if defined(__APPLE__)
|
||||
#include <mach-o/getsect.h>
|
||||
#ifdef BUILD_SHARED_LIBS
|
||||
#if !defined(__LP64__)
|
||||
const struct mach_header _mh_execute_header;
|
||||
#else
|
||||
const struct mach_header_64 _mh_execute_header;
|
||||
#endif
|
||||
#else
|
||||
#if !defined(__LP64__)
|
||||
extern const struct mach_header _mh_execute_header;
|
||||
#else
|
||||
extern const struct mach_header_64 _mh_execute_header;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
const unsigned char *get_blocks_dat_start(int testnet, int stagenet)
|
||||
{
|
||||
size_t size;
|
||||
if (testnet)
|
||||
return getsectiondata(&_mh_execute_header, "__DATA", "__testnet_blocks_dat", &size);
|
||||
else if (stagenet)
|
||||
return getsectiondata(&_mh_execute_header, "__DATA", "__stagenet_blocks_dat", &size);
|
||||
else
|
||||
return getsectiondata(&_mh_execute_header, "__DATA", "__blocks_dat", &size);
|
||||
}
|
||||
|
||||
size_t get_blocks_dat_size(int testnet, int stagenet)
|
||||
{
|
||||
size_t size;
|
||||
if (testnet)
|
||||
getsectiondata(&_mh_execute_header, "__DATA", "__testnet_blocks_dat", &size);
|
||||
else if (stagenet)
|
||||
getsectiondata(&_mh_execute_header, "__DATA", "__stagenet_blocks_dat", &size);
|
||||
else
|
||||
getsectiondata(&_mh_execute_header, "__DATA", "__blocks_dat", &size);
|
||||
return size;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#if defined(_WIN32) && !defined(_WIN64)
|
||||
#define _binary_blocks_start binary_blocks_dat_start
|
||||
#define _binary_blocks_end binary_blocks_dat_end
|
||||
#define _binary_testnet_blocks_start binary_testnet_blocks_dat_start
|
||||
#define _binary_testnet_blocks_end binary_testnet_blocks_dat_end
|
||||
#define _binary_stagenet_blocks_start binary_stagenet_blocks_dat_start
|
||||
#define _binary_stagenet_blocks_end binary_stagenet_blocks_dat_end
|
||||
#else
|
||||
#define _binary_blocks_start _binary_blocks_dat_start
|
||||
#define _binary_blocks_end _binary_blocks_dat_end
|
||||
#define _binary_testnet_blocks_start _binary_testnet_blocks_dat_start
|
||||
#define _binary_testnet_blocks_end _binary_testnet_blocks_dat_end
|
||||
#define _binary_stagenet_blocks_start _binary_stagenet_blocks_dat_start
|
||||
#define _binary_stagenet_blocks_end _binary_stagenet_blocks_dat_end
|
||||
#endif
|
||||
|
||||
extern const unsigned char _binary_blocks_start[];
|
||||
extern const unsigned char _binary_blocks_end[];
|
||||
extern const unsigned char _binary_testnet_blocks_start[];
|
||||
extern const unsigned char _binary_testnet_blocks_end[];
|
||||
extern const unsigned char _binary_stagenet_blocks_start[];
|
||||
extern const unsigned char _binary_stagenet_blocks_end[];
|
||||
|
||||
const unsigned char *get_blocks_dat_start(int testnet, int stagenet)
|
||||
{
|
||||
if (testnet)
|
||||
return _binary_testnet_blocks_start;
|
||||
else if (stagenet)
|
||||
return _binary_stagenet_blocks_start;
|
||||
else
|
||||
return _binary_blocks_start;
|
||||
}
|
||||
|
||||
size_t get_blocks_dat_size(int testnet, int stagenet)
|
||||
{
|
||||
if (testnet)
|
||||
return (size_t) (_binary_testnet_blocks_end - _binary_testnet_blocks_start);
|
||||
else if (stagenet)
|
||||
return (size_t) (_binary_stagenet_blocks_end - _binary_stagenet_blocks_start);
|
||||
else
|
||||
return (size_t) (_binary_blocks_end - _binary_blocks_start);
|
||||
}
|
||||
|
||||
#endif
|
31
src/blocks/blocks.cpp
Normal file
31
src/blocks/blocks.cpp
Normal file
|
@ -0,0 +1,31 @@
|
|||
#include "blocks.h"
|
||||
|
||||
#include <unordered_map>
|
||||
|
||||
extern const unsigned char checkpoints[];
|
||||
extern const size_t checkpoints_len;
|
||||
extern const unsigned char stagenet_blocks[];
|
||||
extern const size_t stagenet_blocks_len;
|
||||
extern const unsigned char testnet_blocks[];
|
||||
extern const size_t testnet_blocks_len;
|
||||
|
||||
namespace blocks
|
||||
{
|
||||
|
||||
const std::unordered_map<cryptonote::network_type, const epee::span<const unsigned char>, std::hash<size_t>> CheckpointsByNetwork = {
|
||||
{cryptonote::network_type::MAINNET, {checkpoints, checkpoints_len}},
|
||||
{cryptonote::network_type::STAGENET, {stagenet_blocks, stagenet_blocks_len}},
|
||||
{cryptonote::network_type::TESTNET, {testnet_blocks, testnet_blocks_len}}
|
||||
};
|
||||
|
||||
const epee::span<const unsigned char> GetCheckpointsData(cryptonote::network_type network)
|
||||
{
|
||||
const auto it = CheckpointsByNetwork.find(network);
|
||||
if (it != CheckpointsByNetwork.end())
|
||||
{
|
||||
return it->second;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,16 +1,12 @@
|
|||
#ifndef SRC_BLOCKS_BLOCKS_H_
|
||||
#define SRC_BLOCKS_BLOCKS_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#include "cryptonote_config.h"
|
||||
#include "span.h"
|
||||
|
||||
const unsigned char *get_blocks_dat_start(int testnet, int stagenet);
|
||||
size_t get_blocks_dat_size(int testnet, int stagenet);
|
||||
|
||||
#ifdef __cplusplus
|
||||
namespace blocks
|
||||
{
|
||||
const epee::span<const unsigned char> GetCheckpointsData(cryptonote::network_type network);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* SRC_BLOCKS_BLOCKS_H_ */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue