From 2dd2d9c9957e3926b2a46329977e1996db3ef1b5 Mon Sep 17 00:00:00 2001 From: modeco80 Date: Sat, 14 Feb 2026 21:54:27 -0500 Subject: [PATCH] basic project --- .clang-format | 46 +++++++++++++++++++++++++++++++++ .editorconfig | 11 ++++++++ .gitignore | 2 ++ CMakeLists.txt | 26 +++++++++++++++++++ README.md | 3 +++ cmake/CompilerFlags.cmake | 52 ++++++++++++++++++++++++++++++++++++++ cmake/Options.cmake | 1 + cmake/Policies.cmake | 22 ++++++++++++++++ cmake/ProjectFuncs.cmake | 27 ++++++++++++++++++++ cmake/SanitizerSetup.cmake | 34 +++++++++++++++++++++++++ src/CMakeLists.txt | 6 +++++ src/main.cpp | 5 ++++ 12 files changed, 235 insertions(+) create mode 100755 .clang-format create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 README.md create mode 100644 cmake/CompilerFlags.cmake create mode 100644 cmake/Options.cmake create mode 100644 cmake/Policies.cmake create mode 100644 cmake/ProjectFuncs.cmake create mode 100644 cmake/SanitizerSetup.cmake create mode 100644 src/CMakeLists.txt create mode 100644 src/main.cpp diff --git a/.clang-format b/.clang-format new file mode 100755 index 0000000..8a3795a --- /dev/null +++ b/.clang-format @@ -0,0 +1,46 @@ +# .clang-format for native code portion + +BasedOnStyle: Google + +# force T* or T& +DerivePointerAlignment: false +PointerAlignment: Left + +TabWidth: 4 +IndentWidth: 4 +UseTab: Always +IndentPPDirectives: BeforeHash + +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortBlocksOnASingleLine: false +AllowShortFunctionsOnASingleLine: InlineOnly +AllowShortIfStatementsOnASingleLine: Never +AllowShortLoopsOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: true + +BinPackArguments: true +BinPackParameters: true +BreakConstructorInitializers: BeforeColon +BreakStringLiterals: false + +ColumnLimit: 150 +CompactNamespaces: false + +ConstructorInitializerAllOnOneLineOrOnePerLine: true +ContinuationIndentWidth: 0 + +# turning this on causes major issues with initializer lists +Cpp11BracedListStyle: false +SpaceBeforeCpp11BracedList: true + +FixNamespaceComments: true + +NamespaceIndentation: All +ReflowComments: true + +SortIncludes: CaseInsensitive +SortUsingDeclarations: true + +SpacesInSquareBrackets: false +SpaceBeforeParens: Never +SpacesBeforeTrailingComments: 1 diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..0b53eb8 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,11 @@ +root = true + +[*] +end_of_line = lf +insert_final_newline = true +indent_style = tab +indent_size = 4 + +# specifically for YAML +[{yml, yaml}] +indent_style = space diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e050ba0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/build +/.cache \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..a52d3dd --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,26 @@ +cmake_minimum_required(VERSION 3.15) + +# Block unsupported platforms immediately. +if(WIN32 OR APPLE OR BSD) + message(FATAL_ERROR "tv2hv doesn't configure or build on these platforms.") +endif() + + +project(tv2hv + LANGUAGES CXX +) + +list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") + +include(Policies) +include(Options) +include(ProjectFuncs) +include(CompilerFlags) + +# required system dependencies +find_package(PkgConfig REQUIRED) +find_package(Threads REQUIRED) + +# the source code +add_subdirectory(src) + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e4b44d1 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# tv2hv + +this is a very experimental project to emulate a MSN TV 2 (RCA RM4100) box. diff --git a/cmake/CompilerFlags.cmake b/cmake/CompilerFlags.cmake new file mode 100644 index 0000000..8a3e4d5 --- /dev/null +++ b/cmake/CompilerFlags.cmake @@ -0,0 +1,52 @@ + +# Core compile arguments used for the whole native project + +if(NOT TV2HV_LINKER) + message(FATAL_ERROR "Somehow we got here without a set TV2HV_LINKER, bailing.") +endif() + +# This isn't really the best place to put this, but it's probably the only one which makes sense. +set(CMAKE_POSITION_INDEPENDENT_CODE ON) + +# TODO: Use a list so that this isn't one giant line, and we can just append compile flags to it as needed +set(TV2HV_CORE_COMPILE_ARGS "-Wall -Wno-builtin-declaration-mismatch -Wformat=2 -fstrict-flex-arrays=3 -fstack-clash-protection -fstack-protector-strong") +set(TV2HV_CORE_LINKER_ARGS "-fuse-ld=${TV2HV_LINKER}") + +if("${CMAKE_BUILD_TYPE}" STREQUAL "Release" OR "${CMAKE_BUILD_TYPE}" STREQUAL "RelWithDebInfo") + # Disable C assert() in release builds (needed since we wipe cmake core args) and enable FORTIFY_SOURCE + set(TV2HV_CORE_COMPILE_ARGS "${TV2HV_CORE_COMPILE_ARGS} -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=3 -DNDEBUG") + + # If on Release and we are prompted to use link-time optimizations do so + if("lto" IN_LIST TV2HV_BUILD_FEATURES) + # On clang we use ThinLTO for even better build performance. + if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + message(STATUS "CompilerFlags: Using LLVM ThinLTO") + set(TV2HV_CORE_COMPILE_ARGS "${TV2HV_CORE_COMPILE_ARGS} -flto=thin") + set(TV2HV_CORE_LINKER_ARGS "${TV2HV_CORE_LINKER_ARGS} -flto=thin") + else() + message(STATUS "CompilerFlags: Using LTO") + set(TV2HV_CORE_COMPILE_ARGS "${TV2HV_CORE_COMPILE_ARGS} -flto") + set(TV2HV_CORE_LINKER_ARGS "${TV2HV_CORE_LINKER_ARGS} -flto") + endif() + endif() +endif() + +include(SanitizerSetup) + +# Set core CMake toolchain variables so that they get applied to all projects. +# A bit nasty, but /shrug, this way our third party libraries can be mostly sanitized/etc as well. +# +# Note that -g3 in release flags is temporary, and will be removed once we don't need it + +set(CMAKE_C_FLAGS "${TV2HV_CORE_COMPILE_ARGS}") +set(CMAKE_CXX_FLAGS "${TV2HV_CORE_COMPILE_ARGS}") + +set(CMAKE_C_FLAGS_DEBUG "-O0 -g3") +set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O3 -g3") +set(CMAKE_C_FLAGS_RELEASE "-O3 -g3") + +set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g3") +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 -g3") +set(CMAKE_CXX_FLAGS_RELEASE "-O3 -g3") + +set(CMAKE_EXE_LINKER_FLAGS "${TV2HV_CORE_LINKER_ARGS} -Wl,-z,noexecstack,-z,relro,-z,now") diff --git a/cmake/Options.cmake b/cmake/Options.cmake new file mode 100644 index 0000000..ac87a7d --- /dev/null +++ b/cmake/Options.cmake @@ -0,0 +1 @@ +# Common place for CMake options diff --git a/cmake/Policies.cmake b/cmake/Policies.cmake new file mode 100644 index 0000000..d7a084b --- /dev/null +++ b/cmake/Policies.cmake @@ -0,0 +1,22 @@ +# CMake policy configuration + +# Macro to enable new CMake policy. +# Makes this file a *LOT* shorter. +macro (_new_cmake_policy policy) + if(POLICY ${policy}) + #message(STATUS "Enabling new policy ${policy}") + cmake_policy(SET ${policy} NEW) + endif() +endmacro() + +_new_cmake_policy(CMP0026) # CMake 3.0: Disallow use of the LOCATION property for build targets. +_new_cmake_policy(CMP0042) # CMake 3.0+ (2.8.12): MacOS "@rpath" in target's install name +_new_cmake_policy(CMP0046) # warn about non-existent dependencies +_new_cmake_policy(CMP0048) # CMake 3.0+: project() command now maintains VERSION +_new_cmake_policy(CMP0054) # CMake 3.1: Only interpret if() arguments as variables or keywords when unquoted. +_new_cmake_policy(CMP0056) # try_compile() linker flags +_new_cmake_policy(CMP0066) # CMake 3.7: try_compile(): use per-config flags, like CMAKE_CXX_FLAGS_RELEASE +_new_cmake_policy(CMP0067) # CMake 3.8: try_compile(): honor language standard variables (like C++11) +_new_cmake_policy(CMP0068) # CMake 3.9+: `RPATH` settings on macOS do not affect `install_name`. +_new_cmake_policy(CMP0075) # CMake 3.12+: Include file check macros honor `CMAKE_REQUIRED_LIBRARIES` +_new_cmake_policy(CMP0077) # CMake 3.13+: option() honors normal variables. diff --git a/cmake/ProjectFuncs.cmake b/cmake/ProjectFuncs.cmake new file mode 100644 index 0000000..85092f5 --- /dev/null +++ b/cmake/ProjectFuncs.cmake @@ -0,0 +1,27 @@ +function(tv2hv_target target) + target_compile_definitions(${target} PRIVATE "$<$:TV2HV_DEBUG>") + #target_include_directories(${target} PRIVATE ${PROJECT_SOURCE_DIR}) + target_compile_features(${target} PRIVATE cxx_std_23) + target_include_directories(${target} PRIVATE ${PROJECT_SOURCE_DIR}/src/lib ${CMAKE_CURRENT_BINARY_DIR}) +endfunction() + +function(_tv2hv_set_alternate_linker) + find_program(LINKER_EXECUTABLE ld.${TV2HV_LINKER} ${TV2HV_LINKER}) + if(LINKER_EXECUTABLE) + message(STATUS "Using ${TV2HV_LINKER} as linker") + else() + message(FATAL_ERROR "Linker ${TV2HV_LINKER} does not exist on your system. Please specify one which does or omit this option from your configure command.") + endif() +endfunction() + + +# Set a default linker if the user never provided one. +# This defaults based on the detected compiler to the "best" linker possible +if(NOT TV2HV_LINKER AND "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + set(TV2HV_LINKER "lld") +elseif(NOT TV2HV_LINKER) + set(TV2HV_LINKER "bfd") +endif() + +# Do the magic +_tv2hv_set_alternate_linker() diff --git a/cmake/SanitizerSetup.cmake b/cmake/SanitizerSetup.cmake new file mode 100644 index 0000000..a9b7846 --- /dev/null +++ b/cmake/SanitizerSetup.cmake @@ -0,0 +1,34 @@ +set(_TV2HV_CORE_WANTED_SANITIZERS "") + +if("asan" IN_LIST TV2HV_BUILD_FEATURES) + # Error if someone's trying to mix asan and tsan together, + # they aren't compatible. + if("tsan" IN_LIST TV2HV_BUILD_FEATURES) + message(FATAL_ERROR "ASAN and TSAN cannot be used together.") + endif() + + message(STATUS "Enabling ASAN because it was in TV2HV_BUILD_FEATURES") + list(APPEND _TV2HV_CORE_WANTED_SANITIZERS "address") +endif() + +if("tsan" IN_LIST TV2HV_BUILD_FEATURES) + if("asan" IN_LIST TV2HV_BUILD_FEATURES) + message(FATAL_ERROR "ASAN and TSAN cannot be used together.") + endif() + + message(STATUS "Enabling TSAN because it was in TV2HV_BUILD_FEATURES") + list(APPEND _TV2HV_CORE_WANTED_SANITIZERS "thread") +endif() + +if("ubsan" IN_LIST TV2HV_BUILD_FEATURES) + message(STATUS "Enabling UBSAN because it was in TV2HV_BUILD_FEATURES") + list(APPEND _TV2HV_CORE_WANTED_SANITIZERS "undefined") +endif() + +list(LENGTH _TV2HV_CORE_WANTED_SANITIZERS _TV2HV_CORE_WANTED_SANITIZERS_LENGTH) +if(NOT _TV2HV_CORE_WANTED_SANITIZERS_LENGTH EQUAL 0) + list(JOIN _TV2HV_CORE_WANTED_SANITIZERS "," _TV2HV_CORE_WANTED_SANITIZERS_ARG) + message(STATUS "Enabled sanitizers: ${_TV2HV_CORE_WANTED_SANITIZERS_ARG}") + set(TV2HV_CORE_COMPILE_ARGS "${TV2HV_CORE_COMPILE_ARGS} -fsanitize=${_TV2HV_CORE_WANTED_SANITIZERS_ARG}") + set(TV2HV_CORE_LINKER_ARGS "${TV2HV_CORE_LINKER_ARGS} -fsanitize=${_TV2HV_CORE_WANTED_SANITIZERS_ARG}") +endif() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..5f2aef0 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,6 @@ +add_executable(tv2hv + + main.cpp +) + +tv2hv_target(tv2hv) diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..79f5231 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,5 @@ + + +int main(int argc, char** argv) { + +}