# CMakeLists.txt — Build configuration for the LIN Simulator (C++) # # CMAKE BASICS: # ============= # CMake is a build system generator. It doesn't compile code directly. # Instead, it generates platform-specific build files: # - macOS/Linux: Makefiles (then you run `make`) # - Windows: Visual Studio project files # - Any platform: Ninja build files (faster than Make) # # The workflow is: # 1. mkdir build && cd build # 2. cmake .. ← generates build files from this CMakeLists.txt # 3. cmake --build . ← compiles and links the project # 4. ./lin_simulator ← run the application # # Qt6 integration: # CMake has built-in support for Qt via find_package(Qt6). # Qt needs special preprocessing for its features: # - MOC (Meta-Object Compiler): processes Q_OBJECT macros for signals/slots # - UIC: compiles .ui designer files to C++ headers (we don't use these) # - RCC: compiles resource files (icons, etc.) into the binary cmake_minimum_required(VERSION 3.16) project(LINSimulator VERSION 0.1.0 LANGUAGES CXX DESCRIPTION "LIN Simulator using BabyLIN devices" ) # C++17 standard — required for structured bindings, std::optional, etc. set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # ── Qt6 auto-processing ── # These three lines enable Qt's special preprocessors: # AUTOMOC: automatically runs MOC on headers containing Q_OBJECT # AUTOUIC: automatically compiles .ui files (if we had any) # AUTORCC: automatically compiles .qrc resource files set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) # ── Find Qt6 ── # find_package searches for Qt6 on the system. # REQUIRED means CMake will error if Qt6 is not found. # COMPONENTS lists which Qt modules we need: # Widgets: GUI widgets (QMainWindow, QPushButton, etc.) # We'll add SerialPort in Step 5 when we need device communication. find_package(Qt6 REQUIRED COMPONENTS Widgets) # ── Main application target ── # qt_add_executable is Qt's wrapper around add_executable. # It handles platform-specific details (macOS app bundle, Windows subsystem, etc.) qt_add_executable(lin_simulator src/main.cpp src/main_window.cpp src/main_window.h ) # Link against Qt6 Widgets library # PRIVATE means this dependency is only for building this target, # not propagated to anything that depends on us. target_link_libraries(lin_simulator PRIVATE Qt6::Widgets) # ── Tests ── # We use Qt's built-in test framework (QTest) instead of GoogleTest # because it integrates naturally with Qt's event loop and widgets. # QTest provides: # - QVERIFY(condition): assert a condition is true # - QCOMPARE(actual, expected): assert two values are equal # - QTest::mouseClick(): simulate mouse events # - QTest::keyClick(): simulate keyboard events enable_testing() find_package(Qt6 REQUIRED COMPONENTS Test) qt_add_executable(test_main_window tests/test_main_window.cpp src/main_window.cpp src/main_window.h ) target_link_libraries(test_main_window PRIVATE Qt6::Widgets Qt6::Test) target_include_directories(test_main_window PRIVATE src) # Register the test with CTest so `ctest` can discover and run it add_test(NAME test_main_window COMMAND test_main_window)