diff --git a/el/CMakeLists.txt b/el/CMakeLists.txt index d386fbe..327ab0d 100644 --- a/el/CMakeLists.txt +++ b/el/CMakeLists.txt @@ -1,58 +1,62 @@ option(SC_EL_BYTECOMPILE "Build emacs-based IDE." ON) mark_as_advanced(SC_EL_BYTECOMPILE) -file(GLOB scel_sources - RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.el) - -list(REMOVE_ITEM scel_sources ".dir-locals.el") - -file(GLOB_RECURSE local-load-path - LIST_DIRECTORIES true - "~/.emacs.d/site-lisp/*" - "~/.emacs.d/elpa/*") - -set(all_scel_sources ${scel_sources} sclang-vars.el) - set(PKG_DATA_DIR ${CMAKE_INSTALL_PREFIX}/share/SuperCollider) +file(GLOB scel_sources + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.el) + +# if w3m in installed locally add to the load-path +file(GLOB local-load-path + LIST_DIRECTORIES true + "$ENV{HOME}/.emacs.d/site-lisp/w3m-*" + "$ENV{HOME}/.emacs.d/elpa/w3m-*") + +foreach (path ${local-load-path}) + if(NOT IS_DIRECTORY ${path}) + list(REMOVE_ITEM local-load-path ${path}) + endif() +endforeach() + +list(APPEND local-load-path ${CMAKE_CURRENT_BINARY_DIR}) + +# convert to string of form " dir1 -L dir2 -L dir3 ..." when more than one dir +string(JOIN " -L " load-path ${local-load-path}) + +# build the argument string +string(CONCAT EMACS_ARGS "-batch -L " ${load-path} " -f batch-byte-compile") + configure_file(sclang-vars.el.in - ${CMAKE_CURRENT_BINARY_DIR}/sclang-vars.el) + ${CMAKE_CURRENT_BINARY_DIR}/sclang-vars.el) foreach (el ${scel_sources}) - configure_file(${el} ${CMAKE_CURRENT_BINARY_DIR}/${el}) + configure_file(${el} ${CMAKE_CURRENT_BINARY_DIR}/${el}) endforeach() set(all_scel_sources ${scel_sources} sclang-vars.el) install (FILES ${scel_sources} ${CMAKE_CURRENT_BINARY_DIR}/sclang-vars.el - DESTINATION share/emacs/site-lisp/SuperCollider) + DESTINATION share/emacs/site-lisp/SuperCollider) +# the emacs command needs to be evaled due to layers of (un)escaping required to add load-path if (SC_EL_BYTECOMPILE) - find_program(EMACS_EXECUTABLE emacs) - if(EMACS_EXECUTABLE-NOTFOUND) - message(SEND_ERROR "Emacs could not be found.\n (If emacs interface is not required, then set SC_EL=no)") - endif() + find_program(EMACS_EXECUTABLE emacs) + if(NOT EMACS_EXECUTABLE) + message(SEND_ERROR "Emacs could not be found.\n (If emacs interface is not required, then set SC_EL=no)") + endif() - find_program(W3M_EXECUTABLE w3m) - if(W3M_EXECUTABLE-NOTFOUND) - message(SEND_ERROR "Install w3m to build the help viewer.") - endif() + foreach (el ${all_scel_sources}) + add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${el}c + VERBATIM + COMMAND eval "${EMACS_EXECUTABLE} ${EMACS_ARGS} ${CMAKE_CURRENT_BINARY_DIR}/${el}" + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${el} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Creating byte-compiled Emacs lisp ${CMAKE_CURRENT_BINARY_DIR}/${el}c") - foreach (el ${all_scel_sources}) - add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${el}c - COMMAND ${EMACS_EXECUTABLE} -batch - -L ${CMAKE_CURRENT_BINARY_DIR} - -L ${local-load-path} - -f batch-byte-compile - ${CMAKE_CURRENT_BINARY_DIR}/${el} - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${el} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - COMMENT "Creating byte-compiled Emacs lisp ${CMAKE_CURRENT_BINARY_DIR}/${el}c") + add_custom_target(compile_${el}c ALL + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${el}c) - add_custom_target(compile_${el}c ALL - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${el}c) - - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${el}c - DESTINATION share/emacs/site-lisp/SuperCollider) - endforeach() + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${el}c + DESTINATION share/emacs/site-lisp/SuperCollider) + endforeach() endif()