diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..177a085 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,81 @@ +cmake_minimum_required(VERSION 3.27) + +if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) + message(FATAL_ERROR "Do not build in-source. Please remove CMakeCache.txt and the CMakeFiles/ directory. Then build out-of-source.") +endif() + +project(sparsemap LANGUAGES C) + +set(CMAKE_C_STANDARD 11) +set(CMAKE_C_STANDARD_REQUIRED ON) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) +set(CMAKE_C_OUTPUT_EXTENSION .o) + +# Set source and header file locations +set(SOURCE_DIR src) +set(HEADER_DIR include) + +set(COMMON_CMAKE_C_FLAGS "-Wall -Wextra -Wpedantic") +set(CMAKE_C_FLAGS_DEBUG "-DSPARSEMAP_DIAGNOSTIC -DDEBUG -g -O0") +set(CMAKE_C_FLAGS_PROFILE "-DSPARSEMAP_DIAGNOSTIC -DDEBUG -g -Og -fsanitize=address,leak,object-size,pointer-compare,pointer-subtract,null,return,bounds,pointer-overflow,undefined -fsanitize-address-use-after-scope") +set(CMAKE_C_FLAGS_RELEASE "-Ofast") + +# Include all header files from the header directory +file(GLOB_RECURSE HEADERS CONFIGURE_FILES ${HEADER_DIR}/*.h) + +# Configure library sources +set(LIB_SRC + ${SOURCE_DIR}/sparsemap.c +) + +# Option to control building shared/static libraries +option(BUILD_SHARED_LIBS "Build shared libraries" ON) + +# Add shared library +add_library(sparsemap_SHARED SHARED ${LIB_SRC} ${HEADERS}) +# Set target properties for shared library (adjust if needed) +set_target_properties(sparsemap_SHARED PROPERTIES + VERSION 1.0.0 # Set library version + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" # Set output directory + COMPILE_FLAGS "${CMAKE_C_FLAGS_${CMAKE_CURRENT_LIST_MODE}}" +) +target_include_directories(sparsemap_SHARED PRIVATE ${HEADER_DIR}) + +# Add static library +add_library(sparsemap STATIC ${LIB_SRC} ${HEADERS}) +# Set target properties for static library (adjust if needed) +set_target_properties(sparsemap PROPERTIES + OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" # Set output directory +) +target_include_directories(sparsemap PRIVATE ${HEADER_DIR}) + +# Add ex_1 program +add_executable(ex_1 examples/ex_1.c tests/munit.c lib/common.c) +target_link_libraries(ex_1 PRIVATE sparsemap) +target_include_directories(ex_1 PRIVATE ${HEADER_DIR}) +add_custom_target(run_ex_1 COMMAND ex_1 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) + +# Add ex_2 program +add_executable(ex_2 examples/ex_2.c tests/munit.c lib/common.c) +target_link_libraries(ex_2 PRIVATE sparsemap) +target_include_directories(ex_2 PRIVATE ${HEADER_DIR}) +add_custom_target(run_ex_2 COMMAND ex_2 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) + +# Add ex_3 program +add_executable(ex_3 examples/ex_3.c tests/munit.c lib/common.c) +target_link_libraries(ex_3 PRIVATE sparsemap) +target_include_directories(ex_3 PRIVATE ${HEADER_DIR}) +add_custom_target(run_ex_3 COMMAND ex_3 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) + +# Add ex_4 program +add_executable(ex_4 examples/ex_4.c tests/munit.c lib/common.c) +target_link_libraries(ex_4 PRIVATE sparsemap) +target_include_directories(ex_4 PRIVATE ${HEADER_DIR}) +add_custom_target(run_ex_4 COMMAND ex_4 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) + +# Add test program +add_executable(test tests/test.c tests/munit.c lib/common.c) +target_link_libraries(test PRIVATE sparsemap) +target_include_directories(test PRIVATE ${HEADER_DIR}) +add_custom_target(run_test COMMAND test WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) + diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..741f1b2 --- /dev/null +++ b/build.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +target=${1:-Debug} +set targets="Debug Profile Release" +case "$target" in + $targets*) echo "Building ${target}..." ;; + *) echo "Unknown target ${target}, exiting." ;; +esac +name=${target,,} +echo $name +rm -rf "./cmake-build-${name}-system" && \ + cmake -DCMAKE_BUILD_TYPE=${target} -DCMAKE_MAKE_PROGRAM=ninja -DCMAKE_C_COMPILER=clang -G Ninja -S "${PWD}" -B "${PWD}/cmake-build-${name}-system" && \ + (cd "${PWD}/cmake-build-${name}-system" && ninja) + diff --git a/flake.nix b/flake.nix index b352bf8..fb15718 100644 --- a/flake.nix +++ b/flake.nix @@ -24,6 +24,7 @@ act autoconf clang + cmake ed gcc gdb @@ -31,6 +32,7 @@ graphviz-nox libtool m4 + ninja perl pkg-config python3