Skip to content

Commit 596b841

Browse files
committedJul 14, 2024·
unity_build trial
1 parent 1ef6c03 commit 596b841

File tree

2 files changed

+177
-155
lines changed

2 files changed

+177
-155
lines changed
 

‎CMakeLists.txt

+110-94
Original file line numberDiff line numberDiff line change
@@ -2,44 +2,44 @@ cmake_minimum_required(VERSION 3.24) # Set the minimum required CMake version
22
project(pacman C)
33

44
function(add_header path precompile_header)
5-
get_filename_component(name "${path}" NAME)
6-
7-
list(APPEND HEADERS "${head_path}")
8-
if(${precompile_header})
9-
list(APPEND PRECOMPILED_HEADERS "${head_path}")
10-
message(STATUS "Add header: ${name} - precompiled")
11-
else(${precompile_header})
12-
message(STATUS "Add header: ${name}")
13-
endif(${precompile_header})
14-
15-
set(HEADERS
16-
${HEADERS}
17-
PARENT_SCOPE)
18-
set(PRECOMPILED_HEADERS
19-
${PRECOMPILED_HEADERS}
20-
PARENT_SCOPE)
5+
get_filename_component(name "${path}" NAME)
6+
7+
list(APPEND HEADERS "${head_path}")
8+
if (${precompile_header})
9+
list(APPEND PRECOMPILED_HEADERS "${head_path}")
10+
message(STATUS "Add header: ${name} - precompiled")
11+
else (${precompile_header})
12+
message(STATUS "Add header: ${name}")
13+
endif (${precompile_header})
14+
15+
set(HEADERS
16+
${HEADERS}
17+
PARENT_SCOPE)
18+
set(PRECOMPILED_HEADERS
19+
${PRECOMPILED_HEADERS}
20+
PARENT_SCOPE)
2121
endfunction(add_header)
2222

2323
function(add_source folder name precompile_header)
24-
cmake_path(SET src_path_start NORMALIZE "${folder}/src/")
25-
cmake_path(SET head_path_start NORMALIZE "${folder}/include/")
24+
cmake_path(SET src_path_start NORMALIZE "${folder}/src/")
25+
cmake_path(SET head_path_start NORMALIZE "${folder}/include/")
2626

27-
cmake_path(APPEND src_path "${src_path_start}" "${name}.c")
28-
cmake_path(APPEND head_path "${head_path_start}" "${name}.h")
27+
cmake_path(APPEND src_path "${src_path_start}" "${name}.c")
28+
cmake_path(APPEND head_path "${head_path_start}" "${name}.h")
2929

30-
list(APPEND SOURCES "${src_path}")
30+
list(APPEND SOURCES "${src_path}")
3131

32-
add_header(${head_path} ${precompile_header})
32+
add_header(${head_path} ${precompile_header})
3333

34-
set(SOURCES
35-
${SOURCES}
36-
PARENT_SCOPE)
37-
set(HEADERS
38-
${HEADERS}
39-
PARENT_SCOPE)
40-
set(PRECOMPILED_HEADERS
41-
${PRECOMPILED_HEADERS}
42-
PARENT_SCOPE)
34+
set(SOURCES
35+
${SOURCES}
36+
PARENT_SCOPE)
37+
set(HEADERS
38+
${HEADERS}
39+
PARENT_SCOPE)
40+
set(PRECOMPILED_HEADERS
41+
${PRECOMPILED_HEADERS}
42+
PARENT_SCOPE)
4343
endfunction(add_source)
4444

4545
option(BUILD_SHARED_LIBS "Build using shared libraries" OFF)
@@ -49,9 +49,9 @@ include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/embed.cmake)
4949
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/options.cmake)
5050

5151
create_resources(
52-
${CMAKE_CURRENT_SOURCE_DIR}/src/assets "asset_"
53-
${CMAKE_CURRENT_BINARY_DIR}/generated/src/assets.c
54-
${CMAKE_CURRENT_BINARY_DIR}/generated/include/assets.h)
52+
${CMAKE_CURRENT_SOURCE_DIR}/src/assets "asset_"
53+
${CMAKE_CURRENT_BINARY_DIR}/generated/src/assets.c
54+
${CMAKE_CURRENT_BINARY_DIR}/generated/include/assets.h)
5555

