¿Puedo pasar variables a un archivo Make de GNU como argumentos de línea de comando? En otras palabras, quiero pasar algunos argumentos que eventualmente se convertirán en variables en el Makefile.Pasar variables adicionales desde la línea de comando para hacer
Respuesta
tiene varias opciones para configurar las variables de fuera de su makefile:
De ambiente - cada variable de entorno se transforma en una variable makefile con el mismo nombre y valor.
También es posible que desee establecer
-e
opción (también conocido como--environments-override
) en adelante, y las variables de entorno va a anular las asignaciones hechas en makefile (a menos que estas asignaciones mismos utilizan eloverride
directive. Sin embargo, no es recomendable, y es mucho mejor y más flexible para utilizar?=
asignación (el operador de asignación variable de condicional, que sólo tiene un efecto si la variable aún no está definida):FOO?=default_value_if_not_set_in_environment
Nota que ciertas variables no se heredan de medio ambiente:
MAKE
se incorpora a partir del nombre del scriptSHELL
es establecido dentro de un makefile, o por defecto a/bin/sh
(razón de ser: los comandos se especifican en el archivo MAKE, y son de concha específica).
De línea de comandos-
make
pueden tener asignaciones de variables como parte de su línea de comandos, se mezclaba con los objetivos de:make target FOO=bar
Pero entonces todas las asignaciones a
FOO
variable dentro del archivo MAKE se ignorará a menos que use eloverride
directive en la asignación. (El efecto es el mismo que con la opción-e
para variables de entorno).Exportación de los padres Hacer - si se llama a hacer a partir de un Makefile, por lo general, no se debe escribir de forma explícita las asignaciones de variables como este:
# Don't do this! target: $(MAKE) -C target CC=$(CC) CFLAGS=$(CFLAGS)
En su lugar, una mejor solución podría ser la de exportar estas variables . Al exportar una variable, se convierte en el entorno de cada invocación de shell y, al hacer llamadas desde estos comandos, se eligen estas variables de entorno tal como se especificó anteriormente.
# Do like this CFLAGS=-g export CFLAGS target: $(MAKE) -C target
También puede exportar todos variables usando
export
sin argumentos.
La forma más sencilla es:
make foo=bar target
Luego, en su makefile puede hacer referencia a $(foo)
. Tenga en cuenta que esto no se propagará a sub-marcas automáticamente.
Si está utilizando sub-marcas, vea este artículo: Communicating Variables to a Sub-make
por sub-marcas te refieres a los makefiles 'included' en el archivo make principal? – Pablo
@Michael: Significa llamar nuevamente desde dentro del archivo MAKEEL. He actualizado mi respuesta ya que pareces estar interesado en este detalle. –
Desde el manual:
Las variables en la marca pueden venir de el entorno en el que se ejecuta make. Cada variable de entorno que ve cuando se inicia se transforma en una variable make con el mismo nombre y valor. Sin embargo, una asignación explícita en el archivo MAKE, o con un argumento de comando, anula el entorno.
para que pueda hacer (de golpe):
FOOBAR=1 make
lo que resulta en una variable FOOBAR
en su Makefile.
Si comete un fichero llamado Makefile y agrega una variable como esta $ (unittest) entonces usted será capaz de utilizar esta variable dentro del Makefile incluso con comodines
ejemplo:
make unittest=*
utilizo BOOST_TEST y dando un comodín en el parámetro --run_test = $ (unittest) entonces será capaz de utilizar expresiones regulares para filtrar la prueba Quiero que mi Makefile para funcionar
Hay otra opción no citada aquí que está incluida en el libro Make de GNU de Stallman y McGrath (ver http://www.chemie.fu-berlin.de/chemnet/use/info/make/make_7.html). Proporciona el ejemplo:
archive.a: ...
ifneq (,$(findstring t,$(MAKEFLAGS)))
+touch archive.a
+ranlib -t archive.a
else
ranlib archive.a
endif
Se trata de verificar si un parámetro dado aparece en MAKEFLAGS
. Por ejemplo ... suponga que está estudiando hilos en C++ 11 y ha dividido su estudio en varios archivos (class01
, ..., classNM
) y desea: compilar todos y ejecutar de forma individual o compilar uno a la vez y ejecútelo si se especifica una bandera (-r
, por ejemplo).Por lo tanto, se podría llegar a la siguiente Makefile
:
CXX=clang++-3.5
CXXFLAGS = -Wall -Werror -std=c++11
LDLIBS = -lpthread
SOURCES = class01 class02 class03
%: %.cxx
$(CXX) $(CXXFLAGS) -o [email protected] $^ $(LDLIBS)
ifneq (,$(findstring r, $(MAKEFLAGS)))
./[email protected]
endif
all: $(SOURCES)
.PHONY: clean
clean:
find . -name "*.out" -delete
Tener esto, puede que:
- generar y ejecutar un archivo w/
make -r class02
; - construir todo w/
make
omake all
; - generar y ejecutar todos los w/
make -r
(supongamos que todos ellos contienen algo de cierto tipo de cosas valer y lo que desea es probarlos todos)
export ROOT_DIR=<path/value>
A continuación, utilice la variable, $(ROOT_DIR)
en el Makefile .
- 1. ¿Cómo pasar variables adicionales al formateador jqGrid?
- 2. jQuery Autocompletar utilizando extraParams para pasar variables GET adicionales
- 3. instrucción sqlplus desde la línea de comando
- 4. Entrada desde la línea de comando
- 5. Mover archivos desde la línea de comando
- 6. Pasar variables al script de Ruby a través de la línea de comando
- 7. No se puede ejecutar git desde la línea de comando
- 8. Uso de argumentos de línea de comando adicionales con gunicorn
- 9. Pasar variables de línea de comando a Windows Installer basado en WiXx MSI
- 10. Pasar datos adicionales a EditorTemplate
- 11. Pasar variable al script php que se ejecuta desde la línea de comando
- 12. MSBuild - Obteniendo el destino llamado desde la línea de comando
- 13. Adjuntar a GNU hacer variables a través de la línea de comando
- 14. ¿Perforce la resolución automática desde la línea de comando?
- 15. iniciando Python IDLE desde la línea de comando para editar scripts
- 16. Cómo sincronizar el directorio FTP desde la línea de comando?
- 17. ejecutar la aplicación de línea de comando interactiva desde java
- 18. j_security_check - ¿se pueden pasar parámetros adicionales para envíos de formularios?
- 19. ¿Cómo usar GIT PULL desde la línea de comando?
- 20. ¿Es posible publicar un FLA desde la línea de comando?
- 21. Ejecutar comando de línea de comando desde NSIS
- 22. Ejecutar el comando vim desde la línea de comandos
- 23. cómo publicar una solicitud HTTP desde la línea de comando
- 24. ¿Hay un módulo para obtener la entrada del usuario desde la línea de comando en node.js?
- 25. svn + ssh sin contraseña desde la línea de comando?
- 26. ¿Cómo ejecuto Scala + specs2 desde la línea de comando?
- 27. ¿Cómo hacer que eclipse lance un programa en el eclipse workbench desde la línea de comando?
- 28. Cambiar perfil de terminal GNOME desde la línea de comando
- 29. no se puede ejecutar swing desde la línea de comando
- 30. Enviar correo electrónico desde la línea de comando en symfony2
para pasar de la línea de comando algo con espacios '' make A = '"como df"' '' –
Parece que estás buscando problemas si te preocupan las variables de entorno. Por un lado, es una pesadilla de depuración si funciona en el lugar A y no en el lugar B, simplemente porque tienen entornos diferentes. –
En realidad se deletrea --ambientment-overrides – user7610