Skip to content

Commit

Permalink
Add CONFIGURE_DEPENDS flag to globs and cleanup (#5)
Browse files Browse the repository at this point in the history
* join comments

* join target properties

* add empty lines

* update readme

* add CONFIGURE_DEPENDS to glob sources

* update comment about glob

* update comment about removing unused files

* update glob comment in the main CMakeLists
  • Loading branch information
TheLartians authored Apr 14, 2020
1 parent 24aa856 commit 23abf01
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 20 deletions.
17 changes: 8 additions & 9 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ endif()

# ---- Add source files ----

# Note: globbing sources is considered bad practice as CMake won't detect new files automatically.
# Remember to always invoke cmake after changing files, or explicitly mention them here.
FILE(GLOB_RECURSE headers "${CMAKE_CURRENT_SOURCE_DIR}/include/*.h")
FILE(GLOB_RECURSE sources "${CMAKE_CURRENT_SOURCE_DIR}/source/*.cpp")
# Note: globbing sources is considered bad practice as CMake's generators may not detect new files automatically.
# Keep that in mind when changing files, or explicitly mention them here.
FILE(GLOB_RECURSE headers CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/include/*.h")
FILE(GLOB_RECURSE sources CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/source/*.cpp")

# ---- Add dependencies via CPM ----
# see https://github.com/TheLartians/CPM.cmake for more info
Expand All @@ -35,12 +35,11 @@ CPMAddPackage(

# ---- Create library ----

# Note:
# for single header libraries use `add_library(Greeter INTERFACE)` instead
add_library(Greeter ${headers} ${sources})

# Note: for single header libraries use the following instead:
# Note: for single header libraries create an interface target instead:
# add_library(Greeter INTERFACE)
# set_target_properties(Greeter PROPERTIES INTERFACE_COMPILE_FEATURES cxx_std_17)

add_library(Greeter ${headers} ${sources})
set_target_properties(Greeter PROPERTIES CXX_STANDARD 17)

# Link dependencies (if required)
Expand Down
14 changes: 7 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ This template is the result of learnings from many previous projects and should
- Add your project's codecov token to your project's github secrets under `CODECOV_TOKEN`
- Happy coding!

Remember to eventually remove any unused files, such as the standalone directory or irrelevant tests for your project.
Eventually, you can remove any unused files, such as the standalone directory or irrelevant github workflows for your project.

### Build and run the standalone target

Expand Down Expand Up @@ -81,18 +81,18 @@ See [Format.cmake](https://github.com/TheLartians/Format.cmake) for more options

Yes, however you will need to change the library type to an `INTERFACE` library as documented in the [CMakeLists.txt](CMakeLists.txt).

- You are using `GLOB` to add source files in CMakeLists.txt. Isn't that evil?
- I see you are using `GLOB` to add source files in CMakeLists.txt. Isn't that evil?

Glob is considered bad because changes to source files won't be automatically caught by CMakes builders and you will need remember to invoke CMake on any changes.
Glob is considered bad because any changes to the source file structure [might not be automatically caught](https://cmake.org/cmake/help/latest/command/file.html#filesystem) by CMake's builders and you will need to manually invoke CMake on changes.
I personally prefer the `GLOB` solution for its simplicity, but feel free to change it to explicitly listing sources.

- I'm adding external dependencies to my project using CPM. Will this force users to use CPM as well?

CPM should be mostly invisible for your library users as it's self-contained and dependency free.
CPM.cmake should be invisible for your library users as it's a self-contained CMake Script.
If problems do arise, they can always opt-out by defining `CPM_USE_LOCAL_PACKAGES`, which will override all calls to `CPMAddPackage` with `find_package`.
If you are using `CPMFindPackage` instead of `CPMAddPackage`, CPM will always try to use `find_package` to add packages.
This approach should be compatible with any common C++ package manager without any user intervention, however at the cost of reproducible builds.
For more info, see the [CPM.cmake documentation](https://github.com/TheLartians/CPM.cmake).
If you concerned about this, you should prefer using `CPMFindPackage` instead of `CPMAddPackage`, as then CPM will try to use `find_package` to add packages whenever possible.
`CPMFindPackage` approach should also be compatible with any common C++ package manager without modifications, however at the cost of reproducible builds.
For more information, see the [CPM.cmake documentation](https://github.com/TheLartians/CPM.cmake).

- Can I configure and build my project offline?

Expand Down
12 changes: 9 additions & 3 deletions standalone/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,14 @@ CPMAddPackage(

# ---- Create standalone executable ----

file(GLOB sources ${CMAKE_CURRENT_SOURCE_DIR}/source/*.cpp)
file(GLOB sources CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/source/*.cpp)

add_executable(GreeterStandalone ${sources})
set_target_properties(GreeterStandalone PROPERTIES CXX_STANDARD 17 COMPILE_FLAGS "-Wall -pedantic -Wextra")
set_target_properties(GreeterStandalone PROPERTIES OUTPUT_NAME "Greeter")

set_target_properties(GreeterStandalone PROPERTIES
CXX_STANDARD 17
COMPILE_FLAGS "-Wall -pedantic -Wextra"
OUTPUT_NAME "Greeter"
)

target_link_libraries(GreeterStandalone Greeter cxxopts)
2 changes: 1 addition & 1 deletion test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ CPMAddPackage(

# ---- Create binary ----

file(GLOB sources ${CMAKE_CURRENT_SOURCE_DIR}/source/*.cpp)
file(GLOB sources CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/source/*.cpp)
add_executable(GreeterTests ${sources})
target_link_libraries(GreeterTests doctest Greeter)

Expand Down

0 comments on commit 23abf01

Please sign in to comment.