summaryrefslogtreecommitdiff
path: root/app/cmake/zmk_config.cmake
blob: c0993c730c225e2f9ba13cf10f6d4dda1cd8d6ce (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# TODO: Check for env or command line "ZMK_CONFIG" setting.
#  * That directory should load
#    * defconfigs,
#    * .conf file,
#    * single overlay,
#    * or per board/shield.

get_property(cached_user_config_value CACHE ZMK_CONFIG PROPERTY VALUE)

set(user_config_cli_argument ${cached_user_config_value}) # Either new or old
if(user_config_cli_argument STREQUAL CACHED_ZMK_CONFIG)
	# We already have a CACHED_ZMK_CONFIG so there is no new input on the CLI
  unset(user_config_cli_argument)
endif()

set(user_config_app_cmake_lists ${ZMK_CONFIG})
if(cached_user_config_value STREQUAL ZMK_CONFIG)
	# The app build scripts did not set a default, The ZMK_CONFIG we are
  # reading is the cached value from the CLI
  unset(user_config_app_cmake_lists)
endif()

if(CACHED_ZMK_CONFIG)
  # Warn the user if it looks like he is trying to change the user_config
  # without cleaning first
  if(user_config_cli_argument)
	  if(NOT (CACHED_ZMK_CONFIG STREQUAL user_config_cli_argument))
      message(WARNING "The build directory must be cleaned pristinely when changing user ZMK config")
    endif()
  endif()

  set(ZMK_CONFIG ${CACHED_ZMK_CONFIG})
elseif(user_config_cli_argument)
	set(ZMK_CONFIG ${user_config_cli_argument})

elseif(DEFINED ENV{ZMK_CONFIG})
	set(ZMK_CONFIG $ENV{ZMK_CONFIG})

elseif(user_config_app_cmake_lists)
	set(ZMK_CONFIG ${user_config_app_cmake_lists})
endif()

# Store the selected user_config in the cache
set(CACHED_ZMK_CONFIG ${ZMK_CONFIG} CACHE STRING "Selected user ZMK config")

foreach(root ${BOARD_ROOT})
	if (EXISTS "${root}/boards/${BOARD}.overlay")
		list(APPEND ZMK_DTC_FILES "${root}/boards/${BOARD}.overlay")
	endif()
	find_path(BOARD_DIR
	    NAMES ${BOARD}_defconfig
	    PATHS ${root}/boards/*/*
	    NO_DEFAULT_PATH
	    )
    	if(BOARD_DIR)
		if (EXISTS "${BOARD_DIR}/keymap")
			list(APPEND KEYMAP_DIRS ${BOARD_DIR}/keymap)
		endif()
	endif()

	if(DEFINED SHIELD)
		find_path(shields_refs_list
		    NAMES ${SHIELD}.overlay
		    PATHS ${root}/boards/shields/*
		    NO_DEFAULT_PATH
		    )
		foreach(shield_path ${shields_refs_list})
			if (EXISTS "${shield_path}/keymap")
				list(APPEND KEYMAP_DIRS ${shield_path}/keymap)
			endif()
		endforeach()
	endif()
endforeach()

find_path(BASE_KEYMAPS_DIR
	NAMES ${KEYMAP}/keymap.overlay
	PATHS ${KEYMAP_DIRS}
	NO_DEFAULT_PATH
)

if (BASE_KEYMAPS_DIR)
	set(KEYMAP_DIR "${BASE_KEYMAPS_DIR}/${KEYMAP}" CACHE STRING "Selected keymap directory")
	message(STATUS "Keyboard Base Keymap: ${KEYMAP_DIR}/")
	# Used to let local imports of custom keycodes work as expected
	list(APPEND DTS_ROOT ${KEYMAP_DIR})
	if (EXISTS "${KEYMAP_DIR}/include")
		include_directories("${KEYMAP_DIR}/include")
	endif()
	list(APPEND ZMK_DTC_FILES "${KEYMAP_DIR}/keymap.overlay")
endif()

if (ZMK_CONFIG)
	if (EXISTS "${ZMK_CONFIG}")
		message(STATUS "ZMK Config directory: ${ZMK_CONFIG}")
		list(APPEND DTS_ROOT ${ZMK_CONFIG})
		if (EXISTS "${ZMK_CONFIG}/include")
			include_directories("${ZMK_CONFIG}/include")
		endif()

		if (SHIELD)
			list(APPEND overlay_candidates "${ZMK_CONFIG}/${SHIELD}_${BOARD}.overlay")
			list(APPEND overlay_candidates "${ZMK_CONFIG}/${SHIELD}.overlay")
			list(APPEND config_candidates "${ZMK_CONFIG}/${SHIELD}_${BOARD}.conf")
			list(APPEND config_candidates "${ZMK_CONFIG}/${SHIELD}.conf")
		endif()

		# TODO: Board revisions?
		list(APPEND overlay_candidates "${ZMK_CONFIG}/${BOARD}.overlay")
		list(APPEND overlay_candidates "${ZMK_CONFIG}/default.overlay")
		list(APPEND config_candidates "${ZMK_CONFIG}/${BOARD}.conf")
		list(APPEND config_candidates "${ZMK_CONFIG}/default.conf")

		foreach(overlay ${overlay_candidates})
			if (EXISTS "${overlay}")
				message(STATUS "ZMK Config devicetree overlay: ${overlay}")
				list(APPEND ZMK_DTC_FILES "${overlay}")
				break()
			endif()
		endforeach()

		foreach(conf ${config_candidates})
			if (EXISTS "${conf}")
				message(STATUS "ZMK Config Kconfig: ${overlay}")
				set(CONF_FILE "${conf}")
				break()
			endif()
		endforeach()
	else()
		message(WARNING "Unable to locate ZMK config at: ${ZMK_CONFIG}")
	endif()
endif()

if (ZMK_DTC_FILES)
	string(REPLACE ";" " " DTC_OVERLAY_FILE "${ZMK_DTC_FILES}")
endif()