From 8f3b66e254839095808f3ccd7248f5b63a2e3afd Mon Sep 17 00:00:00 2001 From: Guillaume Maudoux Date: Fri, 18 Dec 2015 20:35:09 +0100 Subject: [PATCH] Allow caching of generated sources --- boosthost/emulator/CMakeLists.txt | 7 ++--- lib/CMakeLists.txt | 3 ++- vm/boostenv/main/CMakeLists.txt | 44 ++++++++++++++++++++----------- vm/generator/main/CMakeLists.txt | 4 +-- vm/vm/main/CMakeLists.txt | 38 +++++++++++++++++--------- vm/vm/test/CMakeLists.txt | 3 ++- 6 files changed, 64 insertions(+), 35 deletions(-) diff --git a/boosthost/emulator/CMakeLists.txt b/boosthost/emulator/CMakeLists.txt index 3f146e54f..d60bf7b83 100644 --- a/boosthost/emulator/CMakeLists.txt +++ b/boosthost/emulator/CMakeLists.txt @@ -40,12 +40,13 @@ endif() # Mozart VM library -include_directories("${MOZART_DIR}/vm/vm/main" "${MOZART_BUILD_DIR}/vm/vm/main") +get_property(GENERATED_SOURCES_DIR GLOBAL PROPERTY GENERATED_SOURCES_DIR) +include_directories("${MOZART_DIR}/vm/vm/main" "${GENERATED_SOURCES_DIR}") # Mozart VM Boost environment library -include_directories("${MOZART_DIR}/vm/boostenv/main" - "${MOZART_BUILD_DIR}/vm/boostenv/main") +get_property(GENERATED_BOOSTSOURCES_DIR GLOBAL PROPERTY GENERATED_BOOSTSOURCES_DIR) +include_directories("${MOZART_DIR}/vm/boostenv/main" "${GENERATED_BOOSTSOURCES_DIR}") # Compile the executable diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 5e6bebaa1..3946c50ae 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -79,8 +79,9 @@ set(BOOTCOMPILER_DEFINES -D NO_GUMP) set(BOOTCOMPILER_BASEENV_DATA_FILE "${STAGE_0_CACHE}/baseenv.txt") set(BOOTCOMPILER_COMMAND ${Java_JAVA_EXECUTABLE} -jar ${JAVA_OPTIONS} "${BOOTCOMPILER_JAR}") +get_property(GENERATED_SOURCES_DIR GLOBAL PROPERTY GENERATED_SOURCES_DIR) set(BOOTCOMPILER_COMMON_OPTIONS - -m "${MOZART_BUILD_DIR}/vm/vm/main/" + -m "${GENERATED_SOURCES_DIR}/" ${BOOTCOMPILER_DEFINES}) set(BOOTCOMPILER_COMMON_DEPENDS gensources bootcompiler "${BOOTCOMPILER_JAR}") diff --git a/vm/boostenv/main/CMakeLists.txt b/vm/boostenv/main/CMakeLists.txt index 9bbe89825..12f06e010 100644 --- a/vm/boostenv/main/CMakeLists.txt +++ b/vm/boostenv/main/CMakeLists.txt @@ -33,49 +33,49 @@ endif() # Mozart VM library -include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../vm/main" - "${CMAKE_CURRENT_BINARY_DIR}/../../vm/main") +get_property(GENERATED_SOURCES_DIR GLOBAL PROPERTY GENERATED_SOURCES_DIR) +include_directories("${MOZART_SOURCE_DIR}/vm/vm/main" "${GENERATED_SOURCES_DIR}") +link_directories("${MOZART_BINARY_DIR}/vm/vm/main") -link_directories("${CMAKE_CURRENT_BINARY_DIR}/../../vm/main") - -include_directories(${CMAKE_CURRENT_BINARY_DIR}) +set(GENERATED_BOOSTSOURCES_CACHED_DIR ${CMAKE_CURRENT_SOURCE_DIR}/cached/) +set(GENERATED_BOOSTSOURCES_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated/) # Generate sources add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/boostenv.gen + OUTPUT ${GENERATED_BOOSTSOURCES_BINARY_DIR}/boostenv.gen # First pass: generate data types and interfaces COMMAND ${LLVM_BUILD_DIR}/bin/clang++ "${CXX_STD_OPT}" -Wno-invalid-noreturn -Wno-return-type - -o ${CMAKE_CURRENT_BINARY_DIR}/boostenv.ast + -o ${GENERATED_BOOSTSOURCES_BINARY_DIR}/boostenv.ast -I ${Boost_INCLUDE_DIRS} -I ${CMAKE_CURRENT_SOURCE_DIR}/../../vm/main -DMOZART_GENERATOR ${MOZART_GENERATOR_FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/boostenv.hh COMMAND generator intfimpl - ${CMAKE_CURRENT_BINARY_DIR}/boostenv.ast - ${CMAKE_CURRENT_BINARY_DIR}/ + ${GENERATED_BOOSTSOURCES_BINARY_DIR}/boostenv.ast + ${GENERATED_BOOSTSOURCES_BINARY_DIR}/ # Second pass: generate builtin information COMMAND ${LLVM_BUILD_DIR}/bin/clang++ "${CXX_STD_OPT}" -Wno-invalid-noreturn -Wno-return-type - -o ${CMAKE_CURRENT_BINARY_DIR}/boostenvmodules.astbi + -o ${GENERATED_BOOSTSOURCES_BINARY_DIR}/boostenvmodules.astbi -I ${Boost_INCLUDE_DIRS} - -I ${CMAKE_CURRENT_BINARY_DIR} + -I ${GENERATED_BOOSTSOURCES_BINARY_DIR} -I ${CMAKE_CURRENT_SOURCE_DIR}/../../vm/main - -I ${CMAKE_CURRENT_BINARY_DIR}/../../vm/main + -I ${GENERATED_BOOSTSOURCES_BINARY_DIR}/../../vm/main -DMOZART_BUILTIN_GENERATOR ${MOZART_GENERATOR_FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/boostenvmodules.hh COMMAND generator builtins - ${CMAKE_CURRENT_BINARY_DIR}/boostenvmodules.astbi - ${CMAKE_CURRENT_BINARY_DIR}/ + ${GENERATED_BOOSTSOURCES_BINARY_DIR}/boostenvmodules.astbi + ${GENERATED_BOOSTSOURCES_BINARY_DIR}/ boostenvbuiltins # Tag - COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/boostenv.gen + COMMAND ${CMAKE_COMMAND} -E touch ${GENERATED_BOOSTSOURCES_BINARY_DIR}/boostenv.gen DEPENDS generator gensources IMPLICIT_DEPENDS CXX "${CMAKE_CURRENT_SOURCE_DIR}/boostenvmodules.hh" @@ -83,11 +83,23 @@ add_custom_command( COMMENT "Generate sources for boostenv" VERBATIM) + +# Use the cached files if they exist. + +if(EXISTS ${GENERATED_BOOSTSOURCES_CACHED_DIR}/boostenv.gen) + set(GENERATED_BOOSTSOURCES_DIR ${GENERATED_BOOSTSOURCES_CACHED_DIR}) +else() + set(GENERATED_BOOSTSOURCES_DIR ${GENERATED_BOOSTSOURCES_BINARY_DIR}) + file(MAKE_DIRECTORY ${GENERATED_BOOSTSOURCES_BINARY_DIR}) +endif() +set_property(GLOBAL PROPERTY GENERATED_BOOSTSOURCES_DIR "${GENERATED_BOOSTSOURCES_DIR}") + add_custom_target(genboostsources - DEPENDS boostenv.gen + DEPENDS ${GENERATED_BOOSTSOURCES_DIR}/boostenv.gen VERBATIM) # Boost environment library +include_directories(${GENERATED_BOOSTSOURCES_DIR}) add_library(mozartvmboost boostvm.cc boostenvmodules.cc) add_dependencies(mozartvmboost genboostsources) diff --git a/vm/generator/main/CMakeLists.txt b/vm/generator/main/CMakeLists.txt index 5a3fe28fb..f49a71ef6 100644 --- a/vm/generator/main/CMakeLists.txt +++ b/vm/generator/main/CMakeLists.txt @@ -21,6 +21,6 @@ include_directories( "${CLANG_SRC_DIR}/include" "${CLANG_BUILD_DIR}/include") link_directories("${LLVM_BUILD_DIR}/lib") -add_executable(generator generator.cc interfaces.cc implementations.cc - builtins.cc utils.cc) +add_executable(generator EXCLUDE_FROM_ALL + generator.cc interfaces.cc implementations.cc builtins.cc utils.cc) target_link_libraries(generator "${CLANG_LIBRARY}") diff --git a/vm/vm/main/CMakeLists.txt b/vm/vm/main/CMakeLists.txt index a8b974c70..c012741a4 100644 --- a/vm/vm/main/CMakeLists.txt +++ b/vm/vm/main/CMakeLists.txt @@ -1,10 +1,10 @@ -include_directories(${CMAKE_CURRENT_BINARY_DIR}) separate_arguments(SPLIT_CXX_FLAGS UNIX_COMMAND "${CMAKE_CXX_FLAGS}") set(MOZART_GENERATOR_FLAGS "${MOZART_GENERATOR_FLAGS}" "${SPLIT_CXX_FLAGS}") # properties-config.cc +include_directories(${CMAKE_CURRENT_BINARY_DIR}) configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/properties-config.cc.in" "${CMAKE_CURRENT_BINARY_DIR}/properties-config.cc" @@ -12,35 +12,38 @@ configure_file( # Generated sources +set(GENERATED_SOURCES_CACHED_DIR ${CMAKE_CURRENT_SOURCE_DIR}/cached/) +set(GENERATED_SOURCES_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated/) + add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/mozart.gen + OUTPUT ${GENERATED_SOURCES_BINARY_DIR}/mozart.gen # First pass: generate data types and interfaces COMMAND ${LLVM_BUILD_DIR}/bin/clang++ -std=c++0x -Wno-invalid-noreturn -Wno-return-type - -o ${CMAKE_CURRENT_BINARY_DIR}/mozart.ast + -o ${GENERATED_SOURCES_BINARY_DIR}/mozart.ast -DMOZART_GENERATOR ${MOZART_GENERATOR_FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/mozart.hh COMMAND generator intfimpl - ${CMAKE_CURRENT_BINARY_DIR}/mozart.ast - ${CMAKE_CURRENT_BINARY_DIR}/ + ${GENERATED_SOURCES_BINARY_DIR}/mozart.ast + ${GENERATED_SOURCES_BINARY_DIR}/ # Second pass: generate builtin information COMMAND ${LLVM_BUILD_DIR}/bin/clang++ -std=c++0x -Wno-invalid-noreturn -Wno-return-type - -o ${CMAKE_CURRENT_BINARY_DIR}/coremodules.astbi - -I ${CMAKE_CURRENT_BINARY_DIR} + -o ${GENERATED_SOURCES_BINARY_DIR}/coremodules.astbi + -I ${GENERATED_SOURCES_BINARY_DIR} -DMOZART_BUILTIN_GENERATOR ${MOZART_GENERATOR_FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/coremodules.hh COMMAND generator builtins - ${CMAKE_CURRENT_BINARY_DIR}/coremodules.astbi - ${CMAKE_CURRENT_BINARY_DIR}/ + ${GENERATED_SOURCES_BINARY_DIR}/coremodules.astbi + ${GENERATED_SOURCES_BINARY_DIR}/ mozartbuiltins # Tag - COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/mozart.gen + COMMAND ${CMAKE_COMMAND} -E touch ${GENERATED_SOURCES_BINARY_DIR}/mozart.gen DEPENDS generator IMPLICIT_DEPENDS CXX "${CMAKE_CURRENT_SOURCE_DIR}/coremodules.hh" @@ -48,12 +51,23 @@ add_custom_command( COMMENT "Generate sources for mozart" VERBATIM) + +# Use the cached files if they exist. + +if(EXISTS ${GENERATED_SOURCES_CACHED_DIR}/mozart.gen) + set(GENERATED_SOURCES_DIR ${GENERATED_SOURCES_CACHED_DIR}) +else() + set(GENERATED_SOURCES_DIR ${GENERATED_SOURCES_BINARY_DIR}) + file(MAKE_DIRECTORY ${GENERATED_SOURCES_BINARY_DIR}) +endif() +set_property(GLOBAL PROPERTY GENERATED_SOURCES_DIR "${GENERATED_SOURCES_DIR}") + add_custom_target(gensources - DEPENDS mozart.gen + DEPENDS ${GENERATED_SOURCES_DIR}/mozart.gen VERBATIM) # Build the library - +include_directories(${GENERATED_SOURCES_DIR}) add_library(mozartvm emulate.cc memmanager.cc gcollect.cc unify.cc sclone.cc vm.cc coredatatypes.cc coders.cc properties.cc coremodules.cc unpickler.cc serializer.cc pickler.cc) diff --git a/vm/vm/test/CMakeLists.txt b/vm/vm/test/CMakeLists.txt index e1c224f41..9d7771399 100644 --- a/vm/vm/test/CMakeLists.txt +++ b/vm/vm/test/CMakeLists.txt @@ -1,8 +1,9 @@ # Mozart VM library +get_property(GENERATED_SOURCES_DIR GLOBAL PROPERTY GENERATED_SOURCES_DIR) include_directories( "${CMAKE_CURRENT_SOURCE_DIR}/../main" - "${CMAKE_CURRENT_BINARY_DIR}/../main") + "${GENERATED_SOURCES_DIR}") if(MINGW) # GTest seems to use some non-standard things :-s