5656
set(PRECOMPILED_HEADERS)
5757

@@ -75,60 +75,60 @@ list(APPEND SOURCES ${HEADERS})
7575
message(STATUS "HEADERS: ${HEADERS}")
7676
message(STATUS "SOURCES: ${SOURCES}")
7777

78-
if(EMSCRIPTEN)
79-
# set(SUPPORT_CLANGD OFF CACHE BOOL "" FORCE)
80-
set(PLATFORM
81-
"Web"
82-
CACHE STRING "" FORCE)
83-
# remove --closure-args="--compilation_level SIMPLE" when
84-
# https://github.com/emscripten-core/emscripten/issues/16706 is fixed
85-
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3")
86-
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --no-heap-copy")
87-
set(CMAKE_EXECUTABLE_SUFFIX ".html")
88-
89-
set(LINK_FLAGS CMAKE_EXE_LINKER_FLAGS)
90-
91-
set(${LINK_FLAGS} "${${LINK_FLAGS}} -sGL_ENABLE_GET_PROC_ADDRESS")
92-
set(${LINK_FLAGS} "${${LINK_FLAGS}} -sWASM=1")
93-
set(${LINK_FLAGS} "${${LINK_FLAGS}} -sMINIFY_HTML=1")
94-
set(${LINK_FLAGS} "${${LINK_FLAGS}} -sENVIRONMENT=web")
95-
set(${LINK_FLAGS} "${${LINK_FLAGS}} -sFILESYSTEM=1")
96-
set(${LINK_FLAGS} "${${LINK_FLAGS}} -sALLOW_MEMORY_GROWTH=1")
97-
set(${LINK_FLAGS}
98-
"${${LINK_FLAGS}} --pre-js ${CMAKE_CURRENT_SOURCE_DIR}/src/wasm-shell/pre.js"
99-
)
100-
set(${LINK_FLAGS} "${${LINK_FLAGS}} --closure 0")
101-
set(${LINK_FLAGS} "${${LINK_FLAGS}} -sMODULARIZE")
102-
set(${LINK_FLAGS} "${${LINK_FLAGS}} -flto")
103-
set(${LINK_FLAGS} "${${LINK_FLAGS}} -sEXPORT_NAME=PacMan")
104-
set(${LINK_FLAGS} "${${LINK_FLAGS}} -sINVOKE_RUN=1")
105-
# set(${LINK_FLAGS} "${${LINK_FLAGS}} -sWASM_ASYNC_COMPILATION")
106-
set(${LINK_FLAGS}
107-
"${${LINK_FLAGS}} --shell-file ${CMAKE_CURRENT_SOURCE_DIR}/src/wasm-shell/shell.html"
108-
)
109-
110-
# Remove the -rdynamic flag because otherwise emscripten does not generate
111-
# HTML+JS+WASM files, only a non-working and fat HTML
112-
string(REPLACE "-rdynamic" "" CMAKE_SHARED_LIBRARY_LINK_C_FLAGS
113-
"${CMAKE_SHARED_LIBRARY_LINK_C_FLAGS}")
114-
endif()
78+
if (EMSCRIPTEN)
79+
# set(SUPPORT_CLANGD OFF CACHE BOOL "" FORCE)
80+
set(PLATFORM
81+
"Web"
82+
CACHE STRING "" FORCE)
83+
# remove --closure-args="--compilation_level SIMPLE" when
84+
# https://github.com/emscripten-core/emscripten/issues/16706 is fixed
85+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3")
86+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --no-heap-copy")
87+
set(CMAKE_EXECUTABLE_SUFFIX ".html")
88+
89+
set(LINK_FLAGS CMAKE_EXE_LINKER_FLAGS)
90+
91+
set(${LINK_FLAGS} "${${LINK_FLAGS}} -sGL_ENABLE_GET_PROC_ADDRESS")
92+
set(${LINK_FLAGS} "${${LINK_FLAGS}} -sWASM=1")
93+
set(${LINK_FLAGS} "${${LINK_FLAGS}} -sMINIFY_HTML=1")
94+
set(${LINK_FLAGS} "${${LINK_FLAGS}} -sENVIRONMENT=web")
95+
set(${LINK_FLAGS} "${${LINK_FLAGS}} -sFILESYSTEM=1")
96+
set(${LINK_FLAGS} "${${LINK_FLAGS}} -sALLOW_MEMORY_GROWTH=1")
97+
set(${LINK_FLAGS}
98+
"${${LINK_FLAGS}} --pre-js ${CMAKE_CURRENT_SOURCE_DIR}/src/wasm-shell/pre.js"
99+
)
100+
set(${LINK_FLAGS} "${${LINK_FLAGS}} --closure 0")
101+
set(${LINK_FLAGS} "${${LINK_FLAGS}} -sMODULARIZE")
102+
set(${LINK_FLAGS} "${${LINK_FLAGS}} -flto")
103+
set(${LINK_FLAGS} "${${LINK_FLAGS}} -sEXPORT_NAME=PacMan")
104+
set(${LINK_FLAGS} "${${LINK_FLAGS}} -sINVOKE_RUN=1")
105+
# set(${LINK_FLAGS} "${${LINK_FLAGS}} -sWASM_ASYNC_COMPILATION")
106+
set(${LINK_FLAGS}
107+
"${${LINK_FLAGS}} --shell-file ${CMAKE_CURRENT_SOURCE_DIR}/src/wasm-shell/shell.html"
108+
)
109+
110+
# Remove the -rdynamic flag because otherwise emscripten does not generate
111+
# HTML+JS+WASM files, only a non-working and fat HTML
112+
string(REPLACE "-rdynamic" "" CMAKE_SHARED_LIBRARY_LINK_C_FLAGS
113+
"${CMAKE_SHARED_LIBRARY_LINK_C_FLAGS}")
114+
endif ()
115115

