Skip to content

Commit 76c2c68

Browse files
committed
support value type
1 parent ec90eda commit 76c2c68

File tree

4 files changed

+65
-25
lines changed

4 files changed

+65
-25
lines changed

tools/cmake/common/__init__.py

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import subprocess
1010
import tempfile
1111
import unittest
12+
from dataclasses import dataclass
1213
from functools import cache
1314
from typing import Any, Dict, List, Optional
1415

@@ -66,18 +67,28 @@ def _create_file_tree(tree: Dict[Any, Any], cwd: str) -> None:
6667
raise AssertionError("invalid tree value", value)
6768

6869

70+
@dataclass
71+
class _CacheValue:
72+
value_type: str
73+
value: str
74+
75+
6976
# Get the key/value pair listed in a CMakeCache.txt file.
7077
@cache
71-
def _list_cmake_cache(cache_path: str) -> Dict[str, str]:
78+
def _list_cmake_cache(cache_path: str) -> Dict[str, _CacheValue]:
7279
result = {}
7380
with open(cache_path, "r") as cache_file:
7481
for line in cache_file:
7582
line = line.strip()
7683
if "=" in line:
7784
key, value = line.split("=", 1)
85+
value_type = ""
7886
if ":" in key:
79-
key, _ = key.split(":")
80-
result[key.strip()] = value.strip()
87+
key, value_type = key.split(":")
88+
result[key.strip()] = _CacheValue(
89+
value_type=value_type,
90+
value=value.strip(),
91+
)
8192
return result
8293

8394

@@ -132,13 +143,24 @@ def run_cmake(
132143

133144
if error_contains is not None:
134145
self.assertNotEqual(result.returncode, 0)
135-
self.assertTrue(error_contains in result.stderr.decode("utf-8"))
146+
actual_error = result.stderr.decode("utf-8")
147+
self.assertTrue(
148+
error_contains in actual_error, f"Actual error: {actual_error}"
149+
)
136150
else:
137151
self.assertEqual(result.returncode, 0)
138152
self.assertTrue(os.path.exists(os.path.join(self.workspace, "cmake-out")))
139153

140-
def assert_cmake_cache(self, key: str, expected: str):
154+
def assert_cmake_cache(
155+
self,
156+
key: str,
157+
expected: str,
158+
expected_type: str,
159+
):
141160
cache = _list_cmake_cache(
142161
os.path.join(self.workspace, "cmake-out", "CMakeCache.txt")
143162
)
144-
self.assertEqual(cache[key], expected, f"invalid value for {key}")
163+
self.assertEqual(cache[key].value, expected, f"unexpected value for {key}")
164+
self.assertEqual(
165+
cache[key].value_type, expected_type, f"unexpected value type for {key}"
166+
)

tools/cmake/common/preset.cmake

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,16 @@ endfunction()
1414
# Define an overridable config.
1515
# 1) If the config is already defined in the process, then store that in cache
1616
# 2) If the config is NOT set, then store the default value in cache
17-
macro(define_overridable_config NAME DESCRIPTION DEFAULT_VALUE)
17+
macro(define_overridable_config NAME DESCRIPTION VALUE_TYPE DEFAULT_VALUE)
1818
enforce_executorch_config_name(${NAME})
1919

20+
if(NOT "${VALUE_TYPE}" STREQUAL "STRING" AND NOT "${VALUE_TYPE}" STREQUAL "BOOL")
21+
message(FATAL_ERROR "Invalid config (${NAME}) value type '${VALUE_TYPE}', must be either STRING or BOOL")
22+
endif()
23+
2024
if(DEFINED ${NAME})
21-
set(${NAME} ${${NAME}} CACHE STRING ${DESCRIPTION} FORCE)
25+
set(${NAME} ${${NAME}} CACHE ${VALUE_TYPE} ${DESCRIPTION} FORCE)
2226
else()
23-
set(${NAME} ${DEFAULT_VALUE} CACHE STRING ${DESCRIPTION})
27+
set(${NAME} ${DEFAULT_VALUE} CACHE ${VALUE_TYPE} ${DESCRIPTION})
2428
endif()
2529
endmacro()

tools/cmake/common/preset_test.py

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -62,15 +62,15 @@ def test_set_option(self):
6262
}
6363
)
6464
self.run_cmake()
65-
self.assert_cmake_cache("SECRET_MESSAGE", "move fast")
66-
self.assert_cmake_cache("PI", "3.14")
65+
self.assert_cmake_cache("SECRET_MESSAGE", "move fast", "STRING")
66+
self.assert_cmake_cache("PI", "3.14", "STRING")
6767

