1-
2- cmake_minimum_required (VERSION 3.10.0)
1+ cmake_minimum_required (VERSION 3.28.0)
32project (MachineLearningCompiler VERSION 0.1.0 LANGUAGES C CXX ASM)
43
4+ if (NOT (UNIX AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64|arm)" ))
5+ message (FATAL_ERROR "Only arm on Linux is supported." )
6+ endif ()
7+
8+
59# Set default build type to Release if not specified
610if (NOT CMAKE_BUILD_TYPE )
711 set (CMAKE_BUILD_TYPE "Release" )
@@ -31,17 +35,18 @@ if(SAVE_JITS_TO_FILE)
3135 # set per target
3236endif ()
3337
34- option (USE_OPENMP "Use OpenMP for parallelization of the TensorOperation " ON )
38+ option (MLC_USE_OPENMP "Use OpenMP for parallelization of the Tensor Operation " ON )
3539
36- if (USE_OPENMP )
40+ if (MLC_USE_OPENMP )
3741 find_package (OpenMP REQUIRED)
3842
3943 if (OpenMP_CXX_FOUND)
4044 add_compile_options (-fopenmp)
41- add_compile_definitions (USE_OPENMP )
45+ add_compile_definitions (MLC_USE_OPENMP )
4246 endif ()
4347endif ()
4448
49+ option (BUILD_SHARED_LIBS "Build using shared libraries" ON )
4550
4651# ==============================================================
4752# Setup compile Flags
@@ -57,25 +62,29 @@ set(CMAKE_VERBOSE_MAKEFILE off)
5762# ==============================================================
5863# Fetch external libs
5964# ==============================================================
60- Include (FetchContent)
61-
62- FetchContent_Declare(
63- Catch2
64- GIT_REPOSITORY https://github.com/catchorg/Catch2
65- GIT_TAG v3.8.1
66- )
67- FetchContent_MakeAvailable(Catch2)
68-
69- # set(BENCHMARK_DOWNLOAD_DEPENDENCIES on)
70- set (BENCHMARK_ENABLE_GTEST_TESTS off )
71- set (BENCHMARK_ENABLE_TESTING off )
72-
73- FetchContent_Declare(
74- google_benchmark
75- GIT_REPOSITORY https://github.com/google/benchmark
76- GIT_TAG v1.9.2
77- )
78- FetchContent_MakeAvailable(google_benchmark)
65+ if (PROJECT_IS_TOP_LEVEL)
66+ Include (FetchContent)
67+
68+ FetchContent_Declare(
69+ Catch2
70+ GIT_REPOSITORY https://github.com/catchorg/Catch2
71+ GIT_TAG v3.8.1
72+ EXCLUDE_FROM_ALL
73+ )
74+ FetchContent_MakeAvailable(Catch2)
75+
76+ # set(BENCHMARK_DOWNLOAD_DEPENDENCIES on)
77+ set (BENCHMARK_ENABLE_GTEST_TESTS off )
78+ set (BENCHMARK_ENABLE_TESTING off )
79+
80+ FetchContent_Declare(
81+ google_benchmark
82+ GIT_REPOSITORY https://github.com/google/benchmark
83+ GIT_TAG v1.9.2
84+ EXCLUDE_FROM_ALL
85+ )
86+ FetchContent_MakeAvailable(google_benchmark)
87+ endif ()
7988
8089# ==============================================================
8190# Source files
@@ -299,44 +308,161 @@ endforeach()
299308# =============================================================
300309# TARGETS
301310# =============================================================
302- # tests
303- add_executable (tests "${SOURCE_FILEPATHS} " "${TEST_FILEPATHS} " )
304- if (SAVE_JITS_TO_FILE)
305- target_compile_definitions (tests PUBLIC SAVE_JITS_TO_FILE)
306- endif (SAVE_JITS_TO_FILE)
311+ if (PROJECT_IS_TOP_LEVEL)
312+ # tests
313+ add_executable (tests "${SOURCE_FILEPATHS} " "${TEST_FILEPATHS} " )
314+ if (SAVE_JITS_TO_FILE)
315+ target_compile_definitions (tests PUBLIC SAVE_JITS_TO_FILE)
316+ endif (SAVE_JITS_TO_FILE)
307317
308- target_link_libraries (tests PRIVATE Catch2::Catch2WithMain)
318+ target_link_libraries (tests PRIVATE Catch2::Catch2WithMain)
309319
310- if (OpenMP_CXX_FOUND)
311- target_link_libraries (tests PRIVATE OpenMP::OpenMP_CXX)
312- endif ()
320+ if (OpenMP_CXX_FOUND)
321+ target_link_libraries (tests PRIVATE OpenMP::OpenMP_CXX)
322+ endif ()
313323
314- # tests sanitized
315- add_executable (tests_sanitized "${SOURCE_FILEPATHS} " "${TEST_FILEPATHS} " )
316- if (SAVE_JITS_TO_FILE)
317- target_compile_definitions (tests_sanitized PUBLIC SAVE_JITS_TO_FILE)
318- endif (SAVE_JITS_TO_FILE)
324+ # tests sanitized
325+ add_executable (tests_sanitized "${SOURCE_FILEPATHS} " "${TEST_FILEPATHS} " )
326+ if (SAVE_JITS_TO_FILE)
327+ target_compile_definitions (tests_sanitized PUBLIC SAVE_JITS_TO_FILE)
328+ endif (SAVE_JITS_TO_FILE)
319329
320- target_compile_options (tests_sanitized PRIVATE -g -fsanitize=float-divide-by-zero -fsanitize=bounds -fsanitize=address -fsanitize=undefined -fno-omit-frame-pointer)
321- target_link_options (tests_sanitized PRIVATE -g -fsanitize=address -fsanitize=undefined)
322- target_link_libraries (tests_sanitized PRIVATE Catch2::Catch2WithMain)
330+ target_compile_options (tests_sanitized PRIVATE -g -fsanitize=float-divide-by-zero -fsanitize=bounds -fsanitize=address -fsanitize=undefined -fno-omit-frame-pointer)
331+ target_link_options (tests_sanitized PRIVATE -g -fsanitize=address -fsanitize=undefined)
332+ target_link_libraries (tests_sanitized PRIVATE Catch2::Catch2WithMain)
323333
324- if (OpenMP_CXX_FOUND)
325- target_link_libraries (tests_sanitized PRIVATE OpenMP::OpenMP_CXX)
326- endif ()
334+ if (MLC_USE_OPENMP AND OpenMP_CXX_FOUND)
335+ target_link_libraries (tests_sanitized PRIVATE OpenMP::OpenMP_CXX)
336+ endif ()
327337
328- # benchmarks
329- add_executable (benchmarks "${SOURCE_FILEPATHS} " "${BENCH_FILEPATHS} " )
338+ # benchmarks
339+ add_executable (benchmarks "${SOURCE_FILEPATHS} " "${BENCH_FILEPATHS} " )
330340
331- target_link_libraries (benchmarks PRIVATE benchmark::benchmark_main)
332- if (OpenMP_CXX_FOUND)
333- target_link_libraries (benchmarks PRIVATE OpenMP::OpenMP_CXX)
341+ target_link_libraries (benchmarks PRIVATE benchmark::benchmark_main)
342+ if (MLC_USE_OPENMP AND OpenMP_CXX_FOUND)
343+ target_link_libraries (benchmarks PRIVATE OpenMP::OpenMP_CXX)
344+ endif ()
334345endif ()
335346
336347# ==============================================================
337348# Ctest setup
338349# ==============================================================
339- list (APPEND CMAKE_MODULE_PATH ${catch2_SOURCE_DIR} /extras)
340- include (CTest)
341- include (Catch)
342- catch_discover_tests(tests)
350+ if (PROJECT_IS_TOP_LEVEL)
351+ list (APPEND CMAKE_MODULE_PATH ${catch2_SOURCE_DIR} /extras)
352+ include (CTest)
353+ include (Catch)
354+ catch_discover_tests(tests)
355+ endif ()
356+
357+ # ==============================================================
358+ # Library Setup
359+ # ==============================================================
360+
361+ if (PROJECT_IS_TOP_LEVEL)
362+ if (DEFINED CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
363+ message (
364+ STATUS
365+ "CMAKE_INSTALL_PREFIX is not set\n "
366+ " ├ Default value: ${CMAKE_INSTALL_PREFIX} \n "
367+ " └ Will set it to ${CMAKE_SOURCE_DIR} /install"
368+ )
369+ set (CMAKE_INSTALL_PREFIX
370+ "${CMAKE_SOURCE_DIR} /install"
371+ CACHE PATH "Where the library will be installed to" FORCE
372+ )
373+ else ()
374+ message (
375+ STATUS
376+ "CMAKE_INSTALL_PREFIX was already set\n "
377+ " └ Current value: ${CMAKE_INSTALL_PREFIX} "
378+ )
379+ endif ()
380+ endif ()
381+
382+ add_library (${PROJECT_NAME} )
383+
384+ target_sources (${PROJECT_NAME}
385+ PRIVATE
386+ "${SOURCE_FILEPATHS} "
387+ )
388+
389+ target_include_directories (${PROJECT_NAME}
390+ PRIVATE
391+ # where the library itself will look for its internal headers
392+ ${CMAKE_CURRENT_SOURCE_DIR} /src/interface
393+ ${CMAKE_CURRENT_SOURCE_DIR} /src/main
394+ ${CMAKE_CURRENT_SOURCE_DIR} /src/main/kernels
395+ ${CMAKE_CURRENT_SOURCE_DIR} /src/main/kernels/unary
396+ ${CMAKE_CURRENT_SOURCE_DIR} /src/main/arm_instructions
397+ ${CMAKE_CURRENT_SOURCE_DIR} /src/main/arm_instructions/base
398+ ${CMAKE_CURRENT_SOURCE_DIR} /src/main/arm_instructions/register
399+ ${CMAKE_CURRENT_SOURCE_DIR} /src/main/arm_instructions/simd_fp
400+ ${CMAKE_CURRENT_SOURCE_DIR} /src/test
401+ ${CMAKE_CURRENT_SOURCE_DIR} /src/test /kernels
402+ ${CMAKE_CURRENT_SOURCE_DIR} /src/test /kernels/unary
403+ ${CMAKE_CURRENT_SOURCE_DIR} /src/test /arm_instructions
404+ ${CMAKE_CURRENT_SOURCE_DIR} /src/test /arm_instructions/base
405+ ${CMAKE_CURRENT_SOURCE_DIR} /src/test /arm_instructions/simd_fp
406+ PUBLIC
407+ # using the project name as additional directory to include <project_name>/header.h instead of header.h if it is included as internal library
408+ # where top-level project will look for the library's public headers
409+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR} /include /${PROJECT_NAME} >
410+ # where external projects will look for the library's public headers
411+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR} >
412+ )
413+
414+ if (MLC_USE_OPENMP AND OpenMP_CXX_FOUND)
415+ target_link_libraries (${PROJECT_NAME} PRIVATE OpenMP::OpenMP_CXX)
416+ endif ()
417+
418+ # without it public headers won't get installed
419+ set (public_headers
420+ include /${PROJECT_NAME} /tensor.h
421+ )
422+ set_target_properties (${PROJECT_NAME} PROPERTIES PUBLIC_HEADER ${public_headers} )
423+
424+ set_target_properties (${PROJECT_NAME} PROPERTIES DEBUG_POSTFIX "d" )
425+
426+ # definitions of CMAKE_INSTALL_LIBDIR, CMAKE_INSTALL_INCLUDEDIR and others
427+ include (GNUInstallDirs)
428+
429+ # install the target and create export-set
430+ install (TARGETS ${PROJECT_NAME}
431+ EXPORT "${PROJECT_NAME} Targets"
432+ # these get default values from GNUInstallDirs, no need to set them
433+ #RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} # bin
434+ #LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} # lib
435+ #ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} # lib
436+ # except for public headers, as we want them to be inside a library folder
437+ PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} /${PROJECT_NAME} # include/SomeLibrary
438+ INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} # include
439+ )
440+
441+ set (namespace mlc)
442+
443+ # generate and install export file
444+ install (EXPORT "${PROJECT_NAME} Targets"
445+ FILE "${PROJECT_NAME} Targets.cmake"
446+ NAMESPACE ${namespace} ::
447+ DESTINATION cmake
448+ )
449+
450+ include (CMakePackageConfigHelpers)
451+
452+ # generate the version file for the config file
453+ write_basic_package_version_file(
454+ "${CMAKE_CURRENT_BINARY_DIR} /${PROJECT_NAME} ConfigVersion.cmake"
455+ VERSION "${version} "
456+ COMPATIBILITY AnyNewerVersion
457+ )
458+ # create config file
459+ configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR} /Config.cmake.in
460+ "${CMAKE_CURRENT_BINARY_DIR} /${PROJECT_NAME} Config.cmake"
461+ INSTALL_DESTINATION cmake
462+ )
463+ # install config files
464+ install (FILES
465+ "${CMAKE_CURRENT_BINARY_DIR} /${PROJECT_NAME} Config.cmake"
466+ "${CMAKE_CURRENT_BINARY_DIR} /${PROJECT_NAME} ConfigVersion.cmake"
467+ DESTINATION cmake
468+ )
0 commit comments