cmake: add cmake support (#92)
[debian/pforth] / CMakeLists.txt
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644 (file)
index 0000000..1723ee2
--- /dev/null
@@ -0,0 +1,91 @@
+# NAME/CMakeLists.txt
+# Original file by Robin Rowe 2020-05-01
+# Extended by Phil Burk 2021-10-31
+# License: BSD Zero
+
+# To build pforth:
+#
+#    cmake .
+#    make
+#
+# That will create the following files:
+#    fth/pforth   # executable that loads pforth.dic
+#    fth/pforth.dic
+#    fth/pforth_standalone # executable that does not need a .dic file
+#
+# The build has several steps
+# 1. Build pforth executable
+# 2. Build pforth.dic by compiling system.fth
+# 3. Create a pfdicdat.h header containing a precompiled dictionary
+#    as C source code.
+# 4.  Build pforth_standalone using the precompiled dictionary.
+
+cmake_minimum_required(VERSION 3.6)
+set(CMAKE_CXX_STANDARD 17)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+set(CMAKE_CXX_EXTENSIONS OFF)
+
+# Put pforth in the fth folder so we can load the Forth code more easily.
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/fth)
+
+project(PForth)
+message("Configuring ${PROJECT_NAME}...")
+enable_testing()
+
+if(WIN32)
+    add_definitions(-D_CRT_SECURE_NO_WARNINGS)
+    message("Warning: _CRT_SECURE_NO_WARNINGS")
+endif(WIN32)
+
+add_subdirectory(csrc)
+if(NOT WIN32 AND NOT APPLE)
+       link_libraries(rt pthread)
+endif(NOT WIN32 AND NOT APPLE)
+
+option(UNISTD "Enable libunistd" false)
+if(UNISTD)
+       set(LIBUNISTD_PATH /code/github/libunistd)
+       if(WIN32)
+               include_directories(${LIBUNISTD_PATH}/unistd)
+               link_directories(${LIBUNISTD_PATH}/build/unistd/Release)
+               link_libraries(libunistd)
+       endif(WIN32)
+endif(UNISTD)
+
+# 1. Build pforth executable
+add_executable(pforth csrc/pf_main.c)
+target_link_libraries(pforth ${PROJECT_NAME}_lib)
+
+# 2. Build pforth.dic by compiling system.fth
+set(PFORTH_DIC "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/pforth.dic")
+add_custom_command(OUTPUT ${PFORTH_DIC}
+  COMMAND ./pforth -i system.fth
+  WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
+  DEPENDS pforth
+  COMMENT Building pforth.dic
+  VERBATIM
+  )
+add_custom_target(pforth_dic DEPENDS ${PFORTH_DIC})
+
+# 3. Create a pfdicdat.h header containing a precompiled dictionary
+#    as C source code.
+set(PFORTH_DIC_HEADER "csrc/pfdicdat.h")
+add_custom_command(OUTPUT ${PFORTH_DIC_HEADER}
+  COMMAND ./pforth mkdicdat.fth
+  COMMAND mv pfdicdat.h ../csrc/.
+  WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
+  DEPENDS pforth_dic
+  COMMENT Building pfdicdat.h
+  VERBATIM
+  )
+add_custom_target(pforth_dic_header DEPENDS ${PFORTH_DIC_HEADER})
+add_dependencies(${PROJECT_NAME}_lib_sd pforth_dic_header)
+
+# 4. Build pforth_standalone using the precompiled dictionary.
+add_executable(pforth_standalone csrc/pf_main.c)
+target_link_libraries(pforth_standalone ${PROJECT_NAME}_lib_sd)
+target_compile_definitions(pforth_standalone PRIVATE PF_STATIC_DIC)
+add_dependencies(pforth_standalone pforth_dic_header)
+
+
+