CMakeLists
CMakeLists
3)
set(VERSION_MAJOR 1)
set(VERSION_MINOR 1)
set(VERSION_REVISION 0)
set(VERSION_STATUS "-dev")
string(TIMESTAMP VERSION_YEAR "%Y")
if(CMAKE_BUILD_TYPE)
string(TOUPPER ${CMAKE_BUILD_TYPE} BUILD_TYPE_UC)
endif()
find_package(Git)
if(Git_FOUND)
execute_process(
COMMAND ${GIT_EXECUTABLE} status
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
ERROR_VARIABLE RESULT_STRING
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(${LENGTH_RESULT_STRING} EQUAL 0)
execute_process(
COMMAND ${GIT_EXECUTABLE} log -1 --format=%H
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE GIT_COMMIT_HASH
OUTPUT_STRIP_TRAILING_WHITESPACE
)
execute_process(
COMMAND ${GIT_EXECUTABLE} rev-list HEAD --count
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE VERSION_REVISION
OUTPUT_STRIP_TRAILING_WHITESPACE
)
endif()
endif()
if(APPLE)
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13" CACHE STRING "Minimum OS X deployment
version")
endif()
configure_file("${PROJECT_SOURCE_DIR}/version.h.in"
"${CMAKE_CURRENT_BINARY_DIR}/version.h")
set(BUILD_TOUCH_INPUT_DEFAULT ${ANDROID})
if(NOT BUILD_SDL)
set(BUILD_SDLGPU OFF)
endif()
message("BUILD_SDLGPU: ${BUILD_SDLGPU}")
message("BUILD_TOUCH_INPUT: ${BUILD_TOUCH_INPUT}")
message("BUILD_STUB: ${BUILD_STUB}")
if (N3DS)
set(BUILD_SDL off)
endif()
if (BAREMETALPI)
set(BUILD_SDL OFF)
set(BUILD_DEMO_CARTS OFF)
endif()
if(UNIX AND NOT APPLE AND NOT EMSCRIPTEN AND NOT ANDROID AND NOT N3DS)
set(LINUX TRUE)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
if (NOT DEFINED CMAKE_POSITION_INDEPENDENT_CODE)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
endif()
if(MSVC)
add_definitions("/D\"_CRT_SECURE_NO_WARNINGS\"")
add_definitions("/D\"_CRT_NONSTDC_NO_DEPRECATE\"")
else()
set(CMAKE_C_STANDARD 11)
endif()
if(RPI)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11")
endif()
if(ANDROID)
set(CMAKE_SYSTEM_VERSION 24)
endif()
set(THIRDPARTY_DIR ${CMAKE_SOURCE_DIR}/vendor)
include(ExternalProject)
################################
# LUA
################################
set(LUA_DIR ${THIRDPARTY_DIR}/lua)
set(LUA_SRC
${LUA_DIR}/lapi.c
${LUA_DIR}/lcode.c
${LUA_DIR}/lctype.c
${LUA_DIR}/ldebug.c
${LUA_DIR}/ldo.c
${LUA_DIR}/ldump.c
${LUA_DIR}/lfunc.c
${LUA_DIR}/lgc.c
${LUA_DIR}/llex.c
${LUA_DIR}/lmem.c
${LUA_DIR}/lobject.c
${LUA_DIR}/lopcodes.c
${LUA_DIR}/lparser.c
${LUA_DIR}/lstate.c
${LUA_DIR}/lstring.c
${LUA_DIR}/ltable.c
${LUA_DIR}/ltm.c
${LUA_DIR}/lundump.c
${LUA_DIR}/lvm.c
${LUA_DIR}/lzio.c
${LUA_DIR}/lauxlib.c
${LUA_DIR}/lbaselib.c
${LUA_DIR}/lcorolib.c
${LUA_DIR}/ldblib.c
${LUA_DIR}/liolib.c
${LUA_DIR}/lmathlib.c
${LUA_DIR}/loslib.c
${LUA_DIR}/lstrlib.c
${LUA_DIR}/ltablib.c
${LUA_DIR}/lutf8lib.c
${LUA_DIR}/loadlib.c
${LUA_DIR}/linit.c
)
if(N3DS)
target_compile_definitions(lua PUBLIC LUA_32BITS)
endif()
################################
# LPEG
################################
set(LPEG_DIR ${THIRDPARTY_DIR}/lpeg)
set(LPEG_SRC
${LPEG_DIR}/lpcap.c
${LPEG_DIR}/lpcode.c
${LPEG_DIR}/lpprint.c
${LPEG_DIR}/lptree.c
${LPEG_DIR}/lpvm.c
)
set(WREN_DIR ${THIRDPARTY_DIR}/wren/src)
set(WREN_SRC
${WREN_DIR}/optional/wren_opt_meta.c
${WREN_DIR}/optional/wren_opt_random.c
${WREN_DIR}/vm/wren_compiler.c
${WREN_DIR}/vm/wren_core.c
${WREN_DIR}/vm/wren_debug.c
${WREN_DIR}/vm/wren_primitive.c
${WREN_DIR}/vm/wren_utils.c
${WREN_DIR}/vm/wren_value.c
${WREN_DIR}/vm/wren_vm.c
)
################################
# MRUBY
################################
find_program(RUBY ruby)
find_program(RAKE rake)
if(NOT RAKE)
set(BUILD_WITH_MRUBY_DEFAULT FALSE)
else()
set(BUILD_WITH_MRUBY_DEFAULT TRUE)
endif()
option(BUILD_WITH_MRUBY "mruby Enabled" ${BUILD_WITH_MRUBY_DEFAULT})
message("BUILD_WITH_MRUBY: ${BUILD_WITH_MRUBY}")
if(BUILD_WITH_MRUBY)
set(MRUBY_BUILDDIR ${CMAKE_SOURCE_DIR}/build/mruby)
set(MRUBY_DIR ${THIRDPARTY_DIR}/mruby)
if(ANDROID)
set(MRUBY_CONFIG ${MRUBY_BUILDDIR}/tic_android.rb)
else()
set(MRUBY_CONFIG ${MRUBY_BUILDDIR}/tic_default.rb)
endif()
set(MRUBY_LIB ${MRUBY_DIR}/build/target/lib/libmruby.a)
if(MSVC)
set(MRUBY_TOOLCHAIN visualcpp)
elseif(APPLE OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
set(MRUBY_TOOLCHAIN clang)
else()
set(MRUBY_TOOLCHAIN gcc)
endif()
if(APPLE)
exec_program(xcrun ARGS --sdk macosx --show-sdk-path OUTPUT_VARIABLE
MRUBY_SYSROOT)
endif()
if(ANDROID_NDK_HOME)
set(MRUBY_RAKE_EXTRA_OPTS "${MRUBY_RAKE_EXTRA_OPTS} ANDROID_NDK_HOME=$
{ANDROID_NDK_HOME}")
endif()
ExternalProject_Add(mruby_vendor
SOURCE_DIR ${MRUBY_DIR}
CONFIGURE_COMMAND ""
BUILD_IN_SOURCE TRUE
BUILD_COMMAND
${RAKE} clean all "MRUBY_CONFIG=${MRUBY_CONFIG}"
"TARGET_CC=\"${CMAKE_C_COMPILER}\""
"TARGET_AR=\"${CMAKE_AR}\""
"TARGET_CFLAGS=${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${BUILD_TYPE_UC}}"
"TARGET_LDFLAGS=${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_LINKER_FLAGS_$
{BUILD_TYPE_UC}}"
"BUILD_TYPE=${BUILD_TYPE_UC}"
"MRUBY_SYSROOT=${MRUBY_SYSROOT}"
"MRUBY_TOOLCHAIN=${MRUBY_TOOLCHAIN}"
"ANDROID_ARCH=${CMAKE_ANDROID_ARCH_ABI}"
"ANDROID_PLATFORM=android-${CMAKE_SYSTEM_VERSION}"
${MRUBY_RAKE_EXTRA_OPTS}
INSTALL_COMMAND ""
BUILD_BYPRODUCTS ${MRUBY_LIB}
)
################################
# WASM
################################
set(WASM_DIR ${THIRDPARTY_DIR}/wasm3/source)
set(WASM_SRC
${WASM_DIR}/m3_bind.c
${WASM_DIR}/m3_code.c
${WASM_DIR}/m3_compile.c
${WASM_DIR}/m3_core.c
${WASM_DIR}/m3_parse.c
${WASM_DIR}/m3_env.c
${WASM_DIR}/m3_exec.c
${WASM_DIR}/m3_function.c
${WASM_DIR}/m3_info.c
${WASM_DIR}/m3_module.c
)
set(SCHEME_DIR ${THIRDPARTY_DIR}/s7)
set(SCHEME_SRC
${SCHEME_DIR}/s7.c
)
if (N3DS)
target_compile_definitions(scheme PRIVATE S7_N3DS)
endif()
if (BAREMETALPI)
target_compile_definitions(scheme PRIVATE S7_BAREMETALPI)
endif()
################################
# SQUIRREL
################################
set(SQUIRREL_DIR ${THIRDPARTY_DIR}/squirrel)
set(SQUIRREL_SRC
${SQUIRREL_DIR}/squirrel/sqapi.cpp
${SQUIRREL_DIR}/squirrel/sqbaselib.cpp
${SQUIRREL_DIR}/squirrel/sqclass.cpp
${SQUIRREL_DIR}/squirrel/sqcompiler.cpp
${SQUIRREL_DIR}/squirrel/sqdebug.cpp
${SQUIRREL_DIR}/squirrel/sqfuncstate.cpp
${SQUIRREL_DIR}/squirrel/sqlexer.cpp
${SQUIRREL_DIR}/squirrel/sqmem.cpp
${SQUIRREL_DIR}/squirrel/sqobject.cpp
${SQUIRREL_DIR}/squirrel/sqstate.cpp
${SQUIRREL_DIR}/squirrel/sqtable.cpp
${SQUIRREL_DIR}/squirrel/sqvm.cpp
${SQUIRREL_DIR}/sqstdlib/sqstdaux.cpp
${SQUIRREL_DIR}/sqstdlib/sqstdblob.cpp
${SQUIRREL_DIR}/sqstdlib/sqstdio.cpp
${SQUIRREL_DIR}/sqstdlib/sqstdmath.cpp
${SQUIRREL_DIR}/sqstdlib/sqstdrex.cpp
${SQUIRREL_DIR}/sqstdlib/sqstdstream.cpp
${SQUIRREL_DIR}/sqstdlib/sqstdstring.cpp
${SQUIRREL_DIR}/sqstdlib/sqstdsystem.cpp
)
################################
# GIFLIB
################################
set(GIFLIB_DIR ${THIRDPARTY_DIR}/giflib)
set(GIFLIB_SRC
${GIFLIB_DIR}/dgif_lib.c
${GIFLIB_DIR}/egif_lib.c
${GIFLIB_DIR}/gif_err.c
${GIFLIB_DIR}/gif_font.c
${GIFLIB_DIR}/gif_hash.c
${GIFLIB_DIR}/gifalloc.c
${GIFLIB_DIR}/openbsd-reallocarray.c
)
add_library(giflib STATIC ${GIFLIB_SRC})
target_include_directories(giflib
PRIVATE ${GIFLIB_DIR}
INTERFACE ${THIRDPARTY_DIR}/giflib)
################################
# Blipbuf
################################
################################
# Duktape
################################
################################
# Janet
################################
set(BUILD_WITH_JANET_DEFAULT TRUE)
if(BUILD_WITH_JANET)
if(MINGW)
add_custom_command(
OUTPUT ${THIRDPARTY_DIR}/janet/build/c/janet.c
COMMAND mingw32-make build/c/janet.c
WORKING_DIRECTORY ${THIRDPARTY_DIR}/janet/
)
elseif(WIN32)
add_custom_command(
OUTPUT ${THIRDPARTY_DIR}/janet/build/c/janet.c
COMMAND ./build_win.bat
WORKING_DIRECTORY ${THIRDPARTY_DIR}/janet/
)
else()
add_custom_command(
OUTPUT ${THIRDPARTY_DIR}/janet/build/c/janet.c
COMMAND make build/c/janet.c
WORKING_DIRECTORY ${THIRDPARTY_DIR}/janet/
)
endif()
add_library(janet ${THIRDPARTY_DIR}/janet/build/c/janet.c)
target_include_directories(janet PUBLIC ${THIRDPARTY_DIR}/janet/src/include)
target_include_directories(janet PUBLIC ${CMAKE_SOURCE_DIR}/build/janet/)
endif()
################################
# TIC-80 core
################################
set(TIC80CORE_DIR ${CMAKE_SOURCE_DIR}/src)
set(TIC80CORE_SRC
${TIC80CORE_DIR}/core/core.c
${TIC80CORE_DIR}/core/languages.c
${TIC80CORE_DIR}/core/draw.c
${TIC80CORE_DIR}/core/io.c
${TIC80CORE_DIR}/core/sound.c
${TIC80CORE_DIR}/api/js.c
${TIC80CORE_DIR}/api/lua.c
${TIC80CORE_DIR}/api/moonscript.c
${TIC80CORE_DIR}/api/fennel.c
${TIC80CORE_DIR}/api/wren.c
${TIC80CORE_DIR}/api/wasm.c
${TIC80CORE_DIR}/api/squirrel.c
${TIC80CORE_DIR}/api/scheme.c
${TIC80CORE_DIR}/api/mruby.c
${TIC80CORE_DIR}/api/janet.c
${TIC80CORE_DIR}/tic.c
${TIC80CORE_DIR}/cart.c
${TIC80CORE_DIR}/tools.c
${TIC80CORE_DIR}/tilesheet.c
)
if(${BUILD_DEPRECATED})
set(TIC80CORE_SRC ${TIC80CORE_SRC} ${TIC80CORE_DIR}/ext/gif.c)
endif()
if (FREEBSD)
target_include_directories(tic80core${SCRIPT} PRIVATE
${SYSROOT_PATH}/usr/local/include)
target_link_directories(tic80core${SCRIPT} PRIVATE
${SYSROOT_PATH}/usr/local/lib)
endif()
target_include_directories(tic80core${SCRIPT}
PRIVATE
${THIRDPARTY_DIR}/moonscript
${THIRDPARTY_DIR}/fennel
PUBLIC
${CMAKE_SOURCE_DIR}/include
${CMAKE_SOURCE_DIR}/src)
target_link_libraries(tic80core${SCRIPT}
lua
lpeg
wren
wasm
squirrel
scheme
duktape
blipbuf
zlib
)
if(BUILD_WITH_MRUBY)
target_link_libraries(tic80core${SCRIPT} mruby)
endif()
if(BUILD_WITH_JANET)
target_link_libraries(tic80core${SCRIPT} janet)
endif()
if(${BUILD_DEPRECATED})
target_compile_definitions(tic80core${SCRIPT} PRIVATE BUILD_DEPRECATED)
target_link_libraries(tic80core${SCRIPT} giflib)
endif()
if(LINUX)
target_link_libraries(tic80core${SCRIPT} m)
endif()
endmacro()
if(BUILD_STUB)
if(BUILD_WITH_MRUBY)
MACRO_CORE(ruby TIC_BUILD_WITH_MRUBY FALSE)
endif()
if(BUILD_WITH_JANET)
MACRO_CORE(janet TIC_BUILD_WITH_JANET FALSE)
endif()
endif()
if(BUILD_WITH_MRUBY)
target_compile_definitions(tic80core PUBLIC TIC_BUILD_WITH_MRUBY=1)
endif()
if(BUILD_WITH_JANET)
target_compile_definitions(tic80core PUBLIC TIC_BUILD_WITH_JANET=1)
endif()
################################
# SDL2
################################
if(BUILD_SDL AND NOT EMSCRIPTEN AND NOT RPI)
if(WIN32)
set(HAVE_LIBC TRUE)
endif()
if(ANDROID)
include_directories(${ANDROID_NDK}/sources/android/cpufeatures)
set(SDL_STATIC_PIC ON CACHE BOOL "" FORCE)
endif()
add_subdirectory(${THIRDPARTY_DIR}/sdl2)
endif()
################################
# SDL2 standalone cart player
################################
if (FREEBSD)
target_include_directories(player-sdl PRIVATE
${SYSROOT_PATH}/usr/local/include)
target_link_directories(player-sdl PRIVATE ${SYSROOT_PATH}/usr/local/lib)
endif()
target_include_directories(player-sdl PRIVATE
${THIRDPARTY_DIR}/sdl2/include
${CMAKE_SOURCE_DIR}/include
${CMAKE_SOURCE_DIR}/src)
if(MINGW)
target_link_libraries(player-sdl mingw32)
target_link_options(player-sdl PRIVATE -static)
endif()
################################
# Sokol
################################
if(BUILD_SOKOL)
set(SOKOL_LIB_SRC ${CMAKE_SOURCE_DIR}/src/system/sokol/sokol_gfx.c)
if(APPLE)
set(SOKOL_LIB_SRC ${SOKOL_LIB_SRC}
${CMAKE_SOURCE_DIR}/src/system/sokol/sokol_impl.m)
else()
set(SOKOL_LIB_SRC ${SOKOL_LIB_SRC}
${CMAKE_SOURCE_DIR}/src/system/sokol/sokol_impl.c)
endif()
if(APPLE)
target_compile_definitions(sokol PRIVATE SOKOL_METAL)
elseif(WIN32)
target_compile_definitions(sokol PRIVATE SOKOL_D3D11
SOKOL_D3D11_SHADER_COMPILER)
elseif(LINUX)
target_compile_definitions(sokol PRIVATE SOKOL_GLCORE33)
endif()
if(APPLE)
set_property (TARGET sokol APPEND_STRING PROPERTY
COMPILE_FLAGS "-fobjc-arc")
target_link_libraries(sokol
"-framework Cocoa"
"-framework QuartzCore"
"-framework Metal"
"-framework MetalKit"
"-framework AudioToolbox"
)
elseif(WIN32)
target_link_libraries(sokol D3D11)
if(MINGW)
target_link_libraries(sokol D3dcompiler_47)
endif()
elseif(LINUX)
find_package (Threads)
target_link_libraries(sokol X11 GL m dl asound ${CMAKE_THREAD_LIBS_INIT})
endif()
################################
# Sokol standalone cart player
################################
add_executable(player-sokol WIN32
${CMAKE_SOURCE_DIR}/src/system/sokol/player.c)
if(MINGW)
target_link_libraries(player-sokol mingw32)
target_link_options(player-sokol PRIVATE -static)
endif()
target_include_directories(player-sokol PRIVATE
${CMAKE_SOURCE_DIR}/include
${THIRDPARTY_DIR}/sokol
${CMAKE_SOURCE_DIR}/src)
################################
# libretro renderer example
################################
if(BUILD_LIBRETRO)
set(LIBRETRO_DIR ${TIC80CORE_DIR}/system/libretro)
set(LIBRETRO_SRC
${LIBRETRO_DIR}/tic80_libretro.c
)
if (LIBRETRO_STATIC)
add_library(tic80_libretro STATIC
${LIBRETRO_SRC}
)
if(EMSCRIPTEN)
set(LIBRETRO_EXTENSION "bc")
else()
set(LIBRETRO_EXTENSION "a")
endif()
set_target_properties(tic80_libretro PROPERTIES SUFFIX "_partial.a")
include(CheckCSourceCompiles)
check_c_source_compiles(
"#ifndef __MSDOS__
#error \"Not DOS\"
#endif"
IS_DOS
)
target_include_directories(tic80_libretro PRIVATE
${CMAKE_CURRENT_BINARY_DIR}
${TIC80CORE_DIR})
if(MINGW)
target_link_libraries(tic80_libretro mingw32)
endif()
if(ANDROID)
set_target_properties(tic80_libretro PROPERTIES SUFFIX "_android.so")
endif()
target_link_libraries(tic80_libretro tic80core)
set_target_properties(tic80_libretro PROPERTIES PREFIX "")
endif()
################################
# ZLIB
################################
if (NOT N3DS)
set(ZLIB_DIR ${THIRDPARTY_DIR}/zlib)
set(ZLIB_SRC
${ZLIB_DIR}/adler32.c
${ZLIB_DIR}/compress.c
${ZLIB_DIR}/crc32.c
${ZLIB_DIR}/deflate.c
${ZLIB_DIR}/inflate.c
${ZLIB_DIR}/infback.c
${ZLIB_DIR}/inftrees.c
${ZLIB_DIR}/inffast.c
${ZLIB_DIR}/trees.c
${ZLIB_DIR}/uncompr.c
${ZLIB_DIR}/zutil.c
)
else ()
################################
# ZIP
################################
################################
# bin2txt cart2prj prj2cart xplode wasmp2cart
################################
if(BUILD_DEMO_CARTS)
set(TOOLS_DIR ${CMAKE_SOURCE_DIR}/build/tools)
add_executable(cart2prj ${TOOLS_DIR}/cart2prj.c
${CMAKE_SOURCE_DIR}/src/studio/project.c)
target_include_directories(cart2prj PRIVATE ${CMAKE_SOURCE_DIR}/src $
{CMAKE_SOURCE_DIR}/include)
target_link_libraries(cart2prj tic80core)
add_executable(prj2cart ${TOOLS_DIR}/prj2cart.c
${CMAKE_SOURCE_DIR}/src/studio/project.c)
target_include_directories(prj2cart PRIVATE ${CMAKE_SOURCE_DIR}/src $
{CMAKE_SOURCE_DIR}/include)
target_link_libraries(prj2cart tic80core)
add_executable(wasmp2cart ${TOOLS_DIR}/wasmp2cart.c
${CMAKE_SOURCE_DIR}/src/studio/project.c)
target_include_directories(wasmp2cart PRIVATE ${CMAKE_SOURCE_DIR}/src $
{CMAKE_SOURCE_DIR}/include)
target_link_libraries(wasmp2cart tic80core)
add_executable(bin2txt ${TOOLS_DIR}/bin2txt.c)
target_link_libraries(bin2txt zlib)
add_executable(xplode
${TOOLS_DIR}/xplode.c
${CMAKE_SOURCE_DIR}/src/ext/gif.c
${CMAKE_SOURCE_DIR}/src/ext/png.c
${CMAKE_SOURCE_DIR}/src/studio/project.c)
if(LINUX)
target_link_libraries(xplode m)
endif()
set(DEMO_CARTS_IN ${CMAKE_SOURCE_DIR}/demos)
set(DEMO_CARTS_OUT)
file(GLOB DEMO_CARTS
${DEMO_CARTS_IN}/*.*
${DEMO_CARTS_IN}/bunny/*.*)
list(APPEND DEMO_CARTS
${CMAKE_SOURCE_DIR}/config.lua
)
if(NOT BUILD_WITH_MRUBY)
list(REMOVE_ITEM DEMO_CARTS ${DEMO_CARTS_IN}/rubydemo.rb)
list(REMOVE_ITEM DEMO_CARTS ${DEMO_CARTS_IN}/bunny/rubymark.rb)
endif()
if(NOT BUILD_WITH_JANET)
list(REMOVE_ITEM DEMO_CARTS ${DEMO_CARTS_IN}/janetdemo.janet)
list(REMOVE_ITEM DEMO_CARTS ${DEMO_CARTS_IN}/bunny/janetmark.janet)
endif()
foreach(CART_FILE ${DEMO_CARTS})
set(OUTNAME ${CMAKE_SOURCE_DIR}/build/assets/${CART_NAME}.tic.dat)
set(OUTPRJ ${CMAKE_SOURCE_DIR}/build/${CART_NAME}.tic)
add_custom_command(OUTPUT ${OUTNAME}
COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/prj2cart ${CART_FILE} $
{OUTPRJ} && ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/bin2txt ${OUTPRJ} ${OUTNAME} -z
DEPENDS bin2txt prj2cart ${CART_FILE}
)
endforeach(CART_FILE)
file(GLOB WASM_DEMOS
${DEMO_CARTS_IN}/wasm/*.wasmp
${DEMO_CARTS_IN}/bunny/wasmmark/*.wasmp
)
foreach(CART_FILE ${WASM_DEMOS})
set(OUTNAME ${CMAKE_SOURCE_DIR}/build/assets/${CART_NAME}.tic.dat)
set(WASM_BINARY ${DIR}/${CART_NAME}.wasm)
set(OUTPRJ ${CMAKE_SOURCE_DIR}/build/${CART_NAME}.tic)
list(APPEND DEMO_CARTS_OUT ${OUTNAME})
add_custom_command(OUTPUT ${OUTNAME}
COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/wasmp2cart ${CART_FILE} $
{OUTPRJ} --binary ${WASM_BINARY} && ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/bin2txt $
{OUTPRJ} ${OUTNAME} -z
DEPENDS bin2txt wasmp2cart ${CART_FILE} ${WASM_BINARY}
)
endforeach(CART_FILE)
add_custom_command(OUTPUT ${CMAKE_SOURCE_DIR}/build/assets/cart.png.dat
COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/bin2txt
${CMAKE_SOURCE_DIR}/build/cart.png ${CMAKE_SOURCE_DIR}/build/assets/cart.png.dat
DEPENDS bin2txt ${CMAKE_SOURCE_DIR}/build/cart.png)
endif()
################################
# Wave writer
################################
################################
# ArgParse lib
################################
################################
# libuv
################################
if(USE_LIBUV)
add_subdirectory(${THIRDPARTY_DIR}/libuv)
################################
# HTTP parser
################################
if(USE_LIBUV)
add_library(http_parser STATIC ${THIRDPARTY_DIR}/http-parser/http_parser.c)
target_include_directories(http_parser INTERFACE ${THIRDPARTY_DIR}/http-parser)
endif()
################################
# PNG
################################
set(LIBPNG_DIR ${THIRDPARTY_DIR}/libpng)
set(LIBPNG_SRC
${LIBPNG_DIR}/png.c
${LIBPNG_DIR}/pngerror.c
${LIBPNG_DIR}/pngget.c
${LIBPNG_DIR}/pngmem.c
${LIBPNG_DIR}/pngpread.c
${LIBPNG_DIR}/pngread.c
${LIBPNG_DIR}/pngrio.c
${LIBPNG_DIR}/pngrtran.c
${LIBPNG_DIR}/pngrutil.c
${LIBPNG_DIR}/pngset.c
${LIBPNG_DIR}/pngtrans.c
${LIBPNG_DIR}/pngwio.c
${LIBPNG_DIR}/pngwrite.c
${LIBPNG_DIR}/pngwtran.c
${LIBPNG_DIR}/pngwutil.c
)
configure_file(${LIBPNG_DIR}/scripts/pnglibconf.h.prebuilt $
{CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h)
target_include_directories(png
PUBLIC ${CMAKE_CURRENT_BINARY_DIR}
PRIVATE ${THIRDPARTY_DIR}/zlib
INTERFACE ${THIRDPARTY_DIR}/libpng)
################################
# TIC-80 studio
################################
set(TIC80LIB_DIR ${CMAKE_SOURCE_DIR}/src)
set(TIC80STUDIO_SRC
${TIC80LIB_DIR}/studio/screens/console.c
${TIC80LIB_DIR}/studio/screens/run.c
${TIC80LIB_DIR}/studio/screens/menu.c
${TIC80LIB_DIR}/studio/screens/mainmenu.c
${TIC80LIB_DIR}/studio/screens/surf.c
${TIC80LIB_DIR}/studio/screens/start.c
${TIC80LIB_DIR}/studio/editors/code.c
${TIC80LIB_DIR}/studio/editors/sprite.c
${TIC80LIB_DIR}/studio/editors/map.c
${TIC80LIB_DIR}/studio/editors/world.c
${TIC80LIB_DIR}/studio/editors/sfx.c
${TIC80LIB_DIR}/studio/editors/music.c
${TIC80LIB_DIR}/studio/studio.c
${TIC80LIB_DIR}/studio/config.c
${TIC80LIB_DIR}/studio/demos.c
${TIC80LIB_DIR}/studio/fs.c
${TIC80LIB_DIR}/studio/net.c
${TIC80LIB_DIR}/ext/md5.c
${TIC80LIB_DIR}/ext/history.c
${TIC80LIB_DIR}/ext/gif.c
${TIC80LIB_DIR}/ext/png.c
)
if(${BUILD_PRO})
set(TIC80STUDIO_SRC ${TIC80STUDIO_SRC} ${TIC80LIB_DIR}/studio/project.c)
endif()
set(TIC80_OUTPUT tic80)
add_library(tic80studio STATIC
${TIC80STUDIO_SRC}
${DEMO_CARTS_OUT}
${CMAKE_SOURCE_DIR}/build/assets/cart.png.dat)
if(WIN32)
target_include_directories(tic80studio PRIVATE
${THIRDPARTY_DIR}/dirent/include)
endif()
if(USE_LIBUV)
target_compile_definitions(tic80studio PRIVATE USE_LIBUV)
target_link_libraries(tic80studio uv_a http_parser)
endif()
if(BUILD_PRO)
target_compile_definitions(tic80studio PRIVATE TIC80_PRO)
endif()
if(BUILD_SDLGPU)
target_compile_definitions(tic80studio PUBLIC CRT_SHADER_SUPPORT)
endif()
################################
# SDL GPU
################################
if(BUILD_SDLGPU)
set(SDLGPU_DIR ${THIRDPARTY_DIR}/sdl-gpu/src)
set(SDLGPU_SRC
${SDLGPU_DIR}/renderer_GLES_2.c
${SDLGPU_DIR}/SDL_gpu.c
${SDLGPU_DIR}/SDL_gpu_matrix.c
${SDLGPU_DIR}/SDL_gpu_renderer.c
${SDLGPU_DIR}/externals/stb_image/stb_image.c
${SDLGPU_DIR}/externals/stb_image_write/stb_image_write.c
)
if(NOT ANDROID)
list(APPEND SDLGPU_SRC
${SDLGPU_DIR}/renderer_GLES_1.c
${SDLGPU_DIR}/renderer_GLES_3.c
${SDLGPU_DIR}/renderer_OpenGL_1.c
${SDLGPU_DIR}/renderer_OpenGL_1_BASE.c
${SDLGPU_DIR}/renderer_OpenGL_2.c
${SDLGPU_DIR}/renderer_OpenGL_3.c
${SDLGPU_DIR}/renderer_OpenGL_4.c
${SDLGPU_DIR}/SDL_gpu_shapes.c
${SDLGPU_DIR}/externals/glew/glew.c
)
endif()
if(EMSCRIPTEN OR ANDROID)
target_compile_definitions(sdlgpu PRIVATE GLEW_STATIC SDL_GPU_DISABLE_GLES_1
SDL_GPU_DISABLE_GLES_3 SDL_GPU_DISABLE_OPENGL)
else()
target_compile_definitions(sdlgpu PRIVATE GLEW_STATIC SDL_GPU_DISABLE_GLES
SDL_GPU_DISABLE_OPENGL_3 SDL_GPU_DISABLE_OPENGL_4)
endif()
if(WIN32)
target_link_libraries(sdlgpu opengl32)
endif()
if(LINUX)
target_link_libraries(sdlgpu GL)
endif()
if(APPLE)
find_library(OPENGL_LIBRARY OpenGL)
target_link_libraries(sdlgpu ${OPENGL_LIBRARY})
endif()
if(ANDROID)
find_library( ANDROID_LOG_LIBRARY log )
find_library( ANDROID_GLES2_LIBRARY GLESv2 )
find_library( ANDROID_GLES1_LIBRARY GLESv1_CM )
target_link_libraries(sdlgpu
${ANDROID_LOG_LIBRARY}
${ANDROID_GLES2_LIBRARY}
${ANDROID_GLES1_LIBRARY}
)
endif()
if(NOT EMSCRIPTEN)
target_link_libraries(sdlgpu SDL2-static)
endif()
endif()
################################
# TIC-80 app
################################
if(BUILD_SDL)
set(TIC80_SRC src/system/sdl/main.c)
if(WIN32)
configure_file("${PROJECT_SOURCE_DIR}/build/windows/tic80.rc.in" "$
{PROJECT_SOURCE_DIR}/build/windows/tic80.rc")
set(TIC80_SRC ${TIC80_SRC} "${PROJECT_SOURCE_DIR}/build/windows/tic80.rc")
add_executable(tic80 ${SYSTEM_TYPE} ${TIC80_SRC})
elseif(ANDROID)
target_link_libraries(tic80)
else()
add_executable(tic80 ${TIC80_SRC})
endif()
if(MINGW)
target_link_libraries(tic80 mingw32)
target_link_options(tic80 PRIVATE -static -mconsole)
endif()
if(EMSCRIPTEN)
set_target_properties(tic80 PROPERTIES LINK_FLAGS "-s WASM=1 -s USE_SDL=2 -
s ALLOW_MEMORY_GROWTH=1 -s FETCH=1 -s EXPORT_ES6=1 -s MODULARIZE=1 -s
ENVIRONMENT=web -s EXPORT_NAME=createModule -s EXPORTED_RUNTIME_METHODS=['ENV'] -
lidbfs.js")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -s USE_SDL=2")
elseif(NOT ANDROID)
target_link_libraries(tic80 SDL2main)
endif()
target_link_libraries(tic80 tic80studio)
if(BUILD_TOUCH_INPUT)
target_compile_definitions(tic80 PRIVATE TOUCH_INPUT_SUPPORT)
endif()
if (FREEBSD)
target_include_directories(tic80 PRIVATE ${SYSROOT_PATH}/usr/local/include)
target_link_directories(tic80 PRIVATE ${SYSROOT_PATH}/usr/local/lib)
endif()
if(RPI)
target_include_directories(tic80 PRIVATE
${SYSROOT_PATH}/usr/local/include/SDL2)
target_link_directories(tic80 PRIVATE ${SYSROOT_PATH}/usr/local/lib $
{SYSROOT_PATH}/opt/vc/lib)
target_compile_definitions(tic80 PRIVATE __RPI__)
endif()
if(BUILD_SDLGPU)
target_link_libraries(tic80 sdlgpu)
else()
if(EMSCRIPTEN)
elseif(RPI)
target_link_libraries(tic80 libSDL2.a bcm_host)
else()
target_link_libraries(tic80 SDL2-static)
endif()
endif()
if(LINUX)
configure_file("${PROJECT_SOURCE_DIR}/build/linux/tic80.desktop.in" "$
{PROJECT_SOURCE_DIR}/build/linux/tic80.desktop")
SET(TIC80_DESKTOP_DIR "share/applications/")
SET(TIC80_PIXMAPS_DIR "share/icons/")
endif()
endif()
################################
# TIC-80 app (Sokol)
################################
if(BUILD_SOKOL)
set(TIC80_SRC ${CMAKE_SOURCE_DIR}/src/system/sokol/sokol.c)
if(WIN32)
configure_file("${PROJECT_SOURCE_DIR}/build/windows/tic80.rc.in" "$
{PROJECT_SOURCE_DIR}/build/windows/tic80.rc")
set(TIC80_SRC ${TIC80_SRC} "${PROJECT_SOURCE_DIR}/build/windows/tic80.rc")
target_include_directories(tic80-sokol PRIVATE
${CMAKE_SOURCE_DIR}/include
${CMAKE_SOURCE_DIR}/src
${THIRDPARTY_DIR}/sokol)
if(MINGW)
target_link_libraries(tic80-sokol mingw32)
target_link_options(tic80-sokol PRIVATE -static -mconsole)
endif()
endif()
################################
# TIC-80 app (N3DS)
################################
if(N3DS)
set(TIC80_SRC ${TIC80_SRC}
${CMAKE_SOURCE_DIR}/src/system/n3ds/utils.c
${CMAKE_SOURCE_DIR}/src/system/n3ds/keyboard.c
${CMAKE_SOURCE_DIR}/src/system/n3ds/main.c
)
add_executable(tic80_n3ds ${TIC80_SRC})
target_include_directories(tic80_n3ds PRIVATE
${DEVKITPRO}/portlibs/3ds/include
${CMAKE_SOURCE_DIR}/include
${CMAKE_SOURCE_DIR}/src)
add_custom_command(TARGET tic80_n3ds
POST_BUILD
COMMAND ${CMAKE_SOURCE_DIR}/build/n3ds/elf_to_3dsx.sh
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/build
)
endif()
################################
# TIC-80 stub
################################
if(BUILD_STUB)
macro(MACRO_STUB SCRIPT)
set(TIC80_SRC
src/system/sdl/main.c
src/studio/screens/run.c
src/studio/screens/menu.c
src/studio/screens/mainmenu.c
src/studio/screens/start.c
src/studio/config.c
src/studio/studio.c
src/studio/fs.c
src/ext/md5.c)
if(WIN32)
configure_file("${PROJECT_SOURCE_DIR}/build/windows/tic80.rc.in" "$
{PROJECT_SOURCE_DIR}/build/windows/tic80.rc")
set(TIC80_SRC ${TIC80_SRC}
"${PROJECT_SOURCE_DIR}/build/windows/tic80.rc")
target_include_directories(tic80${SCRIPT} PRIVATE
${THIRDPARTY_DIR}/dirent/include)
else()
add_executable(tic80${SCRIPT} ${TIC80_SRC})
endif()
target_include_directories(tic80${SCRIPT} PRIVATE $
{CMAKE_CURRENT_BINARY_DIR})
if(BUILD_SDLGPU)
target_compile_definitions(tic80${SCRIPT} PRIVATE CRT_SHADER_SUPPORT)
endif()
if(MINGW)
target_link_libraries(tic80${SCRIPT} mingw32)
target_link_options(tic80${SCRIPT} PRIVATE -static -mconsole)
endif()
if(EMSCRIPTEN)
set_target_properties(tic80${SCRIPT} PROPERTIES LINK_FLAGS "-s WASM=1 -
s USE_SDL=2 -s ALLOW_MEMORY_GROWTH=1 -s FETCH=1 -s EXPORT_ES6=1 -s MODULARIZE=1 -s
ENVIRONMENT=web -s EXPORT_NAME=createModule -s EXPORTED_RUNTIME_METHODS=['ENV'] -
lidbfs.js")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -s USE_SDL=2")
else()
target_link_libraries(tic80${SCRIPT} SDL2main)
endif()
if(RPI)
target_include_directories(tic80${SCRIPT} PRIVATE
${SYSROOT_PATH}/usr/local/include/SDL2)
target_link_directories(tic80${SCRIPT} PRIVATE
${SYSROOT_PATH}/usr/local/lib ${SYSROOT_PATH}/opt/vc/lib)
target_compile_definitions(tic80${SCRIPT} PRIVATE __RPI__)
endif()
if(BUILD_SDLGPU)
target_link_libraries(tic80${SCRIPT} sdlgpu)
else()
if(EMSCRIPTEN)
elseif(RPI)
target_link_libraries(tic80${SCRIPT} libSDL2.a bcm_host pthread dl)
else()
target_link_libraries(tic80${SCRIPT} SDL2-static)
endif()
endif()
endmacro()
MACRO_STUB(lua)
MACRO_STUB(moon)
MACRO_STUB(fennel)
MACRO_STUB(js)
MACRO_STUB(wren)
MACRO_STUB(squirrel)
MACRO_STUB(scheme)
if(BUILD_WITH_JANET)
MACRO_STUB(janet)
endif()
if(BUILD_WITH_MRUBY)
MACRO_STUB(ruby)
endif()
MACRO_STUB(wasm)
endif()
################################
# Install
################################
set(CPACK_PACKAGE_NAME "TIC-80")
set(CPACK_PACKAGE_VENDOR "Nesbox")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Fantasy computer for making, playing and
sharing tiny games.")
set(CPACK_PACKAGE_VERSION_MAJOR "${VERSION_MAJOR}")
set(CPACK_PACKAGE_VERSION_MINOR "${VERSION_MINOR}")
set(CPACK_PACKAGE_VERSION_PATCH "${VERSION_REVISION}")
set(CPACK_PACKAGE_VERSION "${PROJECT_VERSION}")
set(CPACK_PACKAGE_INSTALL_DIRECTORY "TIC-80")
if (APPLE)
set(CPACK_GENERATOR "Bundle")
set(CPACK_BUNDLE_NAME "tic80")
configure_file(${CMAKE_SOURCE_DIR}/build/macosx/tic80.plist.in $
{CMAKE_SOURCE_DIR}/build/macosx/tic80.plist)
set(CPACK_BUNDLE_PLIST ${CMAKE_SOURCE_DIR}/build/macosx/tic80.plist)
set(CPACK_BUNDLE_ICON ${CMAKE_SOURCE_DIR}/build/macosx/tic80.icns)
set(CPACK_BUNDLE_STARTUP_COMMAND "${CMAKE_BINARY_DIR}/bin/tic80")
if(RPI)
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE armhf)
endif()