| cmake_minimum_required(VERSION 3.10) |
| project(XbyakSamples) |
| |
| # Set C++ standard |
| set(CMAKE_CXX_STANDARD 11) |
| set(CMAKE_CXX_STANDARD_REQUIRED ON) |
| |
| # Include directories |
| include_directories(${CMAKE_CURRENT_SOURCE_DIR}/..) |
| |
| # Read warning flags if available (only for GCC/Clang) |
| if(NOT MSVC AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../test/CFLAGS_WARN.cfg") |
| file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/../test/CFLAGS_WARN.cfg" CFLAGS_WARN_STR) |
| separate_arguments(CFLAGS_WARN UNIX_COMMAND "${CFLAGS_WARN_STR}") |
| endif() |
| |
| # Platform-specific compiler flags |
| if(WIN32) |
| if(MSVC) |
| set(COMMON_COMPILE_FLAGS /W3) |
| else() |
| set(COMMON_COMPILE_FLAGS -Wall -fomit-frame-pointer ${CFLAGS_WARN}) |
| endif() |
| else() |
| set(COMMON_COMPILE_FLAGS -Wall -fomit-frame-pointer ${CFLAGS_WARN}) |
| endif() |
| |
| # Check for Boost (optional for calc samples) |
| find_package(Boost QUIET COMPONENTS system) |
| |
| # Helper function to add sample executable |
| function(add_sample_target target_name source_file) |
| add_executable(${target_name} ${source_file}) |
| target_compile_options(${target_name} PRIVATE ${COMMON_COMPILE_FLAGS}) |
| |
| # Set output directory |
| set_target_properties(${target_name} PROPERTIES |
| RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin |
| ) |
| |
| # Platform-specific settings |
| if(NOT WIN32) |
| find_package(Threads) |
| if(Threads_FOUND) |
| target_link_libraries(${target_name} ${CMAKE_THREAD_LIBS_INIT}) |
| endif() |
| endif() |
| endfunction() |
| |
| # 64-bit targets (always available on 64-bit platforms) |
| if(CMAKE_SIZEOF_VOID_P EQUAL 8) |
| add_sample_target(test64 test0.cpp) |
| add_sample_target(bf64 bf.cpp) |
| add_sample_target(memfunc64 memfunc.cpp) |
| add_sample_target(test_util64 test_util.cpp) |
| add_sample_target(cputopology cputopology.cpp) |
| add_sample_target(jmp_table64 jmp_table.cpp) |
| add_sample_target(zero_upper zero_upper.cpp) |
| add_sample_target(ccmp ccmp.cpp) |
| add_sample_target(no_flags no_flags.cpp) |
| |
| # Boost-dependent targets |
| if(Boost_FOUND) |
| add_sample_target(calc64 calc.cpp) |
| target_link_libraries(calc64 Boost::boost) |
| endif() |
| |
| # Non-macOS targets |
| if(NOT APPLE) |
| if(UNIX) |
| # static_buf uses Linux-specific mmap feature |
| add_sample_target(static_buf64 static_buf.cpp) |
| add_sample_target(memfd memfd.cpp) |
| endif() |
| endif() |
| |
| # Additional useful targets |
| add_sample_target(quantize quantize.cpp) |
| endif() |
| |
| # Optional 32-bit targets (skip on macOS which is 64-bit only) |
| # Note: Building 32-bit on 64-bit requires multilib on Linux (gcc-multilib g++-multilib) |
| # Enable with: cmake -DBUILD_32BIT_TARGETS=ON .. |
| option(BUILD_32BIT_TARGETS "Build 32-bit targets on 64-bit systems (requires multilib)" OFF) |
| |
| if(BUILD_32BIT_TARGETS AND NOT APPLE AND CMAKE_SIZEOF_VOID_P EQUAL 8 AND UNIX AND NOT WIN32) |
| message(STATUS "Building 32-bit targets (requires multilib)") |
| |
| add_sample_target(test test0.cpp) |
| target_compile_options(test PRIVATE -m32) |
| target_link_options(test PRIVATE -m32) |
| |
| add_sample_target(bf bf.cpp) |
| target_compile_options(bf PRIVATE -m32) |
| target_link_options(bf PRIVATE -m32) |
| |
| add_sample_target(toyvm toyvm.cpp) |
| target_compile_options(toyvm PRIVATE -m32) |
| target_link_options(toyvm PRIVATE -m32) |
| |
| add_sample_target(test_util test_util.cpp) |
| target_compile_options(test_util PRIVATE -m32) |
| target_link_options(test_util PRIVATE -m32) |
| |
| add_sample_target(memfunc memfunc.cpp) |
| target_compile_options(memfunc PRIVATE -m32) |
| target_link_options(memfunc PRIVATE -m32) |
| |
| add_sample_target(static_buf static_buf.cpp) |
| target_compile_options(static_buf PRIVATE -m32) |
| target_link_options(static_buf PRIVATE -m32) |
| |
| add_sample_target(jmp_table jmp_table.cpp) |
| target_compile_options(jmp_table PRIVATE -m32) |
| target_link_options(jmp_table PRIVATE -m32) |
| |
| if(Boost_FOUND) |
| add_sample_target(calc calc.cpp) |
| target_compile_options(calc PRIVATE -m32) |
| target_link_options(calc PRIVATE -m32) |
| target_link_libraries(calc Boost::boost) |
| endif() |
| endif() |
| |
| # Additional utilities |
| add_sample_target(profiler profiler.cpp) |
| |
| # Optional VTune profiler build |
| option(BUILD_PROFILER_VTUNE "Build profiler with VTune support" OFF) |
| if(BUILD_PROFILER_VTUNE AND UNIX) |
| add_sample_target(profiler-vtune profiler.cpp) |
| target_compile_definitions(profiler-vtune PRIVATE XBYAK_USE_VTUNE) |
| target_include_directories(profiler-vtune PRIVATE /opt/intel/vtune_amplifier/include/) |
| target_link_directories(profiler-vtune PRIVATE /opt/intel/vtune_amplifier/lib64) |
| target_link_libraries(profiler-vtune jitprofiling dl) |
| endif() |
| |
| # Print configuration summary |
| message(STATUS "Xbyak Samples Configuration:") |
| message(STATUS " Build type: ${CMAKE_BUILD_TYPE}") |
| message(STATUS " Architecture: ${CMAKE_SIZEOF_VOID_P} bytes (${CMAKE_SIZEOF_VOID_P} * 8 = ${CMAKE_SYSTEM_PROCESSOR})") |
| message(STATUS " Boost found: ${Boost_FOUND}") |
| message(STATUS " Output directory: ${CMAKE_BINARY_DIR}/bin") |