6868
def test_define_overridable_config_invalid_name(self):
6969
_cmake_lists_txt = """
7070
cmake_minimum_required(VERSION 3.24)
7171
project(test_preset)
7272
include(${PROJECT_SOURCE_DIR}/preset.cmake)
73-
define_overridable_config(IAM_AN_INVALID_NAME "test example" "default value")
73+
define_overridable_config(IAM_AN_INVALID_NAME "test example" STRING "default value")
7474
"""
7575
self.create_workspace({"CMakeLists.txt": _cmake_lists_txt})
7676
self.run_cmake(
@@ -85,7 +85,8 @@ def test_define_overridable_config_default(self):
8585
add_subdirectory(example)
8686
"""
8787
_example_cmake_lists_txt = """
88-
define_overridable_config(EXECUTORCH_TEST_MESSAGE "test message" "default value")
88+
define_overridable_config(EXECUTORCH_TEST_MESSAGE "test message" STRING "default value")
89+
define_overridable_config(EXECUTORCH_TEST_OPTION "test option" BOOL ON)
8990
"""
9091
self.create_workspace(
9192
{
@@ -96,7 +97,20 @@ def test_define_overridable_config_default(self):
9697
}
9798
)
9899
self.run_cmake()
99-
self.assert_cmake_cache("EXECUTORCH_TEST_MESSAGE", "default value")
100+
self.assert_cmake_cache("EXECUTORCH_TEST_MESSAGE", "default value", "STRING")
101+
self.assert_cmake_cache("EXECUTORCH_TEST_OPTION", "ON", "BOOL")
102+
103+
def test_define_overridable_config_invalid_type(self):
104+
_cmake_lists_txt = """
105+
cmake_minimum_required(VERSION 3.24)
106+
project(test_preset)
107+
include(${PROJECT_SOURCE_DIR}/preset.cmake)
108+
define_overridable_config(EXECUTORCH_TEST_MESSAGE "test example" NUMBER "default value")
109+
"""
110+
self.create_workspace({"CMakeLists.txt": _cmake_lists_txt})
111+
self.run_cmake(
112+
error_contains="Invalid config (EXECUTORCH_TEST_MESSAGE) value type 'NUMBER'"
113+
)
100114

101115
def test_define_overridable_config_cli_override(self):
102116
_cmake_lists_txt = """
@@ -106,7 +120,7 @@ def test_define_overridable_config_cli_override(self):
106120
add_subdirectory(example)
107121
"""
108122
_example_cmake_lists_txt = """
109-
define_overridable_config(EXECUTORCH_TEST_MESSAGE "test message" "default value")
123+
define_overridable_config(EXECUTORCH_TEST_MESSAGE "test message" STRING "default value")
110124
"""
111125
self.create_workspace(
112126
{
@@ -117,7 +131,7 @@ def test_define_overridable_config_cli_override(self):
117131
}
118132
)
119133
self.run_cmake(cmake_args=["-DEXECUTORCH_TEST_MESSAGE='cli value'"])
120-
self.assert_cmake_cache("EXECUTORCH_TEST_MESSAGE", "cli value")
134+
self.assert_cmake_cache("EXECUTORCH_TEST_MESSAGE", "cli value", "STRING")
121135

122136
def test_define_overridable_config_set_override_before(self):
123137
_cmake_lists_txt = """
@@ -128,7 +142,7 @@ def test_define_overridable_config_set_override_before(self):
128142
add_subdirectory(example)
129143
"""
130144
_example_cmake_lists_txt = """
131-
define_overridable_config(EXECUTORCH_TEST_MESSAGE "test message" "default value")
145+
define_overridable_config(EXECUTORCH_TEST_MESSAGE "test message" STRING "default value")
132146
"""
133147
self.create_workspace(
134148
{
@@ -139,7 +153,7 @@ def test_define_overridable_config_set_override_before(self):
139153
}
140154
)
141155
self.run_cmake()
142-
self.assert_cmake_cache("EXECUTORCH_TEST_MESSAGE", "set value")
156+
self.assert_cmake_cache("EXECUTORCH_TEST_MESSAGE", "set value", "STRING")
143157

144158
def testdefine_overridable_config_set_override_after(self):
145159
_cmake_lists_txt = """
@@ -150,7 +164,7 @@ def testdefine_overridable_config_set_override_after(self):
150164
set(EXECUTORCH_TEST_MESSAGE "set value")
151165
"""
152166
_example_cmake_lists_txt = """
153-
define_overridable_config(EXECUTORCH_TEST_MESSAGE "test message" "default value")
167+
define_overridable_config(EXECUTORCH_TEST_MESSAGE "test message" STRING "default value")
154168
"""
155169
self.create_workspace(
156170
{
@@ -162,7 +176,7 @@ def testdefine_overridable_config_set_override_after(self):
162176
)
163177
self.run_cmake()
164178
# Setting the value after should not affect the cache.
165-
self.assert_cmake_cache("EXECUTORCH_TEST_MESSAGE", "default value")
179+
self.assert_cmake_cache("EXECUTORCH_TEST_MESSAGE", "default value", "STRING")
166180

167181
def test_define_overridable_config_set_override_after_with_cache(self):
168182
_cmake_lists_txt = """
@@ -173,7 +187,7 @@ def test_define_overridable_config_set_override_after_with_cache(self):
173187
set(EXECUTORCH_TEST_MESSAGE "set value" CACHE STRING "")
174188
"""
175189
_example_cmake_lists_txt = """
176-
define_overridable_config(EXECUTORCH_TEST_MESSAGE "test message" "default value")
190+
define_overridable_config(EXECUTORCH_TEST_MESSAGE "test message" STRING "default value")
177191
"""
178192
self.create_workspace(
179193
{
@@ -185,7 +199,7 @@ def test_define_overridable_config_set_override_after_with_cache(self):
185199
)
186200
self.run_cmake()
187201
# Setting the value after should not affect the cache.
188-
self.assert_cmake_cache("EXECUTORCH_TEST_MESSAGE", "default value")
202+
self.assert_cmake_cache("EXECUTORCH_TEST_MESSAGE", "default value", "STRING")
189203

190204
def test_define_overridable_config_cli_override_with_set_override(self):
191205
_cmake_lists_txt = """
@@ -196,7 +210,7 @@ def test_define_overridable_config_cli_override_with_set_override(self):
196210
add_subdirectory(example)
197211
"""
198212
_example_cmake_lists_txt = """
199-
define_overridable_config(EXECUTORCH_TEST_MESSAGE "test message" "default value")
213+
define_overridable_config(EXECUTORCH_TEST_MESSAGE "test message" STRING "default value")
200214
"""
201215
self.create_workspace(
202216
{
@@ -208,4 +222,4 @@ def test_define_overridable_config_cli_override_with_set_override(self):
208222
)
209223
self.run_cmake(cmake_args=["-DEXECUTORCH_TEST_MESSAGE='cli value'"])
210224
# If an option is set through cmake, it should NOT be overridable from the CLI.
211-
self.assert_cmake_cache("EXECUTORCH_TEST_MESSAGE", "set value")
225+
self.assert_cmake_cache("EXECUTORCH_TEST_MESSAGE", "set value", "STRING")

tools/cmake/preset/default.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,4 @@ endif()
1414

1515
# MARK: - Definitions
1616

17-
define_overridable_config(EXECUTORCH_ENABLE_LOGGING "Build with ET_LOG_ENABLED" ${_is_build_type_debug})
17+
define_overridable_config(EXECUTORCH_ENABLE_LOGGING "Build with ET_LOG_ENABLED" BOOL ${_is_build_type_debug})

0 commit comments

Comments
 (0)