# Simple cmake script which may be used to setup # the ROSACE avionic case study. # # This is an evolving version of the initial case study from the paper: # # "The ROSACE Case Study: From Simulink Specification to Multi/Many-Core Execution" # Claire Pagetti, David SaussiƩ, Romain Gratia, Eric Noulard, Pierre Siron # RTAS'2014 # see: http://sites.onera.fr/schedmcore/node/17 # # cmake -P ROSACE-CaseStudy-auto.cmake # you should end up with a # ROSACE-step-by-step/ directory # configured. # # if you access the internet through a proxy then you should # set the "http_proxy" and "https_proxy" environment variable # to apppropriate value before running the CMake script. # e.g.: # export http_proxy=http://myproxy.mydomain.fr:80 # export https_proxy=https://myproxy.mydomain.fr:80 cmake_minimum_required(VERSION 2.8) set(BASE_DIR "ROSACE-step-by-step") set(DOWNLOAD_DIR "${BASE_DIR}/Download") set(INSTALLED_DIR "${BASE_DIR}/installed") set(BLANK_L1 " ") set(BLANK_L2 "${BLANK_L1}${BLANK_L1}") set(BLANK_L3 "${BLANK_L2}${BLANK_L1}") message(STATUS "Creating directories in ${CMAKE_CURRENT_SOURCE_DIR}...") message(STATUS "${BLANK_L1}${BASE_DIR} --> base directory") file(MAKE_DIRECTORY "${BASE_DIR}") message(STATUS "${BLANK_L1}${DOWNLOAD_DIR} --> directory for download") file(MAKE_DIRECTORY "${DOWNLOAD_DIR}") message(STATUS "${BLANK_L1}${INSTALLED_DIR} --> directory for local installation") file(MAKE_DIRECTORY "${INSTALLED_DIR}") # Check for SVN command find_program(SVN_EXECUTABLE NAMES svn) # Avoid SVN warnings due to self-signed certificate set(SVN_CO_OPTIONS "--non-interactive;--trust-server-cert") message(STATUS "Step 1: Prelude compiler installation") set(PRELUDE_VERSION "1.5") set(PRELUDE_FILE_PREFIX "prelude-${PRELUDE_VERSION}") find_program(UNAME_EXECUTABLE NAMES uname) execute_process(COMMAND ${UNAME_EXECUTABLE} -m WORKING_DIRECTORY ${BASE_DIR} RESULT_VARIABLE UNAME_RES OUTPUT_VARIABLE UNAME_OUT ERROR_VARIABLE UNAME_ERR OUTPUT_STRIP_TRAILING_WHITESPACE TIMEOUT 600 ) if("${UNAME_OUT}" STREQUAL "x86_64") message(STATUS "${BLANK_L1}Host seems to be 64 bits...going for 64 bits prelude") set(PRELUDE_FILE_SUFFIX "-linux-64.tgz") else() message(STATUS "${BLANK_L1}Host seems to be 32 bits...going for 32 bits prelude") set(PRELUDE_FILE_SUFFIX "-linux-32.tgz") endif() # Building from source is the preferred solution set(BUILD_PRELUDE_FROM_SOURCE 1) if(BUILD_PRELUDE_FROM_SOURCE) message(STATUS "${BLANK_L1}Building Prelude from source...") set(PRELUDE_URL "https://svn.onera.fr/Prelude/Prelude/tags/prelude-${PRELUDE_VERSION}/") set(PRELUDE_SOURCE_DIR ${BASE_DIR}/prelude-${PRELUDE_VERSION}) message(STATUS "${BLANK_L1}Checking out <${PRELUDE_URL}> in <${BASE_DIR}> using SVN.") execute_process(COMMAND ${SVN_EXECUTABLE} co ${SVN_CO_OPTIONS} ${PRELUDE_URL} ${PRELUDE_SOURCE_DIR} WORKING_DIRECTORY ${BASE_DIR}/.. RESULT_VARIABLE CONFIG_RES OUTPUT_VARIABLE CONFIG_OUT ERROR_VARIABLE CONFIG_ERR TIMEOUT 600 ) if (CONFIG_RES) message(WARNING "Checkout COMMAND <${SVN_EXECUTABLE} co ${SVN_CO_OPTIONS} ${PRELUDE_URL} ${PRELUDE_SOURCE_DIR}> failed.") message(FATAL_ERROR "Possible reason = <${CONFIG_ERR}>") endif() message(STATUS "${BLANK_L1}Building prelude archive from source in <${BASE_DIR}> using 'distrib.sh'.") execute_process(COMMAND /bin/sh distrib.sh WORKING_DIRECTORY ${PRELUDE_SOURCE_DIR} RESULT_VARIABLE CONFIG_RES OUTPUT_VARIABLE CONFIG_OUT ERROR_VARIABLE CONFIG_ERR TIMEOUT 600 ) if (CONFIG_RES) message(WARNING "${BLANK_L1}COMMAND <${PRELUDE_SOURCE_DIR}/distrib.sh> failed.") message(FATAL_ERROR "Possible reason = <${CONFIG_ERR}>") else() set(LOCAL_FILE "${PRELUDE_SOURCE_DIR}/${PRELUDE_FILE_PREFIX}${PRELUDE_FILE_SUFFIX}") endif() else(BUILD_PRELUDE_FROM_SOURCE) message(STATUS "${BLANK_L1}Downloading pre-compiled Prelude...") set(PRELUDE_REMOTE_PREFIX "http://www.lifl.fr/~forget/prelude/") set(LOCAL_FILE "${BASE_DIR}/Download/${PRELUDE_FILE_PREFIX}${PRELUDE_FILE_SUFFIX}") set(REMOTE_FILE "${PRELUDE_REMOTE_PREFIX}${PRELUDE_FILE_PREFIX}${PRELUDE_FILE_SUFFIX}") message(STATUS "${BLANK_L1}Trying to install Prelude version ${PRELUDE_VERSION} using ${REMOTE_FILE} file...") message(STATUS "${BLANK_L1}Downloading...") if (EXISTS ${LOCAL_FILE}) message(STATUS "${BLANK_L2}Already there: nothing to do") else (EXISTS ${LOCAL_FILE}) message(STATUS "${BLANK_L2}Not there, trying to download...") file(DOWNLOAD ${REMOTE_FILE} ${LOCAL_FILE} TIMEOUT 600 STATUS DL_STATUS LOG DL_LOG SHOW_PROGRESS) list(GET DL_STATUS 0 DL_NOK) if ("${DL_LOG}" MATCHES "404 Not Found") set(DL_NOK 1) endif ("${DL_LOG}" MATCHES "404 Not Found") if (DL_NOK) # we shall remove the file because it is created # with an inappropriate content file(REMOVE ${LOCAL_FILE}) message(SEND_ERROR "${BLANK_L2}Download failed: ${DL_LOG}") else (DL_NOK) message(STATUS "${BLANK_L1}Download successful.") endif (DL_NOK) endif (EXISTS ${LOCAL_FILE}) endif(BUILD_PRELUDE_FROM_SOURCE) message(STATUS "${BLANK_L1}Unarchiving the file") execute_process(COMMAND ${CMAKE_COMMAND} -E tar zxvf ${CMAKE_SOURCE_DIR}/${LOCAL_FILE} WORKING_DIRECTORY ${INSTALLED_DIR} RESULT_VARIABLE UNTAR_RES OUTPUT_VARIABLE UNTAR_OUT ERROR_VARIABLE UNTAR_ERR ) message(STATUS "${BLANK_L1}Prelude version <${PRELUDE_VERSION}> has been unarchived in <${INSTALLED_DIR}/${PRELUDE_FILE_PREFIX}>.") message(STATUS "Step 2: Lustre compiler installation") set(LUSTREC_VERSION "1.2-Xia-Tai-Kang") set(LUSTREC_FILE_PREFIX "lustrec-${LUSTREC_VERSION}") set(LUSTREC_FILE_SUFFIX "-src.tar.gz") set(BUILD_LUSTREC_FROM_SOURCE 1) if(BUILD_LUSTREC_FROM_SOURCE) message(STATUS "${BLANK_L1}Building lustrec from source...") set(LUSTREC_REMOTE_PREFIX "https://cavale.enseeiht.fr/redmine/attachments/download/99/") set(LOCAL_FILE "${BASE_DIR}/Download/${LUSTREC_FILE_PREFIX}${LUSTREC_FILE_SUFFIX}") set(REMOTE_FILE "${LUSTREC_REMOTE_PREFIX}${LUSTREC_FILE_PREFIX}${LUSTREC_FILE_SUFFIX}") set(LUSTREC_SOURCE_DIR ${BASE_DIR}/lustrec) message(STATUS "${BLANK_L1}Downloading Lustre tarball...") message(STATUS "${BLANK_L1}Trying to install Lustre Compiler version ${LUSTREC_VERSION} using ${REMOTE_FILE} file...") message(STATUS "${BLANK_L1}Downloading...") if (EXISTS ${LOCAL_FILE}) message(STATUS "${BLANK_L2}Already there: nothing to do") else (EXISTS ${LOCAL_FILE}) message(STATUS "${BLANK_L2}Not there, trying to download...") file(DOWNLOAD ${REMOTE_FILE} ${LOCAL_FILE} TIMEOUT 600 STATUS DL_STATUS LOG DL_LOG SHOW_PROGRESS) list(GET DL_STATUS 0 DL_NOK) if ("${DL_LOG}" MATCHES "404 Not Found") set(DL_NOK 1) endif ("${DL_LOG}" MATCHES "404 Not Found") if (DL_NOK) # we shall remove the file because it is created # with an inappropriate content file(REMOVE ${LOCAL_FILE}) message(SEND_ERROR "${BLANK_L2}Download failed: ${DL_LOG}") else (DL_NOK) message(STATUS "${BLANK_L1}Download successful.") endif (DL_NOK) endif (EXISTS ${LOCAL_FILE}) message(STATUS "${BLANK_L1}Unarchiving the source file") execute_process(COMMAND ${CMAKE_COMMAND} -E tar zxvf ${CMAKE_SOURCE_DIR}/${LOCAL_FILE} WORKING_DIRECTORY ${BASE_DIR} RESULT_VARIABLE UNTAR_RES OUTPUT_VARIABLE UNTAR_OUT ERROR_VARIABLE UNTAR_ERR) message(STATUS "${BLANK_L1}Lustrec source version <${LUSTREC_VERSION}> has been unarchived in <${BASE_DIR}/${LUSTREC_FILE_PREFIX}>.") message(STATUS "${BLANK_L1}Configuring lustrec from source in <${LUSTREC_SOURCE_DIR}> using 'configure'.") execute_process(COMMAND /bin/sh configure --prefix=${CMAKE_SOURCE_DIR}/${INSTALLED_DIR} WORKING_DIRECTORY ${LUSTREC_SOURCE_DIR} RESULT_VARIABLE CONFIG_RES OUTPUT_VARIABLE CONFIG_OUT ERROR_VARIABLE CONFIG_ERR TIMEOUT 600 ) if (CONFIG_RES) message(WARNING "${BLANK_L1}COMMAND <${LUSTREC_SOURCE_DIR}/configure> failed.") message(FATAL_ERROR "Possible reason = ") endif() message(STATUS "${BLANK_L1}Compiling lustrec in <${LUSTREC_SOURCE_DIR}>") execute_process(COMMAND make WORKING_DIRECTORY ${LUSTREC_SOURCE_DIR} RESULT_VARIABLE CONFIG_RES OUTPUT_VARIABLE CONFIG_OUT ERROR_VARIABLE CONFIG_ERR TIMEOUT 600 ) if (CONFIG_RES) message(WARNING "${BLANK_L1}COMMAND 'make' failed.") message(FATAL_ERROR "Possible reason = <${CONFIG_ERR}> / <${CONFIG_OUT}>") endif() message(STATUS "${BLANK_L1}Installing lustrec in <${BASE_DIR}/installed>") execute_process(COMMAND make install WORKING_DIRECTORY ${LUSTREC_SOURCE_DIR} RESULT_VARIABLE CONFIG_RES OUTPUT_VARIABLE CONFIG_OUT ERROR_VARIABLE CONFIG_ERR TIMEOUT 600 ) if (CONFIG_RES) message(WARNING "${BLANK_L1}COMMAND 'make install' failed.") message(FATAL_ERROR "Possible reason = <${CONFIG_ERR}> / <${CONFIG_OUT}>") endif() else() message(FATAL_ERROR "Lustrec is not available as a binary distribution, please find a way to download source") endif(BUILD_LUSTREC_FROM_SOURCE) message(STATUS "Step 3: SchedMCore checkout and installation...") set(SCHEDMCORE_URL "https://svn.onera.fr/schedmcore/tags/SchedMCore-0.5.0") #You should be able to use the trunk (most up-to-date) version as well #set(SCHEDMCORE_URL "https://svn.onera.fr/schedmcore/trunk") set(SCHEDMCORE_SOURCE_DIR ${BASE_DIR}/schedmcore-ROSACE_CaseStudy) set(SCHEDMCORE_BUILD_DIR "${BASE_DIR}/build-schedmcore-native") message(STATUS "${BLANK_L1}Checking out <${SCHEDMCORE_URL}> in <${BASE_DIR}> using SVN.") execute_process(COMMAND ${SVN_EXECUTABLE} co ${SVN_CO_OPTIONS} ${SCHEDMCORE_URL} ${SCHEDMCORE_SOURCE_DIR} WORKING_DIRECTORY ${BASE_DIR}/.. RESULT_VARIABLE CONFIG_RES OUTPUT_VARIABLE CONFIG_ ERROR_VARIABLE CONFIG_ERR TIMEOUT 600 ) if (CONFIG_RES) message(WARNING "Checkout COMMAND <${SVN_EXECUTABLE} co ${SVN_CO_OPTIONS} ${SCHEDMCORE_URL} ${SCHEDMCORE_SOURCE_DIR}> failed.") message(FATAL_ERROR "Possible reason = <${CONFIG_ERR}>") endif() file(MAKE_DIRECTORY ${SCHEDMCORE_BUILD_DIR}) execute_process(COMMAND ${CMAKE_COMMAND} -DENABLE_PRELUDE_SUPPORT=ON -DCMAKE_INSTALL_PREFIX=../installed ../schedmcore-ROSACE_CaseStudy WORKING_DIRECTORY ${SCHEDMCORE_BUILD_DIR} RESULT_VARIABLE CONFIG_RES OUTPUT_VARIABLE CONFIG_OUT ERROR_VARIABLE CONFIG_ERR TIMEOUT 600 ) if (CONFIG_RES) message(WARNING "Configure COMMAND <${CMAKE_COMMAND} -DENABLE_PRELUDE_SUPPORT=ON -DCMAKE_INSTALL_PREFIX=../installed ../schedmcore-ROSACE_CaseStudy> failed.") message(FATAL_ERROR "Possible reason = <${CONFIG_ERR}>") endif() message(STATUS "${BLANK_L1}Building & installing with cmake --build --target install ...") execute_process(COMMAND ${CMAKE_COMMAND} --build . --target install WORKING_DIRECTORY ${SCHEDMCORE_BUILD_DIR} RESULT_VARIABLE CONFIG_RES OUTPUT_VARIABLE CONFIG_OUT ERROR_VARIABLE CONFIG_ERR ) if (CONFIG_RES) message(WARNING "Building installing COMMAND <${CMAKE_COMMAND} --build . --target install> failed.") message(FATAL_ERROR "Possible reason = <${CONFIG_ERR}>") endif() message(STATUS "Step 4: Checkout & Compile ROSACE case Study...") set(ROSACE_CASE_STUDY_URL "https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy") set(ROSACE_CASE_STUDY_SOURCE_DIR "${BASE_DIR}/ROSACE_CaseStudy") set(ROSACE_CASE_STUDY_PRELUDE_C_BUILD_DIR "${BASE_DIR}/build-ROSACE_CaseStudy-prelude_c-native") set(ROSACE_CASE_STUDY_PRELUDE_LUSTRE_BUILD_DIR "${BASE_DIR}/build-ROSACE_CaseStudy-prelude_lustre-native") message(STATUS "${BLANK_L1}Checking out <${ROSACE_CASE_STUDY_URL}> in <${BASE_DIR}> using SVN.") execute_process(COMMAND ${SVN_EXECUTABLE} co ${SVN_CO_OPTIONS} ${ROSACE_CASE_STUDY_URL} ${ROSACE_CASE_STUDY_SOURCE_DIR} WORKING_DIRECTORY ${BASE_DIR}/.. RESULT_VARIABLE CONFIG_RES OUTPUT_VARIABLE CONFIG_OUT ERROR_VARIABLE CONFIG_ERR TIMEOUT 600 ) if (CONFIG_RES) message(WARNING "Checkout COMMAND <${SVN_EXECUTABLE} co ${SVN_CO_OPTIONS} ${ROSACE_CASE_STUDY_URL} ${ROSACE_CASE_STUDY_SOURCE_DIR}> failed.") message(FATAL_ERROR "Possible reason = <${CONFIG_ERR}>") endif() message(STATUS "${BLANK_L1}The prelude source of the Case Study are in ${BASE_DIR}/ROSACE_CaseStudy/prelude_implementation/*") message(STATUS "${BLANK_L2} Prelude + C implementation will be compiled in ${ROSACE_CASE_STUDY_PRELUDE_C_BUILD_DIR}") message(STATUS "${BLANK_L2} Prelude + Lustre implementation will be compiled in ${ROSACE_CASE_STUDY_PRELUDE_LUSTRE_BUILD_DIR}") message(STATUS "${BLANK_L1}The Matlab/Simulink source of the Case Study are in ${BASE_DIR}/ROSACE_CaseStudy/simulink") message(STATUS "${BLANK_L1}Building case study for native execution (on the host) - Prelude + C implementation") file(MAKE_DIRECTORY ${ROSACE_CASE_STUDY_PRELUDE_C_BUILD_DIR}) execute_process(COMMAND ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=../installed ../ROSACE_CaseStudy/prelude_implementations/prelude_c WORKING_DIRECTORY ${ROSACE_CASE_STUDY_PRELUDE_C_BUILD_DIR} RESULT_VARIABLE CONFIG_RES OUTPUT_VARIABLE CONFIG_OUT ERROR_VARIABLE CONFIG_ERR TIMEOUT 600 ) message(STATUS "${BLANK_L1}Building with cmake --build ...") execute_process(COMMAND ${CMAKE_COMMAND} --build . WORKING_DIRECTORY ${ROSACE_CASE_STUDY_PRELUDE_C_BUILD_DIR} RESULT_VARIABLE CONFIG_RES OUTPUT_VARIABLE CONFIG_OUT ERROR_VARIABLE CONFIG_ERR ) message(STATUS "${BLANK_L1}Native build is in <${ROSACE_CASE_STUDY_PRELUDE_C_BUILD_DIR}>.") message(STATUS "${BLANK_L1}Building case study for native execution (on the host) - Prelude + Lustre") file(MAKE_DIRECTORY ${ROSACE_CASE_STUDY_PRELUDE_LUSTRE_BUILD_DIR}) execute_process(COMMAND ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=../installed ../ROSACE_CaseStudy/prelude_implementations/prelude_lustre WORKING_DIRECTORY ${ROSACE_CASE_STUDY_PRELUDE_LUSTRE_BUILD_DIR} RESULT_VARIABLE CONFIG_RES OUTPUT_VARIABLE CONFIG_OUT ERROR_VARIABLE CONFIG_ERR TIMEOUT 600 ) message(STATUS "${BLANK_L1}Building with cmake --build ...") execute_process(COMMAND ${CMAKE_COMMAND} --build . WORKING_DIRECTORY ${ROSACE_CASE_STUDY_PRELUDE_LUSTRE_BUILD_DIR} RESULT_VARIABLE CONFIG_RES OUTPUT_VARIABLE CONFIG_OUT ERROR_VARIABLE CONFIG_ERR ) message(STATUS "${BLANK_L1}Native build is in <${ROSACE_CASE_STUDY_PRELUDE_LUSTRE_BUILD_DIR}>.")