Skip to content

Commit bd5e22c

Browse files
committed
improve cmake for convenient usage of bootstrapped compiler
1 parent e5ec7e8 commit bd5e22c

File tree

83 files changed

+123961
-102
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

83 files changed

+123961
-102
lines changed

.gitattributes

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
# All files generated by standalone contexts are ignored in git statistic
22
src/das/**/*.cpp binary
33
src/das/**/*.h binary
4+
daslib/_aot_generated/*.cpp binary

.gitignore

-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ tmtags
66

77
*.output
88
*.temp
9-
**/_aot_generated
109

1110
build/
1211
bin/

CMakeLists.txt

+146-97
Original file line numberDiff line numberDiff line change
@@ -93,23 +93,35 @@ SETUP_COMPILER()
9393
set(THREADS_PREFER_PTHREAD_FLAG ON)
9494
find_package(Threads REQUIRED)
9595

96-
MACRO(DAS_AOT_EXT input genList mainTarget dasAotTool dasAotToolArg)
96+
97+
MACRO (ADD_AOT_EXT_FILE genList mainTarget input)
9798
get_filename_component(input_src ${input} ABSOLUTE)
9899
get_filename_component(input_dir ${input_src} DIRECTORY)
99100
get_filename_component(input_name ${input} NAME)
100101
set(out_dir ${input_dir}/_aot_generated)
101102
set(out_src "${out_dir}/${mainTarget}_${input_name}.cpp")
103+
set_source_files_properties(${out_src} PROPERTIES GENERATED TRUE)
104+
list(APPEND ${genList} ${out_src})
105+
ENDMACRO()
106+
107+
MACRO(DAS_AOT_EXT input genList mainTarget dasAotTool dasAotToolArg)
108+
ADD_AOT_EXT_FILE(${genList} ${mainTarget} ${input})
109+
list(GET ${genList} -1 out_src)
110+
get_filename_component(input_src ${input} ABSOLUTE)
111+
get_filename_component(out_dir ${out_src} DIRECTORY)
102112
file(MAKE_DIRECTORY ${out_dir})
103-
ADD_CUSTOM_COMMAND(
104-
DEPENDS ${input_src}
105-
DEPENDS ${dasAotTool}
113+
ADD_CUSTOM_COMMAND(
114+
DEPENDS ${input_src}
115+
# todo: we can't depend on dasAotTool due to cyclic dependencies,
116+
# however we can force cmake to build it before (aka resolve dependency manually) which is not done yet
117+
# DEPENDS ${dasAotTool}
106118
OUTPUT ${out_src}
107119
COMMENT "AOT precompiling ${input_src} -> ${out_src}"
108120
COMMAND ${dasAotTool} ${dasAotToolArg} ${input_src} ${out_src}
109121
)
110-
list(APPEND ${genList} ${out_src})
111122
set(custom_name ${mainTarget}_${input_name}_aot)
112123
ADD_CUSTOM_TARGET(${custom_name} DEPENDS ${out_src})
124+
set_source_files_properties(${out_src} PROPERTIES GENERATED TRUE)
113125
SET_TARGET_PROPERTIES(${custom_name} PROPERTIES FOLDER _${mainTarget}_aot)
114126
ADD_DEPENDENCIES(${mainTarget} ${custom_name})
115127
ENDMACRO()
@@ -118,22 +130,34 @@ MACRO(DAS_AOT input genList mainTarget dasAotTool)
118130
DAS_AOT_EXT(${input} ${genList} ${mainTarget} ${dasAotTool} -aot)
119131
ENDMACRO()
120132

121-
MACRO(DAS_AOT_STANDALONE input genList mainTarget dasAotTool)
133+
MACRO(ADD_STANDALONE_FILE genList input)
122134
get_filename_component(input_src ${input} ABSOLUTE)
123135
get_filename_component(input_dir ${input_src} DIRECTORY)
124136
get_filename_component(input_name ${input} NAME)
125-
get_filename_component(ctx_name ${input} NAME_WE)
126137
set(out_dir ${input_dir}/_standalone_ctx_generated)
138+
set(out_inc ${out_dir}/${input_name}.h)
127139
set(out_src ${out_dir}/${input_name}.cpp)
140+
set_source_files_properties(${out_inc} PROPERTIES GENERATED TRUE)
141+
set_source_files_properties(${out_src} PROPERTIES GENERATED TRUE)
142+
list(APPEND ${genList} ${out_inc})
143+
list(APPEND ${genList} ${out_src})
144+
ENDMACRO()
145+
146+
MACRO(DAS_AOT_STANDALONE input genList mainTarget dasAotTool)
147+
get_filename_component(ctx_name ${input} NAME_WE)
148+
ADD_STANDALONE_FILE(${genList} ${input})
149+
list(GET ${genList} -1 out_src)
150+
get_filename_component(out_dir ${out_src} DIRECTORY)
128151
file(MAKE_DIRECTORY ${out_dir})
129152
ADD_CUSTOM_COMMAND(
130153
DEPENDS ${input_src}
131-
DEPENDS ${dasAotTool}
154+
# todo: we can't depend on dasAotTool due to cyclic dependencies,
155+
# however we can force cmake to build it before (aka resolve dependency manually)
156+
# DEPENDS ${dasAotTool}
132157
OUTPUT ${out_src}
133158
COMMENT "AOT precompiling ${input_src} -> ${out_src}"
134159
COMMAND ${dasAotTool} -aot ${input_src} ${out_dir} -standalone-context ${ctx_name} -standalone-class Standalone
135160
)
136-
list(APPEND ${genList} ${out_src})
137161
set(custom_name ${mainTarget}_${input_name}_standalone)
138162
ADD_CUSTOM_TARGET(${custom_name} DEPENDS ${out_src})
139163
set_source_files_properties(${out_src} PROPERTIES GENERATED TRUE)
@@ -713,76 +737,8 @@ list(SORT DAS_LIB_SRC)
713737

714738
include_directories(include)
715739
include_directories(3rdparty/fmt/include)
716-
ADD_LIBRARY(libDaScript ${PARSER_GENERATED_SRC} ${PARSER_SRC} ${VECMATH_SRC} ${AST_SRC} ${BUILTIN_SRC}
717-
${MISC_SRC} ${SIMULATE_SRC} ${SIMULATE_FUSION_SRC} ${TEST_SRC} ${MAIN_SRC}
718-
${DAGOR_NOISE_SRC} ${FLAT_HASH_MAP_SRC} ${FAST_FLOAT_SRC} ${DASCRIPT_FMT_SRC})
719-
ADD_DEPENDENCIES(libDaScript need_and_resolve)
720-
ADD_PROJECT_XXD_DEPENDS(libDaScript)
721-
target_include_directories(libDaScript PUBLIC
722-
${DAS_SMMALLOC_DIR}
723-
${CMAKE_SOURCE_DIR}/3rdparty/uriparser/include
724-
${CMAKE_SOURCE_DIR}/include
725-
)
726-
target_link_libraries(libDaScript libUriParser)
727-
#target_link_libraries(libDaScript fmt::fmt)
728-
IF(LINUX_UUID)
729-
target_link_libraries(libDaScript uuid)
730-
ENDIF()
731-
IF(UNIX AND NOT APPLE)
732-
TARGET_LINK_LIBRARIES(libDaScript ${CMAKE_DL_LIBS})
733-
ENDIF()
734-
IF(HAIKU)
735-
TARGET_LINK_LIBRARIES(libDaScript network uuid)
736-
ENDIF()
737-
SETUP_CPP11(libDaScript)
738-
739-
add_custom_target(standaloneGenerated)
740-
SET(STANDALONE_SRC)
741-
DAS_AOT_STANDALONE("src/das/ast/ast_print.das" STANDALONE_SRC standaloneGenerated daslang)
742-
743-
ADD_LIBRARY(libDaScriptStandalone ${PARSER_GENERATED_SRC} ${PARSER_SRC} ${VECMATH_SRC} ${AST_SRC} ${BUILTIN_SRC}
744-
${MISC_SRC} ${SIMULATE_SRC} ${SIMULATE_FUSION_SRC} ${TEST_SRC} ${MAIN_SRC}
745-
${DAGOR_NOISE_SRC} ${FLAT_HASH_MAP_SRC} ${FAST_FLOAT_SRC} ${DASCRIPT_FMT_SRC} ${STANDALONE_SRC})
746-
ADD_DEPENDENCIES(libDaScriptStandalone need_and_resolve)
747-
ADD_DEPENDENCIES(libDaScriptStandalone standaloneGenerated)
748-
ADD_PROJECT_XXD_DEPENDS(libDaScriptStandalone)
749-
target_include_directories(libDaScriptStandalone PUBLIC
750-
${DAS_SMMALLOC_DIR}
751-
${CMAKE_SOURCE_DIR}/3rdparty/uriparser/include
752-
${CMAKE_SOURCE_DIR}/include
753-
)
754-
target_compile_definitions(libDaScriptStandalone PUBLIC STANDALONE_MODE)
755-
target_link_libraries(libDaScriptStandalone libUriParser)
756-
#target_link_libraries(libDaScript fmt::fmt)
757-
IF(LINUX_UUID)
758-
target_link_libraries(libDaScriptStandalone uuid)
759-
ENDIF()
760-
IF(UNIX AND NOT APPLE)
761-
TARGET_LINK_LIBRARIES(libDaScriptStandalone ${CMAKE_DL_LIBS})
762-
ENDIF()
763-
IF(HAIKU)
764-
TARGET_LINK_LIBRARIES(libDaScriptStandalone network uuid)
765-
ENDIF()
766-
SETUP_CPP11(libDaScriptStandalone)
767-
#target_precompile_headers(libDaScript PUBLIC include/daScript/misc/platform.h)
768-
769-
770-
if(NOT ${DAS_AOT_EXAMPLES_DISABLED})
771-
772-
if(${DAS_TOOLS_DISABLED})
773-
# error, we need tools to generate aot
774-
message(FATAL_ERROR "DAS_AOT_EXAMPLES_DISABLED requires DAS_TOOLS_DISABLED to be OFF")
775-
endif()
776740

777-
add_custom_target(dasAotStub)
778-
SET(AOT_GENERATED_SRC)
779-
780-
MACRO(DAS_AOT_LIB_FILES aotStdlibFiles genList mainTarget dasAotTool)
781-
FOREACH(inF IN LISTS ${aotStdlibFiles})
782-
DAS_AOT_LIB("${inF}" AOT_GENERATED_SRC dasAotStub daslang)
783-
ENDFOREACH()
784-
ENDMACRO()
785-
set(AotDaslibList
741+
set(AotDaslibList
786742
daslib/algorithm.das
787743
daslib/apply.das
788744
daslib/apply_in_context.das
@@ -863,19 +819,112 @@ if(NOT ${DAS_AOT_EXAMPLES_DISABLED})
863819
daslib/uriparser_boost.das
864820
daslib/utf8_utils.das
865821
daslib/validate_code.das
822+
)
823+
824+
SET(AOT_GENERATED_SRC)
825+
FOREACH(inF IN LISTS AotDaslibList)
826+
ADD_AOT_EXT_FILE(AOT_GENERATED_SRC dasAotStub ${inF})
827+
ENDFOREACH()
828+
829+
# one-shot target
830+
set(AOT_STAGE0_PATH ${CMAKE_CURRENT_BINARY_DIR}/_daslib_gen_stage0)
831+
foreach(FILE ${AOT_GENERATED_SRC})
832+
get_filename_component(FILENAME ${FILE} NAME)
833+
message("FILENAME ${FILENAME}")
834+
set(DST_FILE ${AOT_STAGE0_PATH}/${FILENAME})
835+
add_custom_command(
836+
OUTPUT ${DST_FILE}
837+
COMMAND ${CMAKE_COMMAND} -E copy
838+
${FILE}
839+
${DST_FILE}
840+
)
841+
list(APPEND AOT_GENERATED_SRC_STAGE0 "${DST_FILE}")
842+
endforeach()
843+
844+
add_custom_target(dasAotStub)
845+
SOURCE_GROUP_FILES("aot stub" AOT_GENERATED_SRC)
846+
847+
set(StandaloneFilesList
848+
src/das/ast/ast_print.das
849+
)
866850

851+
SET(STANDALONE_SRC)
852+
FOREACH(inF IN LISTS StandaloneFilesList)
853+
ADD_STANDALONE_FILE(STANDALONE_SRC ${inF})
854+
ENDFOREACH()
855+
856+
set(STANDALONE_STAGE0_PATH ${CMAKE_CURRENT_BINARY_DIR}/_standalone_gen_stage0)
857+
foreach(FILE ${STANDALONE_SRC})
858+
get_filename_component(FILENAME ${FILE} NAME)
859+
set(DST_FILE ${STANDALONE_STAGE0_PATH}/${FILENAME})
860+
add_custom_command(
861+
OUTPUT ${DST_FILE}
862+
COMMAND ${CMAKE_COMMAND} -E copy
863+
${FILE}
864+
${DST_FILE}
867865
)
866+
list(APPEND STANDALONE_SRC_STAGE0 "${DST_FILE}")
867+
endforeach()
868+
869+
870+
MACRO(SETUP_LIBDASCRIPT library aotFiles standaloneFiles)
871+
ADD_LIBRARY(${library} STATIC ${PARSER_GENERATED_SRC} ${PARSER_SRC} ${VECMATH_SRC} ${AST_SRC} ${BUILTIN_SRC}
872+
${MISC_SRC} ${SIMULATE_SRC} ${SIMULATE_FUSION_SRC} ${TEST_SRC} ${MAIN_SRC}
873+
${DAGOR_NOISE_SRC} ${FLAT_HASH_MAP_SRC} ${FAST_FLOAT_SRC} ${DASCRIPT_FMT_SRC}
874+
${standaloneFiles} ${aotFiles})
875+
ADD_DEPENDENCIES(${library} need_and_resolve)
876+
ADD_PROJECT_XXD_DEPENDS(${library})
877+
target_include_directories(${library} PUBLIC
878+
${DAS_SMMALLOC_DIR}
879+
${CMAKE_SOURCE_DIR}/3rdparty/uriparser/include
880+
${CMAKE_SOURCE_DIR}/include
881+
)
882+
target_link_libraries(${library} libUriParser)
883+
#target_link_libraries(${library} fmt::fmt)
884+
IF(LINUX_UUID)
885+
target_link_libraries(${library} uuid)
886+
ENDIF()
887+
IF(UNIX AND NOT APPLE)
888+
TARGET_LINK_LIBRARIES(${library} ${CMAKE_DL_LIBS})
889+
ENDIF()
890+
IF(HAIKU)
891+
TARGET_LINK_LIBRARIES(${library} network uuid)
892+
ENDIF()
893+
SETUP_CPP11(${library})
894+
#target_precompile_headers(${library} PUBLIC include/daScript/misc/platform.h)
895+
ENDMACRO()
896+
897+
SETUP_LIBDASCRIPT(libDaScriptStage0 "${AOT_GENERATED_SRC_STAGE0}" "${STANDALONE_SRC_STAGE0}")
898+
SETUP_LIBDASCRIPT(libDaScript "${AOT_GENERATED_SRC}" "${STANDALONE_SRC}")
899+
900+
add_custom_target(standaloneGenerated)
901+
902+
FOREACH(inF IN LISTS StandaloneFilesList)
903+
DAS_AOT_STANDALONE(${inF} standaloneSrc2 standaloneGenerated daslang-stage0)
904+
ENDFOREACH()
905+
906+
907+
SET(AOT_GENERATED_SRC2)
908+
FOREACH(inF IN LISTS AotDaslibList)
909+
DAS_AOT_LIB("${inF}" AOT_GENERATED_SRC2 dasAotStub daslang-stage0)
910+
ENDFOREACH()
911+
912+
ADD_DEPENDENCIES(libDaScript standaloneGenerated dasAotStub)
913+
914+
if(NOT ${DAS_AOT_EXAMPLES_DISABLED})
915+
916+
if(${DAS_TOOLS_DISABLED})
917+
# error, we need tools to generate aot
918+
message(FATAL_ERROR "DAS_AOT_EXAMPLES_DISABLED requires DAS_TOOLS_DISABLED to be OFF")
919+
endif()
868920

869-
DAS_AOT_LIB_FILES(AotDaslibList AOT_GENERATED_SRC dasAotStub daslang)
870-
SOURCE_GROUP_FILES("aot stub" AOT_GENERATED_SRC)
871921
#UNITIZE_BUILD("daslib" AOT_GENERATED_SRC)
872922

873923
SET(AOT_STUB_SRC
874924
utils/daScript/aot_stub.cpp
875925
)
876926
add_library(libDaScriptAot STATIC ${AOT_GENERATED_SRC} ${AOT_STUB_SRC})
877-
ADD_DEPENDENCIES(libDaScriptAot dasAotStub daslang libDaScript)
878-
ADD_DEPENDENCIES(libDaScriptStandalone dasAotStub)
927+
ADD_DEPENDENCIES(libDaScriptAot dasAotStub libDaScript)
879928
TARGET_LINK_LIBRARIES(libDaScriptAot libDaScript)
880929
SETUP_CPP11(libDaScriptAot)
881930
endif()
@@ -891,22 +940,22 @@ if (NOT ${DAS_TOOLS_DISABLED})
891940

892941
SOURCE_GROUP_FILES("main" DAS_DASCRIPT_MAIN_SRC)
893942

894-
SET(SRC_LIBRARIES libDaScript libDaScriptTest Threads::Threads ${DAS_MODULES_LIBS})
895-
SET(SRC_LIBRARIES_BOOTSTRAPPED libDaScriptStandalone libDaScriptTest Threads::Threads ${DAS_MODULES_LIBS})
896-
897-
add_executable(daslang-boostrapped ${DAS_DASCRIPT_MAIN_SRC} ${AOT_GENERATED_SRC})
898-
TARGET_LINK_LIBRARIES(daslang-boostrapped ${SRC_LIBRARIES_BOOTSTRAPPED})
943+
SET(SRC_LIBRARIES libDaScriptTest Threads::Threads ${DAS_MODULES_LIBS})
899944

945+
MACRO(SETUP_COMPILER_BINARY target_name library_name)
946+
add_executable(${target_name} ${DAS_DASCRIPT_MAIN_SRC})
947+
TARGET_LINK_LIBRARIES(${target_name} ${library_name} ${SRC_LIBRARIES})
948+
ADD_DEPENDENCIES(${target_name} ${library_name} libDaScriptTest ${DAS_MODULES_LIBS})
949+
SETUP_CPP11(${target_name})
950+
SETUP_LTO(${target_name})
951+
INSTALL(TARGETS ${target_name}
952+
RUNTIME DESTINATION ${DAS_INSTALL_BINDIR}
953+
)
954+
ENDMACRO()
900955

901-
add_executable(daslang ${DAS_DASCRIPT_MAIN_SRC})
902-
TARGET_LINK_LIBRARIES(daslang ${SRC_LIBRARIES})
903-
# ADD_DEPENDENCIES(daslang libDaScript libDaScriptTest ${DAS_MODULES_LIBS})
904-
SETUP_CPP11(daslang)
905-
SETUP_LTO(daslang)
906-
907-
INSTALL(TARGETS daslang
908-
RUNTIME DESTINATION ${DAS_INSTALL_BINDIR}
909-
)
956+
SETUP_COMPILER_BINARY(daslang-stage0 libDaScriptStage0)
957+
set_property(TARGET daslang-stage0 PROPERTY GENERATED TRUE)
958+
SETUP_COMPILER_BINARY(daslang libDaScript)
910959

911960
file(GLOB DASLIB_SOURCES
912961
${PROJECT_SOURCE_DIR}/daslib/*.das
@@ -916,7 +965,7 @@ if (NOT ${DAS_TOOLS_DISABLED})
916965
)
917966

918967
add_executable(das-fmt ${PROJECT_SOURCE_DIR}/utils/dasFormatter/main.cpp)
919-
TARGET_LINK_LIBRARIES(das-fmt ${SRC_LIBRARIES})
968+
TARGET_LINK_LIBRARIES(das-fmt libDaScript ${SRC_LIBRARIES})
920969

921970
SETUP_CPP11(das-fmt)
922971
SETUP_LTO(das-fmt)

0 commit comments

Comments
 (0)