116116
FetchContent_Declare(
117-
sdl
118-
GIT_SHALLOW TRUE
119-
GIT_REPOSITORY https://github.com/libsdl-org/SDL.git
120-
GIT_TAG origin/main)
117+
sdl
118+
GIT_SHALLOW TRUE
119+
GIT_REPOSITORY https://github.com/libsdl-org/SDL.git
120+
GIT_TAG origin/main)
121121

122122
FetchContent_Declare(
123-
sdl_image
124-
GIT_SHALLOW TRUE
125-
GIT_REPOSITORY https://github.com/libsdl-org/SDL_image.git
126-
GIT_TAG origin/main)
123+
sdl_image
124+
GIT_SHALLOW TRUE
125+
GIT_REPOSITORY https://github.com/libsdl-org/SDL_image.git
126+
GIT_TAG origin/main)
127127

128128
FetchContent_Declare(
129-
nuklear
130-
GIT_REPOSITORY https://github.com/Immediate-Mode-UI/Nuklear.git
131-
GIT_TAG origin/master)
129+
nuklear
130+
GIT_REPOSITORY https://github.com/Immediate-Mode-UI/Nuklear.git
131+
GIT_TAG origin/master)
132132

133133
FetchContent_MakeAvailable(sdl sdl_image nuklear)
134134

@@ -140,23 +140,39 @@ add_executable(${PROJECT_NAME} ${SOURCES})
140140
target_link_libraries(${PROJECT_NAME} SDL3::SDL3 SDL3_image::SDL3_image nuklear)
141141
target_compile_definitions(${PROJECT_NAME} PRIVATE NAME="${PROJECT_NAME}")
142142

143-
if(EMSCRIPTEN)
144-
set_target_properties(
145-
${PROJECT_NAME}
146-
PROPERTIES LINK_DEPENDS
147-
${CMAKE_CURRENT_SOURCE_DIR}/src/wasm-shell/shell.html)
148-
set_target_properties(
149-
${PROJECT_NAME}
150-
PROPERTIES LINK_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src/wasm-shell/pre.js)
151-
endif()
143+
if (EMSCRIPTEN)
144+
set_target_properties(
145+
${PROJECT_NAME}
146+
PROPERTIES LINK_DEPENDS
147+
${CMAKE_CURRENT_SOURCE_DIR}/src/wasm-shell/shell.html)
148+
set_target_properties(
149+
${PROJECT_NAME}
150+
PROPERTIES LINK_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src/wasm-shell/pre.js)
151+
endif ()
152152

