Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 11 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,23 @@
cmake-d
=======

CMake for D2
CMake for D2 *improved*

Usage
-----

1. Download and extract https://github.com/dcarp/cmake-d/archive/master.zip to a local directory \<local-dir\>
1. Download and extract https://github.com/dcarp/cmake-d/archive/master.zip to a local directory \<local-dir\> (you can use a git submodule if you want)
2. Create a D CMake Project: project(project-name D)
3. Run cmake as usual specifing the cmake-d path. To cache it, don't forget to specify the *:PATH* variable type.<br/>
```
cmake -DCMAKE_MODULE_PATH:PATH=<local-dir>/cmake-d <path-to-source>
```

*Tip: you can add before declaring the project `set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake-d/cmake-d)` (the path to the folder with all cmake files) in order to use the normal CMake command.*

Known issues
------------

This project is just a set of CMake files. It cannot do as much as a CMake binary patch. By example, regeneration of file acording a dependency file is hard coded in the Makefile backend; so when you edit a file and rebuild with this backend, it will build only the file you edited, leading to some deeper issues.

*Workaround:* use Ninja backend.
19 changes: 18 additions & 1 deletion cmake-d/CMakeDInformation.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ endif()

# if no high specificity file was included, then try a more general one
if(NOT _INCLUDED_FILE)
include(Platform/${CMAKE_SYSTEM_NAME}-${CMAKE_BASE_NAME}
include(Platform/${CMAKE_SYSTEM_NAME}-${CMAKE_D_COMPILER_ID}
OPTIONAL RESULT_VARIABLE _INCLUDED_FILE)
endif()

Expand Down Expand Up @@ -260,6 +260,7 @@ set(CMAKE_D_ARCHIVE_CREATE "<CMAKE_AR> cr <TARGET> <LINK_FLAGS> <OBJECTS>")
set(CMAKE_D_ARCHIVE_APPEND "<CMAKE_AR> r <TARGET> <LINK_FLAGS> <OBJECTS>")
set(CMAKE_D_ARCHIVE_FINISH "<CMAKE_RANLIB> <TARGET>")


# compile a D file into an object file
if(NOT CMAKE_D_COMPILE_OBJECT)
if(CMAKE_VERSION VERSION_LESS 3.4.0)
Expand All @@ -284,3 +285,19 @@ mark_as_advanced(
CMAKE_D_FLAGS_RELWITHDEBINFO)

set(CMAKE_D_INFORMATION_LOADED 1)

function(target_compile_versions target)
cmake_parse_arguments(CMAKE_D_COMPILE_VERSIONS "" "" "PUBLIC;PRIVATE;INTERFACE" ${ARGN})
list(TRANSFORM CMAKE_D_COMPILE_VERSIONS_PUBLIC PREPEND "${CMAKE_D_VERSION_FLAG}")
list(TRANSFORM CMAKE_D_COMPILE_VERSIONS_PRIVATE PREPEND "${CMAKE_D_VERSION_FLAG}")
list(TRANSFORM CMAKE_D_COMPILE_VERSIONS_INTERFACE PREPEND "${CMAKE_D_VERSION_FLAG}")
if (CMAKE_D_COMPILE_VERSIONS_PUBLIC)
target_compile_options(${target} PUBLIC "$<$<COMPILE_LANGUAGE:D>:${CMAKE_D_COMPILE_VERSIONS_PUBLIC}>")
endif()
if (CMAKE_D_COMPILE_VERSIONS_PRIVATE)
target_compile_options(${target} PRIVATE "$<$<COMPILE_LANGUAGE:D>:${CMAKE_D_COMPILE_VERSIONS_PRIVATE}>")
endif()
if (CMAKE_D_COMPILE_VERSIONS_INTERFACE)
target_compile_options(${target} INTERFACE "$<$<COMPILE_LANGUAGE:D>:${CMAKE_D_COMPILE_VERSIONS_INTERFACE}>")
endif()
endfunction()
4 changes: 2 additions & 2 deletions cmake-d/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
#
# See LICENSE for details.
#
cmake_minimum_required(VERSION 2.8.1)
cmake_minimum_required(VERSION 3.20)
project(cmake-d NONE)

set(MOD_SRCS
Expand All @@ -21,7 +21,7 @@ set(MOD_SRCS
CMakeDetermineDCompiler.cmake
FindGDCPath.cmake
UseDDoc.cmake
UseDDeps.cmake
UseDDepsMakeWIP.cmake
UseDub.cmake
dependencies.cmake
UseDUnittest.cmake
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ set(CMAKE_BASE_NAME dmd)
set(CMAKE_STATIC_LIBRARY_CREATE_D_FLAGS "-lib")

set(CMAKE_SHARED_LIBRARY_D_FLAGS "") # -pic
set(CMAKE_SHARED_LIBRARY_CREATE_D_FLAGS "-shared -defaultlib=libphobos2.so") # -shared
set(CMAKE_SHARED_LIBRARY_CREATE_D_FLAGS "-shared") # -shared
set(CMAKE_SHARED_LIBRARY_LINK_D_FLAGS "") # +s, flag for exe link to use shared lib
set(CMAKE_SHARED_LIBRARY_RUNTIME_D_FLAG "") # -rpath
set(CMAKE_SHARED_LIBRARY_RUNTIME_D_FLAG_SEP "") # : or empty
Expand Down Expand Up @@ -65,3 +65,6 @@ set(CMAKE_D_FLAGS_RELWITHDEBINFO_INIT "-O -g -L-export_dynamic ${DDOC_FLAGS}")
# set(CMAKE_D_CREATE_PREPROCESSED_SOURCE "<CMAKE_D_COMPILER> <FLAGS> -E <SOURCE> > <PREPROCESSED_SOURCE>")
set(CMAKE_D_CREATE_ASSEMBLY_SOURCE "<CMAKE_D_COMPILER> <FLAGS> -S <SOURCE> -of<ASSEMBLY_SOURCE>")
# set(CMAKE_INCLUDE_SYSTEM_FLAG_D "-isystem ")
set(CMAKE_D_VERSION_FLAG "-version=")
set(CMAKE_DEPFILE_FLAGS_D "-makedeps=<DEP_FILE>")
set(CMAKE_LINKER_FLAG_PREFIX "-L=")
Original file line number Diff line number Diff line change
Expand Up @@ -54,10 +54,13 @@ set(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".a")
set(CMAKE_D_FLAGS_INIT "")
# DMD can only produce 32-bit binaries for now
set(CMAKE_D_LINK_FLAGS "")
set(CMAKE_D_FLAGS_DEBUG_INIT "-g -d-debug -L-export_dynamic ${DDOC_FLAGS}")
set(CMAKE_D_FLAGS_DEBUG_INIT "-g --d-debug -L-export_dynamic ${DDOC_FLAGS}")
set(CMAKE_D_FLAGS_MINSIZEREL_INIT "-Os ${DDOC_FLAGS}")
set(CMAKE_D_FLAGS_RELEASE_INIT "-O -release ${DDOC_FLAGS}")
set(CMAKE_D_FLAGS_RELWITHDEBINFO_INIT "-O -g -L-export_dynamic ${DDOC_FLAGS}")
# set(CMAKE_D_CREATE_PREPROCESSED_SOURCE "<CMAKE_D_COMPILER> <FLAGS> -E <SOURCE> > <PREPROCESSED_SOURCE>")
set(CMAKE_D_CREATE_ASSEMBLY_SOURCE "<CMAKE_D_COMPILER> <FLAGS> -S <SOURCE> -of<ASSEMBLY_SOURCE>")
# set(CMAKE_INCLUDE_SYSTEM_FLAG_D "-isystem ")
set(CMAKE_D_VERSION_FLAG "--d-version=")
set(CMAKE_DEPFILE_FLAGS_D "-makedeps=<DEP_FILE>")
set(CMAKE_LINKER_FLAG_PREFIX "-L=")
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ set(CMAKE_BASE_NAME dmd)
set(CMAKE_STATIC_LIBRARY_CREATE_D_FLAGS "-lib")

set(CMAKE_SHARED_LIBRARY_D_FLAGS "") # -pic
set(CMAKE_SHARED_LIBRARY_CREATE_D_FLAGS "-shared -defaultlib=libphobos2.so") # -shared
set(CMAKE_SHARED_LIBRARY_CREATE_D_FLAGS "-shared") # -shared
set(CMAKE_SHARED_LIBRARY_LINK_D_FLAGS "") # +s, flag for exe link to use shared lib
set(CMAKE_SHARED_LIBRARY_RUNTIME_D_FLAG "") # -rpath
set(CMAKE_SHARED_LIBRARY_RUNTIME_D_FLAG_SEP "") # : or empty
Expand Down Expand Up @@ -65,3 +65,6 @@ set(CMAKE_D_FLAGS_RELWITHDEBINFO_INIT "-O -g -L--export-dynamic ${DDOC_FLAGS}")
# set(CMAKE_D_CREATE_PREPROCESSED_SOURCE "<CMAKE_D_COMPILER> <FLAGS> -E <SOURCE> > <PREPROCESSED_SOURCE>")
set(CMAKE_D_CREATE_ASSEMBLY_SOURCE "<CMAKE_D_COMPILER> <FLAGS> -S <SOURCE> -of<ASSEMBLY_SOURCE>")
# set(CMAKE_INCLUDE_SYSTEM_FLAG_D "-isystem ")
set(CMAKE_D_VERSION_FLAG "-version=")
set(CMAKE_DEPFILE_FLAGS_D "-makedeps=<DEP_FILE>")
set(CMAKE_LINKER_FLAG_PREFIX "-L=")
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
# See http://www.cmake.org/HTML/Copyright.html for details
#

set(CMAKE_D_OUTPUT_EXTENSION .o)
set(CMAKE_D_DASH_O "-o")
set(CMAKE_BASE_NAME gdc)

Expand All @@ -28,14 +29,36 @@ if(CMAKE_D_BUILD_DOCS)
endforeach()
endif()

set(CMAKE_SHARED_LIBRARY_D_FLAGS "-fPIC") # -pic
set(CMAKE_SHARED_LIBRARY_CREATE_D_FLAGS "-shared") # -shared
set(CMAKE_SHARED_LIBRARY_LINK_D_FLAGS "") # +s, flag for exe link to use shared lib
set(CMAKE_SHARED_LIBRARY_RUNTIME_D_FLAG "") # -rpath
set(CMAKE_SHARED_LIBRARY_RUNTIME_D_FLAG_SEP "") # : or empty
set(CMAKE_INCLUDE_FLAG_D "-I") # -I
set(CMAKE_INCLUDE_FLAG_D_SEP "") # , or empty
set(CMAKE_LIBRARY_PATH_FLAG "-L")
set(CMAKE_LIBRARY_PATH_TERMINATOR "") # for the Digital Mars D compiler the link paths have to be terminated with a "/"
set(CMAKE_LINK_LIBRARY_FLAG "-l")

set(CMAKE_LINK_LIBRARY_SUFFIX "")
set(CMAKE_STATIC_LIBRARY_PREFIX "lib")
set(CMAKE_STATIC_LIBRARY_SUFFIX ".a")
set(CMAKE_SHARED_LIBRARY_PREFIX "lib") # lib
set(CMAKE_SHARED_LIBRARY_SUFFIX ".so") # .so
set(CMAKE_EXECUTABLE_SUFFIX "") # .exe
set(CMAKE_DL_LIBS "dl")

# SET(CMAKE_D_FLAGS_INIT "-fversion=Posix -fversion=${CMAKE_BUILD_TYPE}Build ${DSTDLIB_FLAGS}")
set(CMAKE_D_FLAGS_INIT "")
set(CMAKE_D_FLAGS_INIT "-fall-instantiations ")
set(CMAKE_D_FLAGS_DEBUG_INIT "-g ${DDOC_FLAGS}")
set(CMAKE_D_FLAGS_MINSIZEREL_INIT "-Os ${DDOC_FLAGS}")
set(CMAKE_D_FLAGS_RELEASE_INIT "-O3 -fomit-frame-pointer -fweb -frelease -finline-functions ${DDOC_FLAGS}")
set(CMAKE_D_FLAGS_RELWITHDEBINFO_INIT "-O2 -g ${DDOC_FLAGS}")
# set(CMAKE_D_CREATE_PREPROCESSED_SOURCE "<CMAKE_D_COMPILER> <FLAGS> -E <SOURCE> > <PREPROCESSED_SOURCE>")
set(CMAKE_D_CREATE_ASSEMBLY_SOURCE "<CMAKE_D_COMPILER> <FLAGS> -S <SOURCE> -o <ASSEMBLY_SOURCE>")
# set(CMAKE_INCLUDE_SYSTEM_FLAG_D "-isystem ")
set(CMAKE_LINKER_FLAG_PREFIX "-Wl,")

set(CMAKE_INCLUDE_FLAG_D "-I") # -I
set(CMAKE_D_VERSION_FLAG "-fversion=")
set(CMAKE_DEPFILE_FLAGS_D "-MD -MT <DEP_TARGET> -MF <DEP_FILE>")
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ set(CMAKE_BASE_NAME ldc2)
set(CMAKE_STATIC_LIBRARY_CREATE_D_FLAGS "-lib")

set(CMAKE_SHARED_LIBRARY_D_FLAGS "") # -pic
set(CMAKE_SHARED_LIBRARY_CREATE_D_FLAGS "-shared") # -shared
set(CMAKE_SHARED_LIBRARY_CREATE_D_FLAGS "-shared -link-defaultlib-shared=false") # -shared
set(CMAKE_SHARED_LIBRARY_LINK_D_FLAGS "") # +s, flag for exe link to use shared lib
set(CMAKE_SHARED_LIBRARY_RUNTIME_D_FLAG "") # -rpath
set(CMAKE_SHARED_LIBRARY_RUNTIME_D_FLAG_SEP "") # : or empty
Expand All @@ -54,10 +54,13 @@ set(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".a")
set(CMAKE_D_FLAGS_INIT "")
# DMD can only produce 32-bit binaries for now
set(CMAKE_D_LINK_FLAGS "")
set(CMAKE_D_FLAGS_DEBUG_INIT "-g -d-debug -L--export-dynamic ${DDOC_FLAGS}")
set(CMAKE_D_FLAGS_DEBUG_INIT "-g --d-debug -L--export-dynamic ${DDOC_FLAGS}")
set(CMAKE_D_FLAGS_MINSIZEREL_INIT "-Os ${DDOC_FLAGS}")
set(CMAKE_D_FLAGS_RELEASE_INIT "-O -release ${DDOC_FLAGS}")
set(CMAKE_D_FLAGS_RELWITHDEBINFO_INIT "-O -g -L--export-dynamic ${DDOC_FLAGS}")
# set(CMAKE_D_CREATE_PREPROCESSED_SOURCE "<CMAKE_D_COMPILER> <FLAGS> -E <SOURCE> > <PREPROCESSED_SOURCE>")
set(CMAKE_D_CREATE_ASSEMBLY_SOURCE "<CMAKE_D_COMPILER> <FLAGS> -S <SOURCE> -of<ASSEMBLY_SOURCE>")
# set(CMAKE_INCLUDE_SYSTEM_FLAG_D "-isystem ")
set(CMAKE_D_VERSION_FLAG "--d-version=")
set(CMAKE_DEPFILE_FLAGS_D "-makedeps=<DEP_FILE>")
set(CMAKE_LINKER_FLAG_PREFIX "-L=")
Original file line number Diff line number Diff line change
Expand Up @@ -54,3 +54,6 @@ set(CMAKE_D_FLAGS_DEBUG_INIT "-g -debug ${DDOC_FLAGS}")
set(CMAKE_D_FLAGS_RELEASE_INIT "-O -release -inline ${DDOC_FLAGS}")
set(CMAKE_D_FLAGS_RELWITHDEBINFO_INIT "-O -g ${DDOC_FLAGS}")
set(CMAKE_D_CREATE_ASSEMBLY_SOURCE "<CMAKE_D_COMPILER> <FLAGS> -S <SOURCE> -of<ASSEMBLY_SOURCE>")
set(CMAKE_D_VERSION_FLAG "-version=")
set(CMAKE_DEPFILE_FLAGS_D "-makedeps=<DEP_FILE>")
set(CMAKE_LINKER_FLAG_PREFIX "-L=")
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,6 @@ set(CMAKE_D_FLAGS_RELWITHDEBINFO_INIT "-O2 -g ${DDOC_FLAGS}")
# set(CMAKE_D_CREATE_PREPROCESSED_SOURCE "<CMAKE_D_COMPILER> <FLAGS> -E <SOURCE> > <PREPROCESSED_SOURCE>")
set(CMAKE_D_CREATE_ASSEMBLY_SOURCE "<CMAKE_D_COMPILER> <FLAGS> -S <SOURCE> -o <ASSEMBLY_SOURCE>")
# set(CMAKE_INCLUDE_SYSTEM_FLAG_D "-isystem ")
set(CMAKE_D_VERSION_FLAG "-fversion=")
set(CMAKE_DEPFILE_FLAGS_D "-MD -MT <DEP_TARGET> -MF <DEP_FILE>")
set(CMAKE_LINKER_FLAG_PREFIX "-Wl,")
63 changes: 0 additions & 63 deletions cmake-d/UseDDeps.cmake

This file was deleted.

48 changes: 48 additions & 0 deletions cmake-d/UseDDepsMakeWIP.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
set(cmake_d_dir ${CMAKE_CURRENT_LIST_DIR})

function(depfile_from_file depfile file)
file(RELATIVE_PATH file "${CMAKE_CURRENT_SOURCE_DIR}" "${full_file}")
set(source_file "${CMAKE_CURRENT_SOURCE_DIR}/${file}")
set(deps_dir "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/UseDDeps/")
set(${depfile} "${deps_dir}${file}.dep" PARENT_SCOPE)
endfunction()

function(resolve_dependencies target)
get_target_property(d_source_files ${target} SOURCES)

# extract D source files from arguments
#message("D files in arguments: ${d_source_files}")

foreach(full_file IN LISTS d_source_files)
set(CMAKE_DEPENDS_USE_COMPILER true)
depfile_from_file(dependency_file ${full_file})
message("${dependency_file}")

string(REPLACE "<DEPFILE>" "${dependency_file}" depflag "${CMAKE_DEPFILE_FLAGS_D}")
# add_custom_command(DEPFILE "${dependency_file}" OUTPUT "${dependency_file}" DEPENDS "")
# set_source_files_properties("${full_file}" PROPERTIES OBJECT_DEPENDS "${dependency_file}")
endforeach()
endfunction()


macro(add_executable_with_dependencies _target)
# extract D source files from arguments
foreach(file ${ARGV})
if(${file} MATCHES "\\.d$")
list(APPEND d_source_files ${file})
endif()
endforeach()

#message("D files in arguments: ${d_source_files}")

foreach(file IN LISTS d_source_files)
file(RELATIVE_PATH file "${CMAKE_CURRENT_SOURCE_DIR}" "${full_file}")
set(source_file "${CMAKE_CURRENT_SOURCE_DIR}/${file}")
set(deps_dir "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/UseDDeps/")
set(dependency_file "${deps_dir}${file}.dep")
get_filename_component(deps_source_dir "${dependency_file}" DIRECTORY)
set("${CMAKE_D_COMPILER} -o- -M")
endforeach()

add_executable(${ARGV} ${dependency_files})
endmacro()
Loading