From 4967bf3021746749ab96fc61675383eec12478d0 Mon Sep 17 00:00:00 2001 From: Sam Yates <sam@quux.dropbear.id.au> Date: Wed, 8 Jun 2016 16:31:58 +0200 Subject: [PATCH] Use externalproject_add to manage mod->hpp depenedencies. Builds modcc from modparser as an external project; executable will reside under BUILD/external/bin where BUILD is the CMake build directory. CMake hackery (see 'build_all_mods' target) should generate required module .hpp files from .mod files before the cellalgo library is built, if the header files are missing or out of date. This should also suffice for performing out-of-source builds. --- CMakeLists.txt | 18 ++++++++++++++++++ external/modparser | 2 +- mechanisms/CMakeLists.txt | 19 +++++++++++++++++++ src/CMakeLists.txt | 2 ++ 4 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 mechanisms/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index ccc56d8a..e2ac3d1a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,9 @@ cmake_minimum_required (VERSION 2.8) project (cell_algorithms) enable_language(CXX) +# save incoming CXX flags for forwarding to modparser external project +set(SAVED_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + # compilation flags set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -std=c++11 -pthread -Wall") @@ -14,10 +17,25 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS "YES") set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +# targets for extermal dependencies +include(ExternalProject) +externalproject_add(modparser + PREFIX ${CMAKE_BINARY_DIR}/external + CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/external" + "-DCMAKE_CXX_FLAGS=${SAVED_CXX_FLAGS}" + "-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}" + BINARY_DIR "${CMAKE_BINARY_DIR}/external/modparser" + STAMP_DIR "${CMAKE_BINARY_DIR}/external/" + TMP_DIR "${CMAKE_BINARY_DIR}/external/tmp" + SOURCE_DIR "${CMAKE_SOURCE_DIR}/external/modparser" + ) + + include_directories(${CMAKE_SOURCE_DIR}/external) include_directories(${CMAKE_SOURCE_DIR}/include) include_directories(${CMAKE_SOURCE_DIR}/src) include_directories(${CMAKE_SOURCE_DIR}) +add_subdirectory(mechanisms) add_subdirectory(src) add_subdirectory(tests) diff --git a/external/modparser b/external/modparser index d1dd8fa8..dcfb69f8 160000 --- a/external/modparser +++ b/external/modparser @@ -1 +1 @@ -Subproject commit d1dd8fa868c0dc7e348093ed4a4b5c6c94e29e34 +Subproject commit dcfb69f8cfc435418dfb95348d613c9830e6ad6f diff --git a/mechanisms/CMakeLists.txt b/mechanisms/CMakeLists.txt new file mode 100644 index 00000000..ff2be3e3 --- /dev/null +++ b/mechanisms/CMakeLists.txt @@ -0,0 +1,19 @@ +set(mechanisms pas hh) + +set(modcc "${CMAKE_BINARY_DIR}/external/bin/modcc") + +foreach(mech ${mechanisms}) + set(mod "${CMAKE_CURRENT_SOURCE_DIR}/mod/${mech}.mod") + set(hpp "${CMAKE_CURRENT_SOURCE_DIR}/${mech}.hpp") + message(STATUS "add_cc for ${hpp}") + add_custom_command(OUTPUT "${hpp}" + DEPENDS modparser "${mod}" + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + COMMAND "${modcc}" -t cpu -o "${hpp}" "${mod}") + set_source_files_properties("${hpp}" PROPERTIES GENERATED TRUE) + list(APPEND all_mod_hpps "${hpp}") +endforeach() + +# Fake target to always trigger .mod -> .hpp dependencies because wtf CMake +add_custom_target(build_all_mods DEPENDS ${all_mod_hpps}) + diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8a8286bd..125f99db 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -9,3 +9,5 @@ set(BASE_SOURCES ) add_library(cellalgo ${BASE_SOURCES} ${HEADERS}) +add_dependencies(cellalgo build_all_mods) + -- GitLab