153153
target_include_directories(
154-
${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include
155-
${CMAKE_CURRENT_BINARY_DIR}/generated/include)
154+
${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include
155+
${CMAKE_CURRENT_BINARY_DIR}/generated/include)
156156

157157
target_precompile_headers(${PROJECT_NAME} PRIVATE ${PRECOMPILED_HEADERS})
158158
target_compile_definitions(${PROJECT_NAME} PRIVATE -DFPS=${PACMAN_FPS})
159159

160160
set_property(TARGET ${PROJECT_NAME} PROPERTY C_STANDARD 23)
161161

162-
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/create_clangd.cmake)
162+
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/create_clangd.cmake)
163+
164+
get_all_targets(all_targets ${CMAKE_CURRENT_SOURCE_DIR})
165+
include(ProcessorCount)
166+
ProcessorCount(N)
167+
foreach (t ${all_targets})
168+
get_target_property(t_sources ${t} SOURCES)
169+
list(LENGTH t_sources len)
170+
math(EXPR batch_size "${len} / ${N}" OUTPUT_FORMAT DECIMAL)
171+
if (${batch_size} LESS 1)
172+
set(batch_size 1)
173+
endif ()
174+
message(STATUS "${t}: ${batch_size} = ${len} / ${N}")
175+
set_target_properties(${t} PROPERTIES
176+
UNITY_BUILD_MODE BATCH
177+
UNITY_BUILD_BATCH_SIZE batch_size)
178+
endforeach ()

‎cmake/create_clangd.cmake

+67-61
Original file line numberDiff line numberDiff line change
@@ -3,68 +3,74 @@
33
# Parameters: - _result the list containing all found targets - _dir root
44
# directory to start looking from
55
function(get_all_targets _result _dir)
6-
get_property(
7-
_subdirs
8-
DIRECTORY "${_dir}"
9-
PROPERTY SUBDIRECTORIES)
10-
foreach(_subdir IN LISTS _subdirs)
11-
get_all_targets(${_result} "${_subdir}")
12-
endforeach()
6+
get_property(
7+
_subdirs
8+
DIRECTORY "${_dir}"
9+
PROPERTY SUBDIRECTORIES)
10+
foreach (_subdir IN LISTS _subdirs)
11+
get_all_targets(${_result} "${_subdir}")
12+
endforeach ()
1313

14-
get_directory_property(_sub_targets DIRECTORY "${_dir}" BUILDSYSTEM_TARGETS)
15-
set(${_result}
16-
${${_result}} ${_sub_targets}
17-
PARENT_SCOPE)
14+
get_directory_property(_sub_targets DIRECTORY "${_dir}" BUILDSYSTEM_TARGETS)
15+
set(${_result}
16+
${${_result}} ${_sub_targets}
17+
PARENT_SCOPE)
1818
endfunction()
1919

