From 646a851a1008aeec233194a634ca3fdadd33b34d Mon Sep 17 00:00:00 2001 From: Max Wash Date: Thu, 14 Nov 2024 19:30:36 +0000 Subject: [PATCH] meta: add msvc support since bluelib is already cross-platform, this is mostly just adding __declspec(dllexport) to the library functions. --- CMakeLists.txt | 3 +++ asm/CMakeLists.txt | 2 ++ asm/include/ivy/asm/lex.h | 8 ++++++++ asm/lex.c | 6 ++++++ asm/misc.c | 0 cmake/FindBluelib.cmake | 4 ++++ common/CMakeLists.txt | 1 + common/include/ivy/file.h | 5 +++-- common/include/ivy/line-source.h | 2 +- common/include/ivy/misc.h | 14 ++++++++++++++ common/include/ivy/status.h | 4 +++- lang/CMakeLists.txt | 1 + lang/include/ivy/lang/lex.h | 11 ++++++----- rt/CMakeLists.txt | 2 ++ rt/include/ivy/rt/runtime.h | 8 ++++++++ rt/misc.c | 0 rt/runtime.c | 6 ++++++ 17 files changed, 68 insertions(+), 9 deletions(-) create mode 100644 asm/include/ivy/asm/lex.h create mode 100644 asm/lex.c delete mode 100644 asm/misc.c create mode 100644 common/include/ivy/misc.h create mode 100644 rt/include/ivy/rt/runtime.h delete mode 100644 rt/misc.c create mode 100644 rt/runtime.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 9cbc986..aa1890e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,6 +2,9 @@ cmake_minimum_required(VERSION 3.5) project(ivy C) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib) +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib) set(Bluelib_STATIC TRUE) find_package(Bluelib REQUIRED) diff --git a/asm/CMakeLists.txt b/asm/CMakeLists.txt index a12758d..3e05032 100644 --- a/asm/CMakeLists.txt +++ b/asm/CMakeLists.txt @@ -2,3 +2,5 @@ file(GLOB_RECURSE asm_sources *.c *.h include/ivy/asm/*.h) add_library(ivy-asm SHARED ${asm_sources}) target_include_directories(ivy-asm PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include/) +target_link_libraries(ivy-asm ivy-common) +target_compile_definitions(ivy-asm PRIVATE IVY_EXPORT=1) \ No newline at end of file diff --git a/asm/include/ivy/asm/lex.h b/asm/include/ivy/asm/lex.h new file mode 100644 index 0000000..95e8954 --- /dev/null +++ b/asm/include/ivy/asm/lex.h @@ -0,0 +1,8 @@ +#ifndef IVY_ASM_LEX_H_ +#define IVY_ASM_LEX_H_ + +#include + +IVY_API void placeholder12(void); + +#endif \ No newline at end of file diff --git a/asm/lex.c b/asm/lex.c new file mode 100644 index 0000000..c00bdbb --- /dev/null +++ b/asm/lex.c @@ -0,0 +1,6 @@ +#include + +IVY_API void placeholder12(void) +{ + +} diff --git a/asm/misc.c b/asm/misc.c deleted file mode 100644 index e69de29..0000000 diff --git a/cmake/FindBluelib.cmake b/cmake/FindBluelib.cmake index 95fe532..cd33e0d 100644 --- a/cmake/FindBluelib.cmake +++ b/cmake/FindBluelib.cmake @@ -106,6 +106,10 @@ if (Bluelib_FOUND) INTERFACE_INCLUDE_DIRECTORIES "${Bluelib_${component}_INCLUDE_DIR}") target_compile_definitions(Bluelib::${component} INTERFACE _CRT_SECURE_NO_WARNINGS=1) + if (Bluelib_STATIC) + target_compile_definitions(Bluelib::${component} INTERFACE BLUELIB_STATIC=1) + endif () + set_target_properties(Bluelib::${component} PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C" IMPORTED_LOCATION "${Bluelib_${component}_LIBRARY}") diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index 7234996..0226beb 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -2,3 +2,4 @@ file(GLOB_RECURSE common_sources *.c *.h include/ivy/*.h) add_library(ivy-common SHARED ${common_sources}) target_include_directories(ivy-common PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include/) +target_compile_definitions(ivy-common PRIVATE IVY_EXPORT=1) \ No newline at end of file diff --git a/common/include/ivy/file.h b/common/include/ivy/file.h index 35b3260..f50ee1e 100644 --- a/common/include/ivy/file.h +++ b/common/include/ivy/file.h @@ -2,6 +2,7 @@ #define IVY_COMMON_FILE_H_ #include +#include #include struct ivy_file { @@ -9,7 +10,7 @@ struct ivy_file { FILE *f_fp; }; -extern struct ivy_file *ivy_file_from_fp(FILE *fp); -extern void ivy_file_close(struct ivy_file *file); +IVY_API struct ivy_file *ivy_file_from_fp(FILE *fp); +IVY_API void ivy_file_close(struct ivy_file *file); #endif diff --git a/common/include/ivy/line-source.h b/common/include/ivy/line-source.h index 656a50d..f98e27e 100644 --- a/common/include/ivy/line-source.h +++ b/common/include/ivy/line-source.h @@ -9,7 +9,7 @@ struct ivy_line_source { struct ivy_line_source *, char *, size_t, size_t *, const char *); }; -extern enum ivy_status ivy_line_source_readline( +IVY_API enum ivy_status ivy_line_source_readline( struct ivy_line_source *src, char *buf, size_t count, size_t *nr_read, const char *prompt); diff --git a/common/include/ivy/misc.h b/common/include/ivy/misc.h new file mode 100644 index 0000000..0339447 --- /dev/null +++ b/common/include/ivy/misc.h @@ -0,0 +1,14 @@ +#ifndef IVY_COMMON_MISC_H_ +#define IVY_COMMON_MISC_H_ + +#ifdef _MSC_VER +#ifdef IVY_EXPORT +#define IVY_API extern __declspec(dllexport) +#else +#define IVY_API extern __declspec(dllimport) +#endif +#else +#define IVY_API extern +#endif + +#endif diff --git a/common/include/ivy/status.h b/common/include/ivy/status.h index 02046c4..1d2055e 100644 --- a/common/include/ivy/status.h +++ b/common/include/ivy/status.h @@ -1,6 +1,8 @@ #ifndef IVY_COMMON_STATUS_H_ #define IVY_COMMON_STATUS_H_ +#include + enum ivy_status { IVY_OK = 0, IVY_ERR_EOF = -1, @@ -10,6 +12,6 @@ enum ivy_status { IVY_ERR_NOT_SUPPORTED = -5, }; -extern const char *ivy_status_to_string(enum ivy_status status); +IVY_API const char *ivy_status_to_string(enum ivy_status status); #endif diff --git a/lang/CMakeLists.txt b/lang/CMakeLists.txt index 10885e2..cea2e4e 100644 --- a/lang/CMakeLists.txt +++ b/lang/CMakeLists.txt @@ -3,3 +3,4 @@ file(GLOB_RECURSE lang_sources *.c *.h include/ivy/lang/*.h) add_library(ivy-lang SHARED ${lang_sources}) target_include_directories(ivy-lang PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include/) target_link_libraries(ivy-lang ivy-common Bluelib::Core Bluelib::Object) +target_compile_definitions(ivy-lang PRIVATE IVY_EXPORT=1) \ No newline at end of file diff --git a/lang/include/ivy/lang/lex.h b/lang/include/ivy/lang/lex.h index fa2e558..9066191 100644 --- a/lang/include/ivy/lang/lex.h +++ b/lang/include/ivy/lang/lex.h @@ -2,6 +2,7 @@ #define IVY_LANG_LEX_H_ #include +#include #include enum ivy_token_type { @@ -108,12 +109,12 @@ struct ivy_lexer { size_t lex_linebuf_ptr; }; -extern enum ivy_status ivy_lexer_init(struct ivy_lexer *lex); -extern void ivy_lexer_finish(struct ivy_lexer *lex); +IVY_API enum ivy_status ivy_lexer_init(struct ivy_lexer *lex); +IVY_API void ivy_lexer_finish(struct ivy_lexer *lex); -extern struct ivy_token *ivy_lexer_peek(struct ivy_lexer *lex); -extern struct ivy_token *ivy_lexer_read(struct ivy_lexer *lex); +IVY_API struct ivy_token *ivy_lexer_peek(struct ivy_lexer *lex); +IVY_API struct ivy_token *ivy_lexer_read(struct ivy_lexer *lex); -extern void ivy_token_destroy(struct ivy_token *tok); +IVY_API void ivy_token_destroy(struct ivy_token *tok); #endif diff --git a/rt/CMakeLists.txt b/rt/CMakeLists.txt index f665450..0869e36 100644 --- a/rt/CMakeLists.txt +++ b/rt/CMakeLists.txt @@ -2,3 +2,5 @@ file(GLOB_RECURSE rt_sources *.c *.h include/ivy/rt/*.h) add_library(ivy-rt SHARED ${rt_sources}) target_include_directories(ivy-rt PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include/) +target_link_libraries(ivy-rt ivy-common) +target_compile_definitions(ivy-rt PRIVATE IVY_EXPORT=1) \ No newline at end of file diff --git a/rt/include/ivy/rt/runtime.h b/rt/include/ivy/rt/runtime.h new file mode 100644 index 0000000..9038f3b --- /dev/null +++ b/rt/include/ivy/rt/runtime.h @@ -0,0 +1,8 @@ +#ifndef IVY_RT_RUNTIME_H_ +#define IVY_RT_RUNTIME_H_ + +#include + +IVY_API void placeholder(void); + +#endif \ No newline at end of file diff --git a/rt/misc.c b/rt/misc.c deleted file mode 100644 index e69de29..0000000 diff --git a/rt/runtime.c b/rt/runtime.c new file mode 100644 index 0000000..7e818a8 --- /dev/null +++ b/rt/runtime.c @@ -0,0 +1,6 @@ +#include + +void placeholder(void) +{ + +} \ No newline at end of file