support emscripten compile

This commit is contained in:
DaniTheSkunk 2022-12-21 14:01:04 +00:00
parent a4ce5bb09e
commit 1fa6361401
7 changed files with 65 additions and 14 deletions

9
em.ini Normal file
View File

@ -0,0 +1,9 @@
[binaries]
c = ['c:/dev/_tools/emsdk/upstream/emscripten/emcc.bat']
ar =['c:/dev/_tools/emsdk/upstream/emscripten/emar.bat']
[host_machine]
system = 'emscripten'
cpu_family = 'wasm'
cpu = 'wasm'
endian = 'little'

View File

@ -1,4 +1,10 @@
project('skunkworks', 'c', default_options: ['buildtype=release']) project('skunkworks', 'c',
default_options: [
'buildtype=release',
'strip=true',
'debug=false'
]
)
cmake = import('cmake') cmake = import('cmake')
@ -20,9 +26,18 @@ opt.add_cmake_defines({
opt.append_compile_args('c', '-I../subprojects/zlib-1.2.13', '-Isubprojects/zlib-1.2.13/__CMake_build') opt.append_compile_args('c', '-I../subprojects/zlib-1.2.13', '-Isubprojects/zlib-1.2.13/__CMake_build')
libpng = cmake.subproject('lpng1639', options: opt).dependency('png_static') libpng = cmake.subproject('lpng1639', options: opt).dependency('png_static')
libglfw = cmake.subproject('glfw-3.3.8').dependency('glfw') opt = cmake.subproject_options()
opt.add_cmake_defines({'GLFW_BUILD_DOCS': false})
if host_machine.system() == 'emscripten'
#libglfw = meson.get_compiler('c').find_library('glfw')
deps = [libz, libpng]
else
libglfw = cmake.subproject('glfw-3.3.8', options: opt).dependency('glfw')
libglew = subproject('glew-2.1.0').get_variable('libglew_dep') libglew = subproject('glew-2.1.0').get_variable('libglew_dep')
deps = [libz, libpng, libglew, libglfw]
endif
skunk_sources = [ skunk_sources = [
'src/skunkworks.c', 'src/skunkworks.c',
@ -31,4 +46,8 @@ skunk_sources = [
'src/window.c' 'src/window.c'
] ]
executable('skunktest', skunk_sources, include_directories: 'include', dependencies: [libz, libpng, libglew, libglfw]) if host_machine.system() == 'emscripten'
executable('skunktest', skunk_sources, include_directories: 'include', dependencies: deps, link_args: ['-lglfw', '-lGL', '-s', 'USE_GLFW=3'], name_suffix: 'html')
else
executable('skunktest', skunk_sources, include_directories: 'include', dependencies: deps)
endif

2
prebuildem.bat Normal file
View File

@ -0,0 +1,2 @@
@echo off
meson setup --cross-file=em.ini --prefer-static buildem

View File

@ -3,3 +3,9 @@
#include <GL/glew.h> #include <GL/glew.h>
#pragma clang diagnostic pop #pragma clang diagnostic pop
#include <GLFW/glfw3.h> #include <GLFW/glfw3.h>
#ifdef __EMSCRIPTEN__
#include <emscripten.h>
#define GL_GLEXT_PROTOTYPES
#define EGL_EGLEXT_PROTOTYPES
#endif

View File

@ -5,19 +5,30 @@
#include "gl.h" #include "gl.h"
int main(int argc, char *argv[]) {
struct window *win; struct window *win;
void tick();
int main(int argc, char *argv[]) {
printf("hello world\n"); printf("hello world\n");
win = sw_window_create(sw_vec2i(640, 480), "Skunkworks"); win = sw_window_create(sw_vec2i(640, 480), "Skunkworks");
png_sig_cmp(0, 0, 0); png_sig_cmp(0, 0, 0);
glClearColor(0.1f, 0.2f, 0.3f, 1.f); glClearColor(0.1f, 0.2f, 0.3f, 1.f);
#ifdef __EMSCRIPTEN__
emscripten_set_main_loop(tick, 0, 1);
#else
while (!glfwWindowShouldClose(win->_window)) { while (!glfwWindowShouldClose(win->_window)) {
tick();
}
#endif
return 0;
}
void tick() {
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
glfwSwapBuffers(win->_window); glfwSwapBuffers(win->_window);
glfwPollEvents(); glfwPollEvents();
} }
return 0;
}

View File

@ -3,6 +3,10 @@ project('glew', 'c')
gl = dependency('gl') gl = dependency('gl')
inc = include_directories('include') inc = include_directories('include')
c_args = ['-DGLEW_STATIC'] c_args = ['-DGLEW_STATIC']
if host_machine.system() == 'emscripten'
lib = static_library('glew', 'src/glew.c', include_directories: inc, c_args: c_args)
else
lib = static_library('glew', 'src/glew.c', include_directories: inc, c_args: c_args, dependencies: gl) lib = static_library('glew', 'src/glew.c', include_directories: inc, c_args: c_args, dependencies: gl)
endif
libglew_dep = declare_dependency(include_directories: inc, link_with: lib, compile_args: c_args) libglew_dep = declare_dependency(include_directories: inc, link_with: lib, compile_args: c_args)

View File

@ -147,10 +147,10 @@ if(MINGW)
set(ZLIB_DLL_SRCS ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj) set(ZLIB_DLL_SRCS ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj)
endif(MINGW) endif(MINGW)
add_library(zlib SHARED ${ZLIB_SRCS} ${ZLIB_DLL_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS}) #add_library(zlib SHARED ${ZLIB_SRCS} ${ZLIB_DLL_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS})
add_library(zlibstatic STATIC ${ZLIB_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS}) add_library(zlibstatic STATIC ${ZLIB_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS})
set_target_properties(zlib PROPERTIES DEFINE_SYMBOL ZLIB_DLL) #set_target_properties(zlib PROPERTIES DEFINE_SYMBOL ZLIB_DLL)
set_target_properties(zlib PROPERTIES SOVERSION 1) #set_target_properties(zlib PROPERTIES SOVERSION 1)
if(NOT CYGWIN) if(NOT CYGWIN)
# This property causes shared libraries on Linux to have the full version # This property causes shared libraries on Linux to have the full version
@ -160,7 +160,7 @@ if(NOT CYGWIN)
# #
# This has no effect with MSVC, on that platform the version info for # This has no effect with MSVC, on that platform the version info for
# the DLL comes from the resource file win32/zlib1.rc # the DLL comes from the resource file win32/zlib1.rc
set_target_properties(zlib PROPERTIES VERSION ${ZLIB_FULL_VERSION}) #set_target_properties(zlib PROPERTIES VERSION ${ZLIB_FULL_VERSION})
endif() endif()
if(UNIX) if(UNIX)
@ -175,7 +175,7 @@ elseif(BUILD_SHARED_LIBS AND WIN32)
endif() endif()
if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL ) if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL )
install(TARGETS zlib zlibstatic install(TARGETS zlibstatic
RUNTIME DESTINATION "${INSTALL_BIN_DIR}" RUNTIME DESTINATION "${INSTALL_BIN_DIR}"
ARCHIVE DESTINATION "${INSTALL_LIB_DIR}" ARCHIVE DESTINATION "${INSTALL_LIB_DIR}"
LIBRARY DESTINATION "${INSTALL_LIB_DIR}" ) LIBRARY DESTINATION "${INSTALL_LIB_DIR}" )