2020
option(SUPPORT_CLANGD "Support clangd" ON)
21-
if(SUPPORT_CLANGD)
22-
set(CLANGD_SRC ${CMAKE_CURRENT_SOURCE_DIR}/cmake/.clangd.in)
23-
set(CLANGD_DEST ${CMAKE_CURRENT_SOURCE_DIR}/.clangd)
24-
if(EMSCRIPTEN)
25-
set(CMAKE_EXPORT_COMPILE_COMMANDS OFF)
26-
set(CMAKE_EXPORT_COMPILE_COMMANDS
27-
OFF
28-
CACHE INTERNAL "")
29-
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/compile_commands)
30-
get_all_targets(all_targets ${CMAKE_CURRENT_SOURCE_DIR})
31-
# set(all_targets ${PROJECT_NAME})
32-
foreach(t ${all_targets})
33-
get_target_property(t_sources ${t} SOURCES)
34-
get_target_property(t_source_dir ${t} SOURCE_DIR)
35-
foreach(s ${t_sources})
36-
file(REAL_PATH "${s}" s BASE_DIRECTORY "${t_source_dir}")
37-
message(STATUS "${s}: add_compile_command in ${t_source_dir}")
38-
string(MD5 s_name "${s}")
39-
set_source_files_properties(
40-
${s} TARGET_DIRECTORY ${t}
41-
PROPERTIES
42-
COMPILE_FLAGS
43-
"-MJ ${CMAKE_CURRENT_BINARY_DIR}/compile_commands/compile_commands_${s_name}.json"
44-
)
45-
set_property(
46-
TARGET ${PROJECT_NAME}
47-
APPEND
48-
PROPERTY
49-
ADDITIONAL_CLEAN_FILES
50-
"${CMAKE_CURRENT_BINARY_DIR}/compile_commands/compile_commands_${s_name}.json"
51-
)
52-
endforeach()
53-
endforeach()
54-
add_custom_command(
55-
TARGET ${PROJECT_NAME}
56-
POST_BUILD
57-
COMMAND
58-
${CMAKE_COMMAND}
59-
-DSOURCES_ARG="${CMAKE_CURRENT_BINARY_DIR}/compile_commands/" -P
60-
${CMAKE_CURRENT_SOURCE_DIR}/cmake/merge_compile_commands.cmake)
61-
else()
62-
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
63-
set(CMAKE_EXPORT_COMPILE_COMMANDS
64-
ON
65-
CACHE INTERNAL "")
66-
set(CLANGD_FLAGS_TO_ADD "")
67-
endif(EMSCRIPTEN)
68-
configure_file(${CLANGD_SRC} ${CLANGD_DEST} @ONLY)
69-
message(STATUS "exp: ${CMAKE_EXPORT_COMPILE_COMMANDS}")
70-
endif()
21+
if (SUPPORT_CLANGD)
22+
set(CLANGD_SRC ${CMAKE_CURRENT_SOURCE_DIR}/cmake/.clangd.in)
23+
set(CLANGD_DEST ${CMAKE_CURRENT_SOURCE_DIR}/.clangd)
24+
if (EMSCRIPTEN)
25+
set(CMAKE_EXPORT_COMPILE_COMMANDS OFF)
26+
set(CMAKE_EXPORT_COMPILE_COMMANDS
27+
OFF
28+
CACHE INTERNAL "")
29+
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/compile_commands)
30+
get_all_targets(all_targets ${CMAKE_CURRENT_SOURCE_DIR})
31+
# set(all_targets ${PROJECT_NAME})
32+
foreach (t ${all_targets})
33+
get_target_property(t_sources ${t} SOURCES)
34+
get_target_property(t_source_dir ${t} SOURCE_DIR)
35+
list(LENGTH t_sources len)
36+
math(EXPR batch_size "${len} / ${N}" OUTPUT_FORMAT DECIMAL)
37+
message(STATUS "${batch_size} = ${len} / ${N}")
38+
set_target_properties(${t} PROPERTIES
39+
UNITY_BUILD_MODE BATCH
40+
UNITY_BUILD_BATCH_SIZE batch_size)
41+
foreach (s ${t_sources})
42+
file(REAL_PATH "${s}" s BASE_DIRECTORY "${t_source_dir}")
43+
message(STATUS "${s}: add_compile_command in ${t_source_dir}")
44+
string(MD5 s_name "${s}")
45+
set_source_files_properties(
46+
${s} TARGET_DIRECTORY ${t}
47+
PROPERTIES
48+
COMPILE_FLAGS
49+
"-MJ ${CMAKE_CURRENT_BINARY_DIR}/compile_commands/compile_commands_${s_name}.json"
50+
)
51+
set_property(
52+
TARGET ${PROJECT_NAME}
53+
APPEND
54+
PROPERTY
55+
ADDITIONAL_CLEAN_FILES
56+
"${CMAKE_CURRENT_BINARY_DIR}/compile_commands/compile_commands_${s_name}.json"
57+
)
58+
endforeach ()
59+
endforeach ()
60+
add_custom_command(
61+
TARGET ${PROJECT_NAME}
62+
POST_BUILD
63+
COMMAND
64+
${CMAKE_COMMAND}
65+
-DSOURCES_ARG="${CMAKE_CURRENT_BINARY_DIR}/compile_commands/" -P
66+
${CMAKE_CURRENT_SOURCE_DIR}/cmake/merge_compile_commands.cmake)
67+
else ()
68+
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
69+
set(CMAKE_EXPORT_COMPILE_COMMANDS
70+
ON
71+
CACHE INTERNAL "")
72+
set(CLANGD_FLAGS_TO_ADD "")
73+
endif (EMSCRIPTEN)
74+
configure_file(${CLANGD_SRC} ${CLANGD_DEST} @ONLY)
75+
message(STATUS "exp: ${CMAKE_EXPORT_COMPILE_COMMANDS}")
76+
endif ()

0 commit comments

Comments
 (0)
Please sign in to comment.