Zuletzt aktiv 1739616476

ics-pa-notes.md Orginalformat

+++ date = '2025-02-15T16:55:11+08:00' draft = true title = 'NJU ICS PA Notes'

+++

One may encounter some hurdles here and there when drilling through NJU ICS PA 2024, which is surely a very good educational project btw. So here's my two cents.

Makefiles Spaghetti

  • Q := @: The @ symbol in a Makefile is used to suppress the command echoing. When Q is used before a command, it prevents the command from being printed to the terminal before execution.
  • In a Makefile, := and = are used to define variables, but they behave differently:
    • = (Recursive or Lazy Assignment): The value is expanded when the variable is used, not when it is defined.
    • := (Simple or Immediate Assignment): The value is expanded immediately when the variable is defined.
  • :: is a double colon rule, which allows multiple rules for the same target. Each rule is treated independently.

Makefile for compile menuconfig is at nemu/scripts/config.mk.

All the source file names are gathered from filelist.mk under nemu/src.

# Include all filelist.mk to merge file lists
FILELIST_MK = $(shell find -L ./src -name "filelist.mk")
include $(FILELIST_MK)

And all .c files under DIRS-y will be added to SRCS-y.

SRCS-y += $(shell find -L $(DIRS-y) -name "*.c")

NEMU Compilation happens at nemu/scripts/build.mk.

OBJS = $(SRCS:%.c=$(OBJ_DIR)/%.o) $(CXXSRC:%.cc=$(OBJ_DIR)/%.o)

# Compilation patterns
$(OBJ_DIR)/%.o: %.c
	@echo + CC $<
	@mkdir -p $(dir $@)
	@$(CC) $(CFLAGS) -c -o $@ $<
	$(call call_fixdep, $(@:.o=.d), $@)

$(OBJ_DIR)/%.o: %.cc
	@echo + CXX $<
	@mkdir -p $(dir $@)
	@$(CXX) $(CFLAGS) $(CXXFLAGS) -c -o $@ $<
	$(call call_fixdep, $(@:.o=.d), $@)

Which is included by nemu/scripts/native.mk along with target run and gdb etc.